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

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,观察日志中是否出现getaddrinfo或reverse mapping相关延迟 - 若必须保留 DNS 解析(如基于 hostname 的 AllowUsers),可配合
VerifyHostKeyDNS no和本地/etc/hosts预埋映射缓解
登录后 shell 启动慢(bash/zsh 初始化卡顿)
SSH 认证成功后,服务端会 fork 子进程加载用户 shell,并执行 ~/.bashrc、~/.zshrc 等配置文件。任何其中的阻塞操作(比如网络请求、未超时的 curl、git status、ntpdate)都会拖慢整个登录响应。
实操建议:
- 用
ssh -v user@host观察最后一条 debug 日志是否停在debug1: Authentication succeeded之后很久才出现 shell 提示符 - 临时绕过初始化:
ssh user@host 'bash --noprofile --norc -c "echo OK"',如果很快,说明问题出在 shell 配置里 - 逐行注释
~/.bashrc中可疑命令(尤其是git、curl、ssh-add、pyenv init等),配合time bash -i -c exit定位耗时段
GSSAPI 认证引发的超时
OpenSSH 默认开启 GSSAPIAuthentication,即使没配 Kerberos,也会尝试联系本地 KDC(如 krb5kdc)或查询 DNS SRV 记录。在无域环境或 DNS 不可达时,常静默等待 10 秒以上。
实操建议:
- 服务端关闭 GSSAPI:
GSSAPIAuthentication no和GSSAPICleanupCredentials 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-hostname或dig +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 或改加密算法——那些极少是主因。