## 症状现象
SSH 登录有时秒进,有时卡在密码输入前十几秒甚至更久,输完密码后又立刻顺畅。应用一切正常,网络测试也没有异常,唯独登录体验时好时坏。这种卡顿发生在认证之前,与密码对错无关。
## 定位过程
卡顿位置是判断关键:卡在输入密码提示出现之前,说明慢在连接建立的附加环节。sshd 默认会尝试对客户端 IP 做反向解析,把地址翻译成主机名用于日志记录;反解依赖的 DNS 服务不可达或响应慢时,sshd 要等到解析超时才继续,每次超时几十秒,这正是时快时慢的原因:解析链路通畅就快,丢包就慢。客户端侧的协商延迟问题同理,验证方法是带上详细参数连接,观察卡在哪个阶段。
ssh -v user@192.168.10.20 grep -i dns /var/log/secure
## 解决方法
服务端关闭两个不必要的环节:一是 UseDNS 设为 no,sshd 不再对客户端做反解;二是关闭 GSSAPI 认证尝试,减少协商回合。改完重启 sshd,保留现有会话不断开,新开会话验证。
UseDNS no GSSAPIAuthentication no
客户端侧同样受益的改法是固定连接参数与复用会话,多次登录共用一条连接,协商只发生一次。
## 预防建议
新机器初始化模板里直接带上这两项配置,顺云云服务器批量部署时用镜像市场固化基础配置,避免逐台踩同一个坑。涉及日志可读性的需求,用客户端配置的别名注释替代服务端反解,两全其美。
同类问题的另一个来源是客户端侧的认证链路:逐个尝试多种认证方式,每次失败都要一轮往返。把客户端配置收紧到明确的方式,例如指定只用密钥,连接立刻干脆。跳板链路多级的场景,逐级排查各级的延迟,命令行的详细模式能标出每级耗时。
顺带把登录体验的整体优化列一下:会话复用让第二次连接近乎瞬开;控制连接保活参数防止空闲被踢;别名配置把常用跳板参数固化,敲两个字母替代一长串参数。这些小习惯叠加起来,日常操作的感受完全是两个世界。