登录慢通常卡在哪一段
SSH 登录分为连接建立、密钥交换、认证前协商、身份认证几个阶段,卡顿几乎都发生在认证之前:服务端尝试对客户端地址做反向解析、协商中等待不需要的认证机制、客户端逐个尝试本机所有密钥。用带调试输出的客户端命令就能看出时间消耗在哪一步。
区分两种慢
「输入密码前就慢」属于协商阶段的问题,调整服务端相关开关或客户端密钥选择即可改善;「登录成功之后才卡」通常是会话初始化问题,比如挂载家目录、执行登录脚本时读取了不可达的网络路径,这一类要查会话初始化脚本与目录挂载,与 SSH 本身无关。
基本信息
| 服务端配置 | /etc/ssh/sshd_config,改动后先做语法校验再重载 |
|---|---|
| 客户端调试 | ssh -vvv 输出各阶段耗时与协商细节 |
| 常见开关 | 反向解析开关、协商机制开关 |
| 验证方式 | 同一账号在不同客户端对比耗时 |
典型使用场景
- 内网服务器登录要等十几秒,影响批量运维效率
- 自动化脚本连接超时,需要降低协商耗时
- 客户端本地密钥过多,依次尝试导致认证阶段变慢
- 新上线机器登录正常、老机器登录慢,需要对比配置差异
- 排查登录后被踢出的问题时区分是协商还是会话阶段
定位阶段
定位阶段
time ssh -vvv user@host 2>&1 | grep -E 'Entering|Authenticating|offering|expecting' | head -30
# 输出中相邻两行的时间差就是该阶段耗时
journalctl -u sshd --since '10 min ago' | tail -20 # 服务端侧时间点对照
time ssh -o PreferredAuthentications=publickey user@host # 只走密钥认证对比常见调整
常见调整
# 服务端 /etc/ssh/sshd_config 中按需调整:
# UseDNS no 避免对客户端地址做反向解析
# GSSAPIAuthentication no 跳过不需要的协商机制
sshd -t && systemctl reload sshd # 先校验语法再重载,不要直接重启
# 客户端减少密钥尝试:
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@host现象与方向
| 现象 | 可能的阶段 | 处理方向 |
|---|---|---|
| 认证提示前长时间无输出 | 反向解析或协商等待 | 调整服务端开关 |
| 提示密钥尝试多条后成功 | 客户端密钥过多 | 指定密钥并关闭自动尝试 |
| 登录后立即卡住 | 会话初始化或目录挂载 | 检查登录脚本与家目录挂载 |
| 特定客户端慢、其他正常 | 客户端侧配置或网络 | 对比客户端版本与网络路径 |
| 所有机器都慢 | 跳板或网络设备 | 检查路径上的设备与延迟 |
修改服务端配置时保留一个已登录的会话,改完先做配置语法校验再重载服务,避免把自己锁在门外。