Linux SSH 登录缓慢的排查清单

14次阅读

ssh登录卡在password提示前主因是服务端dns反向解析(UseDNS yes),其次为shell初始化阻塞或GSSAPI认证超时,需分段排查TCP连接、协议协商、认证及shell启动各环节。

Linux SSH 登录缓慢的排查清单

SSH 登录卡在 password 提示前

这通常不是密码验证慢,而是服务端在建立连接后、认证前做了耗时操作。最常见的是 sshd 启用了 DNS 反向解析(UseDNS yes),尝试把客户端 IP 解析成 hostname。如果客户端是内网地址、或 DNS 配置异常,会卡住 5–30 秒。

实操建议:

  • 检查服务端 /etc/ssh/sshd_config,确认 UseDNS 是否为 no;改完需 sudo systemctl reload sshd
  • 临时验证:启动调试模式 sudo /usr/sbin/sshd -d -p 2222,观察日志中是否出现 getaddrinforeverse mapping 相关延迟
  • 若必须保留 DNS 解析(如基于 hostname 的 AllowUsers),可配合 VerifyHostKeyDNS no 和本地 /etc/hosts 预埋映射缓解

登录后 shell 启动慢(bash/zsh 初始化卡顿)

SSH 认证成功后,服务端会 fork 子进程加载用户 shell,并执行 ~/.bashrc~/.zshrc配置文件。任何其中的阻塞操作(比如网络请求、未超时的 curlgit status、ntpdate)都会拖慢整个登录响应。

实操建议:

  • ssh -v user@host 观察最后一条 debug 日志是否停在 debug1: Authentication succeeded 之后很久才出现 shell 提示符
  • 临时绕过初始化:ssh user@host 'bash --noprofile --norc -c "echo OK"',如果很快,说明问题出在 shell 配置里
  • 逐行注释 ~/.bashrc 中可疑命令(尤其是 gitcurlssh-addpyenv init 等),配合 time bash -i -c exit 定位耗时段

GSSAPI 认证引发的超时

OpenSSH 默认开启 GSSAPIAuthentication,即使没配 Kerberos,也会尝试联系本地 KDC(如 krb5kdc)或查询 DNS SRV 记录。在无域环境或 DNS 不可达时,常静默等待 10 秒以上。

实操建议:

  • 服务端关闭 GSSAPI:GSSAPIAuthentication noGSSAPICleanupCredentials no(后者防残留)
  • 客户端也可强制禁用:ssh -o GSSAPIAuthentication=no user@host
  • 验证是否生效:登录时加 -v,不再看到 debug1: Next authentication method: gssapi-with-mic 类日志

客户端 DNS 查询或路由异常

有时问题不在服务端,而是客户端解析目标主机名太慢,或中间网络设备干扰(如某些防火墙对 SSH 握手包做深度检测)。特别是用域名登录时,ssh domain.com 会先走本地 resolv.conf 查 A/AAAA 记录。

实操建议:

  • time nslookup your-hostnamedig +short your-hostname 检查 DNS 响应时间
  • 改用 IP 直连测试:ssh user@192.168.1.100,如果飞快,基本锁定 DNS 或 hostname 解析环节
  • 抓包辅助判断:tcpdump -i any port 22 -w ssh-slow.pcap,看 SYN/SYN-ACK 是否延迟,或是否存在大量重传、ICMP unreachable

排查这类问题的关键在于分段隔离:先确认卡点在 TCP 连接、SSH 协议协商、认证阶段,还是 shell 启动。每个环节都有对应日志和开关,别一上来就调 TCPKeepAlive 或改加密算法——那些极少是主因。

text=ZqhQzanResources