服务器 ssh 连接超时如何解决

域名注册
域名注册 正式会员超兽战士 👑年卡会员
发布于 2026-10-07 05:48 ·1 浏览 ·0 回复

学完这篇,你能按「网络 → 端口 → 服务 → 配置」的顺序逐层定位 SSH 连接超时的原因,并动手把它修好。

第一步:判断超时发生在哪一层

这一步要确认到底是网络不通、端口没开,还是 SSH 服务本身的问题,做完你就能把排查范围缩小一半。

在本地依次执行:

ping -c 4 服务器IP          # 能通 → 网络层基本正常
nc -vz 服务器IP 22          # 输出 succeeded → 22 端口可达
telnet 服务器IP 22          # 看到 SSH-2.0-OpenSSH_x.x 说明服务在
ssh -vvv -p 22 用户@服务器IP # 卡在哪一步,日志里会写明

ssh -vvv 的输出关键看停在 Connecting to ... 还是 Server host key 之后:前者是网络/端口问题,后者是认证或服务端配置问题。

注意:云服务器上 ping 通不代表安全组放行了 22 端口,ICMP 和 TCP 是两套规则,必须用 nc 或 telnet 验端口。

第二步:检查服务器上的 sshd 是否在跑

这一步确认 SSH 服务进程状态和监听端口,做完能排除「服务挂了」或「换了端口」。

登录服务器(或用云控制台的 VNC 登录):

systemctl status sshd        # Ubuntu/Debian 上服务名是 ssh
ss -tlnp | grep sshd         # 看实际监听的是 22 还是别的端口
journalctl -u sshd -n 50     # 看最近 50 行日志里的报错

如果 ss 里显示的是 0.0.0.0:2222 之类,说明端口被改过,客户端要加 -p 2222。

第三步:放行防火墙和安全组

这一步解决「服务正常但连不上」的典型情况,做完端口才真正对外可达。

系统防火墙:

firewall-cmd --list-all                    # CentOS/RHEL,确认 22 在 services 里
firewall-cmd --add-service=ssh --permanent && firewall-cmd --reload
ufw status                                 # Ubuntu
ufw allow 22/tcp
iptables -L -n --line-numbers | grep 22    # 看有没有 DROP 规则

云服务器还要去控制台放行:阿里云 ECS 是「安全组 → 入方向 → 添加规则,协议 TCP,端口 22,源 0.0.0.0/0」;腾讯云 CVM 是「安全组 → 入站规则」;AWS EC2 是「Security Groups → Inbound rules」。

注意:云安全组的拦截发生在系统防火墙之前,只改系统防火墙通常没用,两边都要放行。

第四步:检查是否被 fail2ban 拉黑

这一步排查「昨天能连今天连不上」,做完能确认是不是密码试错太多被封了 IP。

fail2ban-client status sshd     # 看 Banned IP list 里有没有你的地址
fail2ban-client set sshd unbanip 你的公网IP

如果没装 fail2ban,也要看看 /etc/hosts.deny 里有没有你的 IP。

第五步:修 sshd 配置导致的「连接卡顿」

这一步解决「能连上但要等十几秒甚至几十秒」的超时,做完登录会明显变快。

编辑 /etc/ssh/sshd_config,确认或加上:

Port 22
ListenAddress 0.0.0.0
UseDNS no                    # DNS 反解超时是卡顿最常见的元凶
GSSAPIAuthentication no      # 避免 GSSAPI 协商等待
LoginGraceTime 30            # 认证宽限时间,别设太大
MaxStartups 10:30:100        # 并发未认证连接数上限
ClientAliveInterval 60       # 服务端每 60 秒发心跳
ClientAliveCountMax 3        # 连续 3 次无响应才断开

改完先校验再重载:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sshd -t                      # 语法检查,没输出就是通过
systemctl reload sshd

注意:不要用 systemctl restart sshd,万一配置写错又没有其他登录方式,你会直接把自己锁在外面。reload 失败至少旧连接还在。

第六步:客户端侧防止空闲断开

这一步解决「挂机几分钟就被踢」,做完长任务不会被中断。

在本机 ~/.ssh/config 里加:

Host *
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes
    ConnectTimeout 10

ServerAliveInterval 30 表示客户端每 30 秒发一次心跳,ConnectTimeout 10 表示建连超过 10 秒就放弃。命令行临时用也可以:ssh -o ServerAliveInterval=30 用户@IP。

注意:ClientAliveInterval 是服务端配置项,ServerAliveInterval 是客户端配置项,两个名字容易混,方向搞反了不生效。

小结

  • 排查顺序:ping → nc -vz → ssh -vvv → systemctl status sshd,逐层缩小范围。
  • 云服务器必须同时放行安全组和系统防火墙,安全组优先。
  • 连接慢多半是 UseDNS yes 和 GSSAPIAuthentication yes,改成 no 立刻见效。
  • 改 sshd_config 前先备份,用 sshd -t 校验,用 reload 而不是 restart。
  • 空闲被踢用客户端 ServerAliveInterval,服务端断开顽固连接看 ClientAliveInterval。
  • 突然连不上先查 fail2ban-client status sshd,很可能是自己把自己封了。
版权声明:本文来自 GJ论坛《服务器 ssh 连接超时如何解决》
原文链接:https://www.gj0.com/thread-104.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~