SSH 登录慢,别先怪网络:从握手到提示符的排查顺序
SSH 连上服务器要等十几秒才出现提示符,多人第一反应是网络差。其实多数情况下,网络本身没问题,慢在登录过程中的某一步等超时。按面这个顺序查,通常几分钟就能定位。
先分清慢在哪一步。用详细模式连一次,看时卡在哪行:ssh -vvv user@host。如果卡在 Connecting to 那一行,那是网络或端口问题;如果卡在认证提示之后,是认证环节;如果认证通过后还迟迟不出提示符,问题在服务器登录后的初始化。先分段,再动手。
第一步关掉反向 DNS 查询。服务器默认把客户端 IP 反查成主机名,DNS 不通或超时时,每次登录都要等这一耗尽编 /etc/ssh/sshd_config,写上 UseDNS no 和 GSSAPIAuthentication no,改完用 systemctl restart sshd 重启。GSSAPIAuthentication 是另一处常见耗时点:客户端尝试 GSSAPI 认证,服务器端没有对应配置时也会来回试探,一并关掉对普通密钥、密码登录没有影响。
第二步:看认证方式是不是在试错。如果用密钥登录,检查客户端是不是带了一堆用不上的密钥。用 ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 只用定密钥之前那种了密码才发是密钥顺序问题的情况,往往就是客户端先把 ssh-agent 里的五六把密钥挨个试了一遍,服务器端 MaxAuthTries 又设得小试错本身就花了时间,可能把账号到限制。
第三步:登录后慢,查 PAM 和登录脚本。认证通过、提示符迟迟不出来,通常是两类东西拖:一是 PAM 模块,比如 pam_systemdpam_motd 在等某些源,或者有自定义模块在联网;二是登录脚本,~/.bashrc、~/.profile、/etc/profile.d/ 里放了耗时命令,最常见的是在登录脚本里跑 curl 查版本、跑 nvm 初始化、或者了一个超时的 NFS 目录。临时证办法:用一个不加载配置的命令进系统,ssh 'echo ok'。如果这很,说明 SSH 本身和网络都没问题,慢在交互式登录加载的东西上;再逐段注释登录脚本,二分定位。
第四步:确认不是服务器负载问题。前面都排除,再看服务器本身:uptime 看负载,systemctl status sshd 看服务状态,journalctl -u sshd --since '10 minutes ago' 看近期日志。如果日志里出现 Connection reset、Did not receive identification string 这类记录,说明有扫描器在频繁敲门,sshd 在处理这些半连接上花了精力,这时可以考虑换端口、限制来源 IP,或上 fail2ban。
个可复用的检查清单:第一,ssh -vvv 确认卡在哪一段;第二,UseDNS no、GSSAPIAuthentication no,重启 sshd;第三,IdentitiesOnly=yes 加指定密钥,排除密钥试错;第四,ssh host 'echo ok' 区分登录脚本问题;第五,journalctl -u sshd 看服务端有没有异常连接。按这个顺序,大多数 SSH 登录都能在不动网络配置的情况下解决。真正的网络问题反而少见,先把软件层面的超时点排干净,再疑线路不迟。
- 点赞
- 收藏
- 关注作者
评论(0)