有个客户反映,他们运维连服务器 SSH 特别慢:输完 ssh 命令,要等差不多半分钟才出 password 提示,但连上之后操作一切正常,一点不卡。

我第一反应是网络问题。客户服务器在我们机房,他们办公室在另一个城市,跨运营商访问,慢点也正常。就让客户测了下 ping,延迟 40ms 左右,丢包 0,网络看着没问题。

那会不会是服务器负载高?上去看,load 0.2,空闲得很。内存也够。iptables 规则?也没看到有影响 SSH 的。

排查卡住了,我甚至怀疑是 DNS——结果还真是 DNS。

事情是这样的:sshd 收到连接后,默认会做一次反向 DNS 解析(UseDNS 默认是 yes),把客户端的 IP 反查成域名。如果这台服务器的 DNS 配置有问题,或者上游 DNS 响应慢,这个反查就会卡住,一直等到超时,然后才继续往下走,显示密码提示。

客户那台服务器 /etc/resolv.conf 里配的 DNS 是 114.114.114.114,按理说不慢。但问题在于:sshd 反查的是客户端的 IP,那个 IP 的反向解析记录不在 114 上——114 收到反查请求,再往上抛,中间某一级超时了,整个解析就卡住,直到 sshd 的超时时间到。

验证方法很简单:ssh 的时候加 -v,会看到 "Trying to reverse map address" 然后卡住,过一会儿才继续。或者直接改 sshd_config 里 UseDNS no,重启 sshd,立马就好了。

我改了配置,重启 sshd,再让客户试,果然秒连。客户说"神了",我说不是神,是 sshd 默认配置太坑——生产服务器上 UseDNS 基本都应该关掉,省得每次登录都等反查超时。

事后我检查了下,不止这一台,客户另外两台服务器也有同样的配置,一起改了。

这个坑排查起来不算难,但浪费时间。记一笔:SSH 慢、登录卡,先加 -v 看是不是卡在 reverse map,是的话直接关 UseDNS,比查网络查负载都管用。