一台中转机ssh登录服务器(Linux)的时候,很慢,大概要15秒左右,但是ping很快,而且登录后服务器的负载也很低。解决方法记录在这里:

在目标服务器上有一个文件/etc/nsswitch.conf ,里面有如下一行

hosts: files dns

这行的含义是对于访问的主机进行域名解析的顺序,是先访问file,也就是/etc/hosts文件,如果hosts中没有记录域名,则访问dns,进行域名解析,如果dns也无法访问,就会等待访问超时后返回,因此等待时间比较长。

那如果将这一行屏蔽掉是不是也可以达到同样的效果呢?应该是可以的,但是如果本机要通过域名访问其他服务器,则肯定无法访问,因此这行应该需要保留。这个问题也提示我们,dns如果不可用,会带来的一些副作用的。

相信很多朋友在使用Linux系统的时候因为安全性的原因摒弃了telnet rlogin 或者 X-window,而把openssh作为自己默认的远程登录方式。然而经常会遇到的一个情况是telnet到server速度很快,但是ssh连接的时候却很慢,大概要等半分钟甚至更久。ping的速度也非常好,让人误以为是ssh连接不上。下面说下如何解决这样的问题,最为常见的原因是因为server的sshd会去DNS查找访问client IP的hostname,如果DNS不可用或者没有相关记录,就会耗费大量时间。

1, 在server上/etc/hosts文件中把你本机的ip和hostname加入

2, 在server上/etc/ssh/sshd_config文件中修改或加入UseDNS=no

3, 注释掉server上/etc/resolv.conf中所有行

4, 修改server上/etc/nsswitch.conf中hosts为hosts: files

5, reboot server使配置生效

另外在

authentication gssapi-with-mic

也有可能出现问题,在server上/etc/ssh/sshd_config文件中修改

GSSAPIAuthentication no

/etc/init.d/sshd restart重启sshd进程使配置生效。


根据我的使用结果

  1. /etc/resolv.conf的所有行不一定需要全部注释掉,改换成访问快捷的IP似乎也可行。
  2. 如果2、3、4这三步都做了,在我的机器上,重新连接SSH就有效果了不用重启机器。
  3. 第一步一般/etc/hosts里都会有127.0.0.1   localhost这样一行,如果有,根据我的经验,似乎不加也可以。

作者 龙飞