SSH连接慢90%非网络问题,而是服务端认证前的UseDNS和GSSAPIAuthentication默认开启导致卡顿;禁用二者并重启sshd,再检查nsswitch.conf hosts顺序及客户端IPv6行为即可解决。

SSH连接极其缓慢,90%以上不是网络问题,而是服务端在认证前做了多余解析操作。最典型的症状是:执行ssh user@host后黑屏卡住5–10秒才弹出密码框,而ping和telnet host 22都正常。排查要从服务端配置、系统解析机制和客户端行为三方面入手,重点盯住两个默认开启却极少用到的机制。
看日志定位卡点位置
运行带详细输出的连接命令:
ssh -v user@host重点关注这两行之间的停顿:
debug1: Remote protocol version 2.0, remote software version OpenSSH_...debug1: Authentications that can continue: publickey,password
如果中间空白超过2秒,基本锁定为服务端DNS反向解析或GSSAPI协商超时。这个阶段不涉及网络传输,纯属服务端本地处理阻塞。
关掉两个关键开关
编辑服务端配置文件/etc/ssh/sshd_config,确保以下两行明确设为no:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
UseDNS no—— 禁用客户端IP的PTR反向查询(内网/虚拟机/无公网DNS环境必开) -
GSSAPIAuthentication no—— 关闭Kerberos凭据协商(普通环境无KDC服务,每次失败都重试耗时)
保存后执行sudo systemctl restart sshd生效。临时验证可用:ssh -o UseDNS=no -o GSSAPIAuthentication=no user@host。
检查系统级名称解析路径
即使UseDNS no已设置,仍可能卡顿,原因常在/etc/nsswitch.conf的hosts行:
- 错误写法:
hosts: dns files→ 每次解析都先走DNS,哪怕/etc/hosts里有对应条目 - 推荐写法:
hosts: files dns myhostname→ 优先查本地文件,再DNS,最后本机名
验证方式:getent hosts example.com若超时但dig example.com正常,就是nsswitch问题。改完无需重启服务,新连接立即生效。
留意客户端IPv6行为干扰
有时显示“Connection timed out”,实际是客户端优先尝试IPv6连接,而本地网络或中间设备不支持IPv6路由,导致几十秒后才降级到IPv4。
- 临时绕过:
ssh -o AddressFamily=inet user@host(强制只用IPv4) - 永久解决:在客户端
~/.ssh/config中添加AddressFamily inet或修改系统/etc/gai.conf
这类问题无法通过服务端配置修复,必须在发起连接的一方控制。

















