云服务器 SSH 登录突然变慢?从网络到认证的排查顺序
SSH 连云服务器平时一两秒进得去,突然变成卡住十几秒甚至半分钟,最影响心情。多数情况不是“机器坏了”,而是 DNS、反向解析、鉴权模块或资源争用某个环节拖了后腿。下面按“先外后内、先快后慢”的顺序排查,命令在 EulerOS、CentOS、Ubuntu 上基本通用。
一、先分清慢在哪一段
用详细模式连一次,看卡在哪一行:
ssh -vvv user@你的服务器IP
对照输出大致分段:
-
停在
Connecting to ...:网络到不了,或安全组/防火墙拦了 22 端口。 -
停在
Authenticating to ...或Offering public key很久:认证侧慢(密钥试错、GSSAPI、PAM、LDAP)。 -
认证通过后还要等很久才出 shell:用户登录脚本、
motd、家目录 NFS、磁盘 IO 问题。
也可以先测纯网络延迟,排除“整条链路都卡”:
ping -c 5 服务器IP
tcptraceroute 服务器IP 22 # 没有该命令可用 mtr -T -P 22 服务器IP
云厂商控制台里看一下弹性公网 IP、安全组入站是否仍放行 TCP 22,以及是否换过带宽或做了流量清洗。
二、反向 DNS:最常见的“无声等待”
sshd 默认会尝试对客户端 IP 做反向解析。若云上 PTR 记录缺失或 DNS 超时,登录就会空等数秒到几十秒。
在服务器上看配置:
grep -E '^(UseDNS|GSSAPIAuthentication)' /etc/ssh/sshd_config
建议生产环境明确关掉不必要的解析和票据协商:
# /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
改完校验并重载:
sshd -t && systemctl reload sshd
# Ubuntu 上服务名可能是 ssh
# sshd -t && systemctl reload ssh
客户端侧若公司内网 DNS 很慢,可在本机 ~/.ssh/config 对该主机写:
Host myserver
HostName 服务器IP
User yourname
GSSAPIAuthentication no
用 IP 直连而不是依赖容易抖动的域名,也能少一层解析。
三、认证试错:密钥太多、顺序不对
ssh -vvv 里如果反复出现 Offering public key 再失败,说明客户端在一把一把试本地密钥。agent 里钥匙一多,服务器端 MaxAuthTries 还没到,时间已经被耗掉了。
本机清理或指定密钥:
ssh-add -l
ssh -i ~/.ssh/id_ed25519_云服务器 user@服务器IP
在 ~/.ssh/config 里为该主机写死:
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519_云服务器
服务器端可适当收紧并打开认证日志,方便以后对照:
# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no # 确认密钥可用后再关密码
MaxAuthTries 4
LogLevel VERBOSE
重载后用 journalctl -u sshd -n 50 --no-pager(Ubuntu 用 ssh)看是哪把 key 被拒。
四、PAM、会话脚本和家目录
认证已成功但迟迟不出提示符时,查登录链路:
# 临时看 PAM 相关日志
journalctl -u sshd -n 100 --no-pager
tail -n 50 /var/log/secure # EulerOS/CentOS
tail -n 50 /var/log/auth.log # Ubuntu
常见拖慢点:
-
~/.bashrc//etc/profile.d/*.sh里有联网命令、慢的curl、或挂死的补全脚本。用非交互排查:
ssh user@服务器IP 'echo ok; time true'
ssh -T user@服务器IP 'echo no-pty'
若 -T 很快而普通登录很慢,问题多半在交互式 shell 初始化。
-
motd/update-motd每次登录拉系统信息(Ubuntu 较常见):
ls /etc/update-motd.d/
# 可暂时 chmod -x 可疑脚本做对比,确认后再决定是否保留
-
家目录在 NFS/远程盘上且存储抖动:
df -h ~、time ls ~一看便知。云盘突发性能用尽时,连读一个小文件都会卡。
五、资源争用:CPU、内存、磁盘、inode
SSH 守护进程本身很轻,但机器负载打满时,新建会话会被调度拖慢:
uptime
free -h
df -h
df -i
iostat -xz 1 5 # sysstat 包
systemd-cgtop # 看哪个 slice 在抢资源
重点看:
-
load 长期高于 CPU 核数、
kswapd狂跑:内存吃紧,先杀泄漏进程或扩容。 -
根分区或
/var100%:日志爆满会导致认证写日志都阻塞。 -
inode 用尽(
df -i):小文件过多时表现为“还能 ping、SSH 却异常慢或失败”。
云主机还要看是否被邻居吵闹或触发了超卖限流;华为云等控制台里的监控(CPU、磁盘读写、入出向带宽)能快速排除“整机被打满”这类情况。
六、防火墙与连接跟踪
安全组放行了,本机防火墙仍可能对新建连接做额外检查。连接跟踪表满时,表现为偶发连不上或握手极慢:
# firewalld
firewall-cmd --list-all
# iptables / nftables 连接跟踪
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
dmesg | grep -i conntrack
若 count 长期逼近 max,调高 nf_conntrack_max 并排查谁在打短连接;同时确认 fail2ban / 云 WAF 没有把你的办公出口 IP 临时封禁。
七、一套最小复现与固化清单
按这个顺序走,通常十分钟内能定位:
-
ssh -vvv分清卡在网络、认证还是 shell 初始化。 -
服务器关掉
UseDNS、GSSAPIAuthentication,sshd -t后 reload。 -
客户端
IdentitiesOnly+ 指定一把密钥,避免盲试。 -
非交互
ssh host 'echo ok'对比,排除bashrc/motd。 -
查
uptime/free/df -i/iostat,排除资源打满。 -
查 conntrack、fail2ban、安全组,排除网络策略。
把确认有效的 sshd_config 片段纳入配置管理(Ansible/云初始化脚本),新机器出厂即关闭反向 DNS 和 GSSAPI,以后就很少再被“突然变慢”骚扰。排查时一次只改一处并留下变更记录,避免把安全收紧和性能优化搅在一起难回滚。
- 点赞
- 收藏
- 关注作者
评论(0)