题目解决-毗连ssh很慢

[复制链接]
发表于 2026-10-3 16:14:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

SSH 连接慢,先定位卡在哪一步

SSH 连接慢的成因很多,但它有个特点:慢的位置往往能一眼看出来。最有效的第一步是加 -v 看握手过程停在哪:

ssh -v [email protected]

输出里一般是这几段:Connecting(DNS/建立 TCP)、authenticating(密钥/密码交互)、Entering passphrase(读私钥)。卡在 Connecting 多半是网络或 DNS;卡在 authenticating 多半是服务端配置(GSSAPI、UseDNS)或认证方式;卡在读取密钥就是本机私钥环节。

另一半信息在服务端日志日志里:/var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL),登录的每次尝试都记着。

常见原因一:DNS 反向解析

原因:SSH 服务器会对客户端 IP 做一次反向 DNS 解析(把 IP 换成主机名,用于日志日志可读),解析不通或超时就会干等,表现就是"连上了但半天要密码"。

解决:在服务端 /etc/ssh/sshd_config 里加:

UseDNS no

然后重启 SSH 服务:

sudo systemctl restart sshd

常见原因二:GSSAPI 认证

原因:GSSAPI(常用于 Kerberos 域认证)在没有 KDC 的环境里会先去试探认证,白白消耗时间。

解决:同样在 sshd_config 里:

GSSAPIAuthentication no

重启 sshd 生效。sudo systemctl restart sshd 一条搞定。

常见原因三:客户端自己的配置

原因:客户端也可能在开连之前就尝试 GSSAPI 或做 DNS 解析。

解决:编辑客户端的 ~/.ssh/config(没有就新建一个):

Host *
    GSSAPIAuthentication no
    UseDNS no
    ConnectTimeout 10

按主机分组还能写成:

Host prod-*
    HostName 10.0.0.%h
    PreferredAuthentications publickey
    IdentityFile ~/.keys/id_ed25519

容易被漏掉的 IPv6 陷阱

一个非常常见、而且答案往往不在上面几条里的原因:域名没有 AAAA 记录,但系统优先解析 IPv6。客户端会先连 IPv6 地址,等超时(几秒到十几秒)再回退 IPv4,表现就是"每次连接都要愣一下"。

验证:

ssh -4 user@host          # 强制只用 IPv4,如果瞬间连上,就是它
dig AAAA host

解决办法任选:ssh -4 或客户端配置里加 AddressFamily inet;或者干脆给域名补上 AAAA 记录。

其他排查项

4. 网络本身

  • 用 ping 看延迟与丢包;
  • 用 traceroute(或 mtr)看路由有没有异常绕路;
  • 带宽不足或链路抖动都会让交互明显变卡。

5. 服务器负载高

  • top / htop 看 CPU、内存;iotop 看磁盘 I/O;
  • 负载打满时 sshd 连上的响应自然慢。

6. 防火墙与安全组

  • 云上安全组、本机 iptables/firewalld 规则不当会拖慢甚至拒连;
  • 注意检查客户端与服务器之间的所有中间设备,别有不必要的阻塞。

7. 密钥认证环节

  • 私钥权限不对(应为 600)、或者私钥放在网络盘/NFS 上,读取会很慢;
  • 用 ssh-agent 缓存私钥,省掉反复读取与解密口令的时间;
  • 密钥太旧(如 1024 位 RSA)在某些实现里协商也偏慢,换 ed25519 会快不少。

8. 系统日志日志写入慢

  • /var/log 下日志暴涨会拖慢写盘;
  • 把日志轮转(logrotate)和清理策略配好。

一起加上:连接超时与断线

顺手把这三条也写进 ~/.ssh/config,运维体验会好很多:

Host *
    ServerAliveInterval 30       # 每 30 秒保活一次,防止长时间空闲被中间设备掐断
    ServerAliveCountMax 3        # 连续 3 次没回应就断开
    ConnectTimeout 10            # 连不上 10 秒就放弃,别干等
    StrictHostKeyChecking accept-new

再加个 ControlMaster auto + ControlPath 开连接复用,同一台机器反复 scp 时能快一个量级:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/ctrl/%h-%p-%r
    ControlPersist 60s

一个稳妥的排查顺序

  1. ssh -v 看卡在哪段;
  2. 服务端 /var/log/auth.log(或 /var/log/secure)看有没有异常日志;
  3. 服务端 sshd_config 关掉 UseDNS 和 GSSAPIAuthentication;
  4. 客户端 ~/.ssh/config 同样关掉两项,并加 AddressFamily inet(若域名无 AAAA);
  5. ping / traceroute 看网络;top 看服务器负载;
  6. 重启 sshd 后复测——改完没重启等于没改。

有一点容易踩:systemctl restart sshd 在连接密集的生产机上会短暂断开存量会话,夜里维护做最合适;急事可以用 systemctl reload(reload 会重读部分配置,但 UseDNS / GSSAPIAuthentication 这类需 reload 后才生效的参数,稳妥起见还是走 restart)。

小结

SSH 慢绝大多数时候不是 SSH 本身慢,而是握手过程中被一些"看起来该做"的额外动作拖住了。四个高频元凶:反向 DNS(UseDNS)、GSSAPI 认证、IPv6 回退超时、私钥读取(NFS/权限/密钥类型)。

一句话解法:服务端 UseDNS no + GSSAPIAuthentication no,客户端 ~/.ssh/config 关这两项并把 AddressFamily inet 必上,再配上 ServerAliveInterval 保活,八成的"SSH 卡半分钟"就消失了。剩下的交给 ssh -v 和 /var/log/auth.log 继续定位。

(本文由 qidao123.com企服评测-应用市场 编辑提示整理:配置适用于 OpenSSH 7.x/8.x 的 Linux 环境,改 sshd_config 前建议先备份,生产重启请选业务低峰。)

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表