SSH 登录卡半天?先查反向解析与 GSSAPI,再看服务端日志

举报
yd_246130537 发表于 2026/11/08 09:51:24 2026/11/08
【摘要】 SSH 明明连得上,输完密码却要等十几秒甚至半分钟才进 shell,很多人第一反应是网络慢。其实登录慢最常见的原因不在带宽,而在服务端登录前做的几次“额外检查”:反向 DNS 解析、GSSAPI 认证协商、PAM 模块的耗时操作。本文按从快到慢的顺序定位:先在客户端加 -v 看卡在哪一步,再对症关掉或修好对应的检查,多数机器改两行配置就能恢复秒进。 第一步:用 -v 看它到底卡在哪一步别凭感...

SSH 明明连得上,输完密码却要等十几秒甚至半分钟才进 shell,很多人第一反应是网络慢。其实登录慢最常见的原因不在带宽,而在服务端登录前做的几次“额外检查”:反向 DNS 解析、GSSAPI 认证协商、PAM 模块的耗时操作。本文按从快到慢的顺序定位:先在客户端加 -v 看卡在哪一步,再对症关掉或修好对应的检查,多数机器改两行配置就能恢复秒进。

第一步:用 -v 看它到底卡在哪一步

别凭感觉猜,先让 SSH 自己说。客户端加一个 -v(想看更细就用 -vvv),登录时注意每行前面的时间戳,重点看两次输出之间停顿最久的那一段:

ssh -v user@your-server

如果停顿出现在 Authenticating to ... 之前,问题在连接建立阶段,多半是网络或 DNS;如果停顿在 SSH2_MSG_SERVICE_ACCEPT received 之后、输入密码之前,大概率是 GSSAPI 在等超时;如果密码输完、出现 Authenticated 之后还卡,那多半是服务端 shell 启动阶段的 PAM 或 motd 在拖时间。先定位到这一步,后面的排查才有方向,不要一上来就改一堆配置碰运气。

一个更直接的对照办法是换一台机器、换一个网络再登录一次:同一台服务器在内网秒进、在公网卡,指向 DNS 或路由;到处都卡,问题在服务端配置本身。

第二步:反向 DNS 解析是最常见的元凶

OpenSSH 服务端默认会做反向 DNS 查询(UseDNS yes):客户端一连上来,服务端先拿客户端 IP 去查它对应的主机名,查不到或 DNS 服务器响应慢,登录就得等这一步超时。内网机器、NAT 后面的客户端、没有 PTR 记录的公网 IP,最容易中招。

验证方法很简单:在服务端看登录时的系统日志,出现 reverse mapping checking getaddrinfo failed 之类的提示,基本就是它:

journalctl -u sshd --since "10 minutes ago" | tail -30

确认后,在服务端 /etc/ssh/sshd_config 里显式关掉:

UseDNS no

改完重启 sshd 生效:

systemctl restart sshd

注意别只改客户端的配置,UseDNS 是服务端参数,改客户端没用。关掉它没有任何安全损失——反向解析结果本来就不参与认证决策,只是日志里少了一行主机名。很多云厂商的镜像默认就是 UseDNS yes,刚开的机器登录慢,先查这一项能省不少时间。

第三步:GSSAPI 超时常被误当成网络问题

如果 -v 输出里在 Authenticating 附近停顿,并且出现 GSSAPI 相关的行,大概率是客户端在尝试 GSSAPI 认证,而服务端或 Kerberos 环境根本没配好,协商一次次等超时。桌面版 Linux 发行版的默认 ssh_config 里常开着 GSSAPIAuthentication yes,服务器端也可能默认开启,两边一配合,登录就多等几秒。

客户端先关掉试试效果:

ssh -o GSSAPIAuthentication=no user@your-server

如果这一下就快了,把它写进客户端的 ~/.ssh/config,对这台主机永久生效:

Host your-server
    HostName 1.2.3.4
    User user
    GSSAPIAuthentication no

服务端同样可以在 /etc/ssh/sshd_config 里关掉 GSSAPIAuthentication,改完重启 sshd。没有 Kerberos 环境的机器,这个认证方式本来就用不上,关掉它只是跳过一次注定失败的尝试,不影响密码和密钥登录。

第四步:密码输完还卡,查 PAM 与 motd

密码验证通过、出现 Authenticated 之后还卡,问题出在登录后的环节,两个嫌疑最大:一是 PAM 模块里有耗时操作(比如 pam_systemd、联网查用户信息的模块),二是登录后打印的 motd(/etc/motd 或 /etc/update-motd.d/ 下的脚本)在跑慢命令。

先确认是不是 motd 在拖:直接用 ssh user@host true 之类不启动交互 shell 的命令对比,如果这样很快、正常登录很慢,motd 或 shell 启动脚本嫌疑最大。临时把 /etc/update-motd.d/ 下的脚本逐个挪走再登录,看哪个是慢的;也可以在服务端 /etc/ssh/sshd_config 里设 PrintMotd no,把 motd 打印关掉验证。

PAM 则看 /etc/pam.d/sshd 里有没有不必要的模块,尤其是会联网的(比如查 LDAP、查远程用户目录),内网断网或对方服务挂掉时,这类模块会一直等到超时。排障时可以在测试机上逐个注释验证,但生产机改 PAM 要格外小心:改错可能导致所有人登不上去,改前先留一个已登录的会话当后路,确认新登录正常后再退出。

一张清单收尾

SSH 登录慢,先用 ssh -v 定位卡在哪一步:连接前卡先怀疑网络与 DNS;认证阶段卡,先关 GSSAPI 再查服务端 UseDNS;密码通过后卡,查 motd 与 PAM。最常见的两个修复就是服务端 UseDNS no 与客户端 GSSAPIAuthentication no,改完重启 sshd 验证一次。定位清楚再动手,改两行配置就能解决的问题,不必升级带宽也不必重装系统。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。