问题描述
最近使用ssh时出现登录非常缓慢的状态,登录一般需要花费20秒以上才能正常登陆,
Connecting to *****:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
等待十秒钟后,提示登录成功
Last login: Mon Jun 3 13:19:59 2013 from ****
DNS 请求交互过程如下:
如上图所示,客户端访问 DNS 服务器工作流程如下:
1)主机从一个随机的源端口,请求 DNS 的 A 记录;
2)主机从同一个源端口,请求 DNS 的 AAAA 记录;
3)主机接受 dns 服务器返回 A 记录;
4)主机接受 dns 服务器返回 AAAA 记录。
上面的 3、4 并没有严格的先后顺序,实际顺序受网络和服务器环境影响。
理论上这种工作机制,效率更高,端口复用度更高。DNS 解析器对于 ipv4 和 ipv6都使用同一个 socket 连接响应,在收到应答也会按照发送的顺序对应答进行匹配,结合抓包看,卡顿时是系统先收到了 AAAA 记录,然后才收到了 A 记录,由于和程序预期不一致,从安全等各方面考虑,此时 socket 将一直处于“等待”模式,等待配置的超时时间后继续下一轮请求探测,从而出现了之前的 5S 卡顿。
解决方案
会出现这种问题是因为ssh默认有一个配置项
UseDNS(文档中解释此配置项的意思为:UseDNS Specifies whether sshd should look up the remote host name and check that the resolved host name for the remote IP address maps back to the very same IP )address. The default is “yes”.
此时查看/etc/ssh/sshd_config
1、当此项配置不开启时默认值为UseDNS yes,这样会导致ssh在有连接过来的时候进行dns解析,所以会产生较长时间的停顿,所以要解决此问题可以将此配置项打开,然后值改为no
2、重启SSH服务