Linux ssh登陆慢的两种原因分析

如果做运维就一定会遇到ssh登陆Linux服务器慢的问题,问题比较好解决,一般Google之后有很多文章都告诉你解决方法,但是很少有文章分析为什么会慢,这篇文章简单分析下ssh登陆慢的原因。

useDNS配置导致登陆慢

如果ssh server的配置文件(通常是 /etc/ssh/sshd_config )中设置 useDNS yes ,可能会导致 ssh 登陆卡住几十秒。按照网上的方法将该配置项设为 no,然后重启 ssh 服务,再次登陆就恢复正常,但至于为什么改配置项会导致登陆慢,下面的例子是从虚拟机192.168.0.64 ssh登陆192.168.0.188,在 188 用 tcpdump 进行抓包,如下图:

从图中可以看出在登陆的过程中服务端188发了四次反向域名解析的请求,每次请求相隔5s,共20s,反映在登陆过程中就是卡了几十秒。域名解析是根据域名查找所对应IP的过程,反过来, 反向域名解析就是根据IP查找域名的过程,从抓包的图中看出ssh服务端(192.168.0.188)向DNS服务器(10.0.0.10/10.0.0.11)发起反向域名解析的请求,请求解析客户端IP(192.168.0.64)的域名。由于DNS服务器配置(该配置位于 /etc/resolv.conf )的不正确,导致发出的请求未有响应,每隔5s超时重试一次。

ssh中该配置主要用于安全加固,服务器会先根据客户端的IP地址进行DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正向A记录查询,并验证是否与原始IP地址一致,通过此种措施来防止客户端欺骗。但平时我们登陆服务器的客户端IP基本在DNS服务器中没有PTR记录,因此该功能显得很无用,推荐直接设为no,当然如果你理解了上述的过程,也能找到其他方法保证即使该配置打开了也不慢:

  • 在配置文件 /etc/ssh/sshd_config 中设置一个可达的DNS服务器
  • 在 /etc/hosts 文件中手动添加一条你登陆客户端与主机名的对应关系

GSSAPIAuthentication配置导致登陆慢

除了常见的useDNS配置可能导致ssh登陆慢之外,还有一个配置GSSAPIAuthentication也会导致登陆慢,该配置项的含义是允许GSSAPI认证,属于ssh协议的一种认证方式。ssh协议有多种认证方式,平时常用的有密码认证、公钥认证等,但ssh协议支持的远不止这两种,那么至于一次ssh登陆到底用哪种认证方式是怎么决定的呢?这个取决于ssh的客户端和服务端的协商的结果,ssh服务端决定了支持哪些登陆方式,这里以OpenSSH的服务端配置( /etc/ssh/sshd_config )为例:

ssh客户端决定了使用哪种登陆方式,这里以OpenSSH的客户端配置( /etc/ssh/ssh_config )为例:

在登陆过程中经常协商之后有个认证的顺序,然后依次选择认证方式,直到认证成功,ssh命令行中可以通过增加 -vvv 选项来进行debug整个登陆的过程,如下为节选的登陆过程日志,可以看出会逐个尝试不同方式去认证:

我们不需要关心GSSAPI认证到底是什么鬼,只需关心为什么允许了GSSAPI认证就会导致ssh登陆慢呢?直接看debug信息很难看出来,还是通过抓包来看。下面例子是通过虚拟机192.168.0.214 ssh登陆192.168.0.188,这次我们在ssh的客户端进行抓包:

同样也发现有大量的DNS反向域名解析的报文,但这次需要解析的是服务端的IP(192.168.0.188),同样由于客户端侧配置的DNS服务器(10.8.8.8)不可达,导致超时重试多次。结合ssh登陆的过程日志,不难发现这写DNS反向域名解析的报文是GSSAPI认证需要的。

那么解决该问题就比较简单了,下面任何一种都可:

  • ssh 客户端配置( /etc/ssh/ssh_config )将 GSSAPIAuthentication 设为 no
  • ssh 服务端配置( /etc/ssh/sshd_config )将 GSSAPIAuthentication 设为 no
  • ssh 客户端正确配置 DNS 服务器( /etc/resolv.conf 
  • ssh 客户端 hosts 文件( /etc/hosts )增加服务端的IP、主机名对应关系

总结

本文分析了ssh的两个配置可能导致登陆慢的原因以及解决方法,主要想说的是通过抓包可以很容易分析登陆慢的原因。

Linux ssh登陆慢的两种原因分析的更多相关文章

  1. Linux中ssh登陆慢的两种原因

    useDNS配置导致登陆慢 如果ssh server的配置文件(通常是 /etc/ssh/sshd_config )中设置 useDNS yes ,可能会导致 ssh 登陆卡住几十秒.将该配置项设为 ...

  2. linux忘记登陆密码的两种破解办法

    对于使用grub引导的linux系统.在开机自检后,出现grub引导界面时,按E键进入编辑模式,如下图所示:   把光标移到带有“kernel”字样的那一行,然后按E键编辑,如图:   在末尾按一个空 ...

  3. linux下登陆MongoDB的两种方式

    第一种:不带auth认证的 第二种:需要带auth认证的(即需要用户名和密码的) 当指定用户名和密码在查看数据,发现就可以看得到了 查看文章:开启MongoDB客户端访问控制

  4. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  5. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  6. 20155212 C语言实现linux下pwd命令的两种方法

    20155212 C语言实现linux下pwd命令的两种方法 学习pwd命令 通过man pwd命令查看 pwd [OPTION],一般不加参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 ...

  7. linux安装mysql服务分两种安装方法:

    linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...

  8. java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,

    java.net.MalformedURLException: unknown protocol: c这个错一般有两种原因导致:1.URL协议.格式或者路径错误, 好好检查下你程序中的代码如果是路径问 ...

  9. Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件

    Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存:free -m , -m是显示单位为MB,-g单位GB 创建一个文件:touch /root/swapfi ...

随机推荐

  1. 设计模式之行为类模式PK

    行为类模式包括: 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注 ...

  2. 自动获取windows或者linux系统IP

    1.获取Windows下的IP java.net.InetAddress.getLocalHost().getHostAddress(); 2.获取linux下的IP /** * 获取Linux下的I ...

  3. 20190429 - 如何访问 macOS 的 httpd、mysql 等服务

    问题:在局域网,通过其它机器访问 macOS 上的服务时,提示拒绝. 解决:将 macOS 防火墙 80.3306 端口打开. macOS 内置防火墙,也许开启了防火墙.Icefloor 是一个老牌的 ...

  4. eclipse代码提示设置过常用字符还是不起作用的解决方法

    问题:重装eclipse之后发现没有了代码提示,一般情况下在设置中添加自动提示的字符之后就可以了,设置如下 如上图,初始的时候是只有一个点号,并没有字符,输入26个字母的大小写后点击Apply and ...

  5. CYQ.Data 支持分布式数据库(主从备)高可用及负载调试

    前言: 继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试 本篇介绍 CYQ.Data 在对数据库层面 ...

  6. FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度

    FFmpeg对音频.视频播放速度的调整的原理不一样.下面简单的说一下各自的原理及实现方式: 一.调整视频速率 调整视频速率的原理为:修改视频的pts,dts 实现: ffmpeg -i input.m ...

  7. Java EE中的容器和注入分析,历史与未来

    Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...

  8. AI - TensorFlow - 示例02:影评文本分类

    影评文本分类 文本分类(Text classification):https://www.tensorflow.org/tutorials/keras/basic_text_classificatio ...

  9. CAS、原子操作类的应用与浅析及Java8对其的优化

    前几天刷朋友圈的时候,看到一段话:如果现在我是傻逼,那么我现在不管怎么努力,也还是傻逼,因为我现在的傻逼是由以前决定的,现在努力,是为了让以后的自己不再傻逼.话糙理不糙,如果妄想现在努力一下,马上就不 ...

  10. 剑指Spring源码(二)

    这是春节后的第一篇博客,我在构思这篇博客的时候,一度想放弃,想想要不要换个东西写,因为毕竟个人水平有限,Spring源码实在博大精深,不是我这个菜的抠脚的菜鸡可以驾驭的,怕误人子弟,还有就是源码分析类 ...