马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
SSH 连接慢,先定位卡在哪一步
SSH 连接慢的成因很多,但它有个特点:慢的位置往往能一眼看出来。最有效的第一步是加 -v 看握手过程停在哪:
ssh -v [email protected]
输出里一般是这几段:Connecting(DNS/建立 TCP)、authenticating(密钥/密码交互)、Entering passphrase(读私钥)。卡在 Connecting 多半是网络或 DNS;卡在 authenticating 多半是服务端配置(GSSAPI、UseDNS)或认证方式;卡在读取密钥就是本机私钥环节。
另一半信息在服务端日志 里:/var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL),登录的每次尝试都记着。
常见原因一:DNS 反向解析
原因:SSH 服务器会对客户端 IP 做一次反向 DNS 解析(把 IP 换成主机名,用于日志 可读),解析不通或超时就会干等,表现就是"连上了但半天要密码"。
解决:在服务端 /etc/ssh/sshd_config 里加:
UseDNS no
然后重启 SSH 服务:
sudo systemctl restart sshd
常见原因二:GSSAPI 认证
原因:GSSAPI(常用于 Kerberos 域认证)在没有 KDC 的环境里会先去试探认证,白白消耗时间。
解决:同样在 sshd_config 里:
GSSAPIAuthentication no
重启 sshd 生效。sudo systemctl restart sshd 一条搞定。
常见原因三:客户端自己的配置
原因:客户端也可能在开连之前就尝试 GSSAPI 或做 DNS 解析。
解决:编辑客户端的 ~/.ssh/config(没有就新建一个):
Host *
GSSAPIAuthentication no
UseDNS no
ConnectTimeout 10
按主机分组还能写成:
Host prod-*
HostName 10.0.0.%h
PreferredAuthentications publickey
IdentityFile ~/.keys/id_ed25519
容易被漏掉的 IPv6 陷阱
一个非常常见、而且答案往往不在上面几条里的原因:域名没有 AAAA 记录,但系统优先解析 IPv6。客户端会先连 IPv6 地址,等超时(几秒到十几秒)再回退 IPv4,表现就是"每次连接都要愣一下"。
验证:
ssh -4 user@host # 强制只用 IPv4,如果瞬间连上,就是它
dig AAAA host
解决办法任选:ssh -4 或客户端配置里加 AddressFamily inet;或者干脆给域名补上 AAAA 记录。
其他排查项
4. 网络本身
- 用
ping 看延迟与丢包;
- 用
traceroute(或 mtr)看路由有没有异常绕路;
- 带宽不足或链路抖动都会让交互明显变卡。
top / htop 看 CPU、内存;iotop 看磁盘 I/O;
- 负载打满时 sshd 连上的响应自然慢。
- 云上安全组、本机 iptables/firewalld 规则不当会拖慢甚至拒连;
- 注意检查客户端与服务器之间的所有中间设备,别有不必要的阻塞。
7. 密钥认证环节
- 私钥权限不对(应为 600)、或者私钥放在网络盘/NFS 上,读取会很慢;
- 用
ssh-agent 缓存私钥,省掉反复读取与解密口令的时间;
- 密钥太旧(如 1024 位 RSA)在某些实现里协商也偏慢,换 ed25519 会快不少。
8. 系统日志 写入慢
/var/log 下日志暴涨会拖慢写盘;
- 把日志轮转(logrotate)和清理策略配好。
一起加上:连接超时与断线
顺手把这三条也写进 ~/.ssh/config,运维体验会好很多:
Host *
ServerAliveInterval 30 # 每 30 秒保活一次,防止长时间空闲被中间设备掐断
ServerAliveCountMax 3 # 连续 3 次没回应就断开
ConnectTimeout 10 # 连不上 10 秒就放弃,别干等
StrictHostKeyChecking accept-new
再加个 ControlMaster auto + ControlPath 开连接复用,同一台机器反复 scp 时能快一个量级:
Host *
ControlMaster auto
ControlPath ~/.ssh/ctrl/%h-%p-%r
ControlPersist 60s
一个稳妥的排查顺序
ssh -v 看卡在哪段;
- 服务端
/var/log/auth.log(或 /var/log/secure)看有没有异常日志;
- 服务端
sshd_config 关掉 UseDNS 和 GSSAPIAuthentication;
- 客户端
~/.ssh/config 同样关掉两项,并加 AddressFamily inet(若域名无 AAAA);
ping / traceroute 看网络;top 看服务器负载;
- 重启 sshd 后复测——改完没重启等于没改。
有一点容易踩:systemctl restart sshd 在连接密集的生产机上会短暂断开存量会话,夜里维护做最合适;急事可以用 systemctl reload(reload 会重读部分配置,但 UseDNS / GSSAPIAuthentication 这类需 reload 后才生效的参数,稳妥起见还是走 restart)。
小结
SSH 慢绝大多数时候不是 SSH 本身慢,而是握手过程中被一些"看起来该做"的额外动作拖住了。四个高频元凶:反向 DNS(UseDNS)、GSSAPI 认证、IPv6 回退超时、私钥读取(NFS/权限/密钥类型)。
一句话解法:服务端 UseDNS no + GSSAPIAuthentication no,客户端 ~/.ssh/config 关这两项并把 AddressFamily inet 必上,再配上 ServerAliveInterval 保活,八成的"SSH 卡半分钟"就消失了。剩下的交给 ssh -v 和 /var/log/auth.log 继续定位。
(本文由 qidao123.com企服评测-应用市场 编辑提示整理:配置适用于 OpenSSH 7.x/8.x 的 Linux 环境,改 sshd_config 前建议先备份,生产重启请选业务低峰。) |