
你输入ssh root@你的服务器IP,回车。然后光标停在那里,等。五秒,十秒,有时候半分钟,才跳出password:提示。你改了UseDNS no,好像快了一点,但还是慢。你没找到根本原因,只是在碰运气。
SSH登录慢的原因比你以为的要多。今天把完整的排查链路写出来,帮你找到真正的元凶。
先看一个数据
SSH登录延迟的常见原因中,DNS反向解析和GSSAPI认证占了大部分。但在某些网络环境下,MTU探测、IP地址查找或密钥协商也可能成为瓶颈。如果UseDNS no和GSSAPIAuthentication no都没有解决问题,就需要沿着连接链路逐层排查。
排查一:检查SSH服务端配置
大多数SSH慢的问题,改/etc/ssh/sshd_config就能解决。逐个检查以下配置项:
bash
vim /etc/ssh/sshd_config
UseDNS no
SSH服务端默认会尝试把客户端的IP反解成域名。如果客户端IP没有对应的PTR记录,这个过程会等到超时(通常10-30秒)才放弃。
GSSAPIAuthentication no
SSH默认会尝试用Kerberos认证。如果你不用Kerberos,这个步骤也在浪费你的时间。
PermitEmptyPasswords no
确认不允许空密码登录。虽然不直接影响速度,但避免不必要的尝试。
修改后保存,重启SSH:
bash
systemctl restart sshd
如果这两个参数改完,登录依然慢,说明问题在其他环节。
排查二:检查SSH客户端配置
客户端也可能引入延迟。检查本地的~/.ssh/config:
bash
cat ~/.ssh/config
GSSAPIAuthentication no
如果你用的是Mac,默认会在SSH连接时尝试GSSAPI认证。加一行禁用:
bash
Host *
GSSAPIAuthentication no
IPQoS和AddressFamily
某些网络环境下,IPQoS设置可能导致延迟:
bash
Host *
IPQoS 0x00
AddressFamily inet
AddressFamily inet强制只使用IPv4,避免IPv6尝试超时。
排查三:使用-v输出详细连接过程
SSH的-v参数会输出每一步的耗时,帮你定位具体卡在哪一步。
bash
ssh -v root@服务器IP
观察输出:
text
debug1: Connecting to 192.168.1.100 [192.168.1.100] port 22. debug1: Connection established. debug1: identity file /root/.ssh/id_rsa type 0 debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey ... (如果在这里卡住,是密钥协商问题) debug1: Authentication succeeded (publickey).
如果在某个阶段停顿,重点关注那个步骤。debug1: Connection established.之后到Authentications that can continue之间卡住,通常是服务端配置问题。
用-vvv可以看更详细的输出:
bash
ssh -vvv root@服务器IP
排查四:检查服务端日志
SSH服务端的日志会记录认证过程中的细节。
bash
tail -f /var/log/auth.log # 或 CentOS tail -f /var/log/secure
在另一个终端尝试登录,观察日志输出。如果看到Connection closed by authenticating user root之类的信息,说明认证过程中被中断了。
排查五:检查服务器负载
如果服务器CPU或内存使用率过高,SSH登录也会变慢。
bash
top free -h
sshd进程需要资源来处理连接请求。资源紧张时,即使网络和配置正常,登录也可能延迟。如果负载太高,优先解决负载问题。
排查六:测试网络延迟
从客户端ping服务器,确认网络延迟是否正常。
bash
ping 服务器IP
如果延迟超过100ms,SSH登录慢是正常的。国内服务器通常<50ms,海外服务器可能>200ms,这种延迟是物理距离造成的,无法通过配置解决。
排查七:检查MTU问题
MTU设置不当可能导致SSH在握手阶段超时重传。
测试MTU:
bash
ping -M do -s 1472 服务器IP
如果提示Frag needed,说明MTU路径有问题。调整客户端MTU:
bash
# 在~/.ssh/config中
Host *
IPQoS 0x00
排查八:检查服务端SELinux
SELinux可能导致SSH连接异常缓慢,某些策略检查会引入额外延迟。
快速排查:
bash
setenforce 0
临时关闭SELinux后测试登录速度。如果变快,说明是SELinux策略的问题。永久解决需要调整策略,而不是关掉它。
排查九:检查DNS和主机名解析
除了UseDNS,SSH还会尝试解析主机名和网络地址。
bash
# 检查/etc/hosts文件 cat /etc/hosts # 检查主机名设置 hostname hostname -f
确保/etc/hosts中有服务器自己的IP和主机名对应关系,避免反向查找时的额外延迟。
真实案例
一个朋友的公司,SSH登录从输入命令到出现密码提示需要8秒。改了UseDNS no、GSSAPIAuthentication no,还是慢。用ssh -vvv查看,发现卡在密钥协商阶段。检查服务端/etc/ssh/sshd_config,PubkeyAuthentication设为yes,但客户端没有配置密钥,SSH在尝试所有密钥认证方式后才进入密码认证。禁用密钥认证(PubkeyAuthentication no,如果确实不用密钥登录)后,登录速度恢复正常。
排查速查表
| 延迟位置 | 可能原因 | 解决方案 |
|---|---|---|
| DNS反解 | UseDNS开启 | 设为no |
| GSSAPI | 认证尝试超时 | 服务端和客户端都禁用 |
| 密钥协商 | 客户端无密钥但服务端允许密钥认证 | 配置密钥或禁用PubkeyAuthentication |
| 服务器负载 | CPU/内存高 | 排查资源占用 |
| 网络延迟 | 物理距离或丢包 | 检查网络质量 |
| MTU | 路径MTU问题 | 调整MTU或IPQoS |
最后一句
SSH登录慢的问题通常不是单一原因。UseDNS no和GSSAPIAuthentication no解决了绝大多数情况,如果还不行,用-v看看到底卡在哪一步。很多时候慢是因为在尝试一种你根本用不到的认证方式。找到那个尝试,关掉它,登录就快了。




