SSH 连上要等 10 秒:反向 DNS、GSSAPI 与 PAM 的排查顺序
密码输完要停五到十秒才进 shell,很多人以为是服务器性能问题。实际上 SSH 在认证前后会做几件事,其中任何一件超时都会卡住。
最常见的是服务端 UseDNS yes:它会对客户端 IP 做反向解析,没有 PTR 记录就等到超时。
先说结论
服务端关 UseDNS 和 GSSAPI,客户端加 ControlMaster。 这三项能解决九成「登录慢」。
- 服务端 sshd_config:UseDNS no、GSSAPIAuthentication no
- 客户端 ~/.ssh/config 开 ControlMaster 复用
- 检查 PAM 里是否有网络相关模块
- IPv6 优先但不可达也会卡,用 -4 测试
先把问题说清楚
GSSAPI 认证在客户端会先尝试 Kerberos,环境里没有 KDC 时会等到超时,通常 5-10 秒。
另一个隐藏因素是 DNS:客户端解析主机名慢,表现为「敲完命令等很久才连上」。
具体怎么做
按顺序执行,每步都验证完再进下一步:
- 用 ssh -vvv 看卡在哪一步:认证前还是认证后
- 服务端 /etc/ssh/sshd_config 设 UseDNS no、GSSAPIAuthentication no,reload sshd
- 客户端 ~/.ssh/config 加 ControlMaster auto + ControlPersist 10m
- 用 ssh -4 与 ssh -6 分别测试,确认是否 IPv6 超时
- 检查 /etc/nsswitch.conf 与 resolv.conf,避免无效 DNS 服务器
参数与成本对照
把关键数值摊开,方便判断该选哪条路:
| 卡点 | 表现 | 处理 |
|---|---|---|
| 反向 DNS | 认证后停 5-10 秒 | UseDNS no |
| GSSAPI | 认证前停顿 | GSSAPIAuthentication no |
| IPv6 不可达 | 连接前超时 | ssh -4 或调低优先级 |
| PAM 模块 | 密码后停顿 | 排查 pam 中的网络模块 |

几个容易踩的坑
下面这些是最常见的错误做法:
- 把 UseDNS 关掉但忘了 reload:配置没生效
- 客户端开了 ControlPersist 却在不同网络切换,复用旧连接失败
- 用 root 直接改配置不留备份
- 忽略 SSH 登录慢可能是磁盘 IO 慢导致的 PAM 延迟
最后补两句
SSH 慢的排查只需一条命令 ssh -vvv,日志里会明确写出在等什么。
工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。
评论 (3)
照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。
比「一键脚本」有用多了,知道为什么比知道怎么做重要。
补充一句:不同版本行为会变,动手前先确认自己的版本号。
发表评论