SSH 连上要等 10 秒:反向 DNS、GSSAPI 与 PAM 的排查顺序

Linux · 3 分钟阅读· 179 次阅读

密码输完要停五到十秒才进 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 中的网络模块

SSH 连上要等 10 秒

几个容易踩的坑

下面这些是最常见的错误做法:

  • 把 UseDNS 关掉但忘了 reload:配置没生效
  • 客户端开了 ControlPersist 却在不同网络切换,复用旧连接失败
  • 用 root 直接改配置不留备份
  • 忽略 SSH 登录慢可能是磁盘 IO 慢导致的 PAM 延迟

最后补两句

SSH 慢的排查只需一条命令 ssh -vvv,日志里会明确写出在等什么。

工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。

评论 (3)

阿
阿哲

照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。

南
南风

比「一键脚本」有用多了,知道为什么比知道怎么做重要。

K
Kevin

补充一句:不同版本行为会变,动手前先确认自己的版本号。

发表评论

验证码

提交后需站长审核,通过后才会显示。