当 SSH 客户端返回 Connection timed out 时,说明 TCP 三次握手没有完成。客户端发出的 SYN 包在超时时间内没有收到对应的 SYN+ACK 响应,因此连接被中断。这不同于 Connection refused,后者表示目标主机明确回复了拒绝,通常说明端口未监听或服务未启动。Connection timed out 更偏向网络不可达、数据包被丢弃、安全策略拦截或目标主机根本不在公网上响应。排查时不能只盯着 SSH 服务本身,需要从网络外层逐步向内层收敛。

一、先确认基础网络连通性
拿到云服务器公网 IP 后,第一步建议使用 ping 命令测试 ICMP 可达性。在 Windows 本机打开命令提示符,执行 ping 加上公网 IP。如果能够收到回复,说明三层网络基本通畅;如果请求超时,也不要立刻断定服务器宕机,因为很多云平台默认禁止公网 ICMP,或者安全组没有放行 ICMP 协议,ping 不通但 SSH 可能正常。因此 ping 只能作为辅助参考,不能作为唯一判断依据。
更准确的测试方式是直接对 22 端口做 TCP 连通性检查。Windows 下可以在命令提示符中执行 telnet 公网IP 22,如果屏幕进入全黑或提示连接成功,说明 22 端口可达;如果长时间无响应并提示连接失败,基本可以确认数据包没有到达 SSH 服务。Windows 10 之后 telnet 客户端默认未启用,可以在控制面板的程序和功能中开启,或者使用 PowerShell 的 Test-NetConnection 命令。Linux 或 macOS 终端可以使用 nc -vz 公网IP 22,输出 succeeded 表示端口连通,timed out 表示不通。
如果 ping 不通但 telnet 22 端口通,说明云服务器在线,只是 ICMP 被限制,可以继续排查 SSH 配置。如果 ping 通但 telnet 22 端口超时,说明服务器可达,但 22 端口被某一层防火墙拦截,或 SSH 服务没有监听公网地址。如果两者都不通,问题很可能出在云平台安全组、本地网络出口或服务器网络配置上。
二、检查云安全组与系统防火墙规则
云服务器的安全组相当于虚拟防火墙,独立于操作系统运行。很多 Connection timed out 都是因为安全组入方向规则里没有放行 TCP 22 端口。登录云厂商控制台,找到对应实例的安全组配置,检查入方向规则是否包含协议类型 TCP、端口范围 22/22、源地址 0.0.0.0/0 或你的本地公网出口 IP。如果规则存在但源地址写成了内网网段,公网访问仍然会被丢弃。修改安全组后通常立即生效,不需要重启服务器。
系统防火墙是第二道防线。即使安全组放行,如果操作系统内部开启 iptables、firewalld 或 ufw 并阻断 22 端口,连接依然会超时。CentOS 7 以上常用 firewalld,可执行 firewall-cmd --list-ports 查看已放行端口;Ubuntu 使用 ufw status 查看状态。若 SSH 端口未放行,执行 firewall-cmd --permanent --add-port=22/tcp 并重载,或 ufw allow 22/tcp。对于 iptables,需要检查 INPUT 链中是否有 REJECT 或 DROP 规则覆盖了 22 端口。云安全组和系统防火墙必须同时放行,缺一不可。
| 检查位置 | 常见命令或入口 | 注意事项 |
|---|---|---|
| 云平台安全组 | 控制台安全组入方向规则 | 确认 TCP 22 端口源地址为 0.0.0.0/0 或指定公网 IP |
| firewalld | firewall-cmd --list-ports | 若未放行,执行 firewall-cmd --permanent --add-port=22/tcp 后重载 |
| ufw | ufw status | 执行 ufw allow 22/tcp 放行 SSH |
| iptables | iptables -L -n --line-numbers | 检查 INPUT 链默认策略和 22 端口规则顺序 |
三、确认 SSH 服务状态与监听地址
当网络和安全组都确认没有问题后,需要通过云厂商提供的 VNC 或远程控制台登录服务器。因为 SSH 已经无法连接,VNC 是唯一能进入系统的方式。登录后先检查 SSH 服务是否正在运行。CentOS 使用 systemctl status sshd,Ubuntu 使用 systemctl status ssh。如果服务处于 inactive 或 failed 状态,需要执行 systemctl restart sshd 或 systemctl restart ssh 启动,并设置开机自启。
服务正在运行不代表一定监听在公网可达的地址上。执行 ss -tlnp | grep :22 查看监听状态。如果输出显示 127.0.0.1:22,表示 SSH 只监听本地回环地址,公网客户端无法建立连接。如果显示 0.0.0.0:22 或 :::22,说明监听所有 IPv4 或 IPv6 地址,公网可达。若监听地址是内网 IP,则公网访问同样会超时。需要编辑 /etc/ssh/sshd_config,找到 ListenAddress 配置项,将其改为 0.0.0.0 或删除该行,同时确认 Port 为 22 或你自定义的端口,修改后重启 sshd 服务。
如果之前修改过 SSH 端口,但安全组仍然只放行 22,连接也会超时。此时需要回到安全组,将自定义端口加入入方向规则。另外,部分云服务器镜像默认禁用 root 密码登录,只允许密钥登录,这不会导致 connection timed out,只会在认证阶段失败,所以不需要混淆。
四、排查路由、专线及运营商端口封锁
在跨地域、跨运营商或走专线的网络环境中,中间路由设备可能对 22 端口做限制。可以使用 tracert 公网IP(Linux 为 traceroute)查看数据包在哪一跳中断。如果最后一跳是云服务器网关但之后没有响应,大概率是安全组或系统防火墙问题;如果中断在中间运营商节点,说明网络路径存在问题,可以尝试更换本地网络出口,比如切换到手机热点重新测试。如果手机热点能够正常连接,说明原网络运营商对 22 端口做了封锁,常见于部分家庭宽带或企业网络。
有些云厂商对海外地域的访问存在链路优化或限制,国内访问海外云服务器时可能出现间歇性超时。此时可以在云控制台申请更换公网 IP,或者使用中转服务器。还有一种情况是服务器 IP 被 DDoS 攻击触发黑洞或清洗,导致所有入站流量被丢弃。检查控制台是否有安全事件通知,如果有黑洞,需要等待解除或更换 IP。
五、使用抓包工具定位数据包丢弃位置
当常规检查仍然无法定位时,可以在服务器端使用 tcpdump 抓包。执行 tcpdump -i any port 22 -nn,然后从客户端尝试 SSH 连接。如果服务器端完全没有输出任何 SYN 包,说明数据包在到达服务器之前就被丢弃,问题集中在安全组、运营商或本地防火墙。如果服务器端能够看到 SYN 包但没有响应,可能是系统防火墙丢包或 SSH 服务异常。如果看到 SYN 和 SYN+ACK 来回,但客户端仍然超时,说明返回路径被拦截,需要检查出方向规则或本地防火墙。
客户端也可以使用 Wireshark 或 tcpdump 抓包,观察是否有发出的 SYN 包以及是否收到响应。对比两端抓包结果,可以快速判断丢包发生在哪个方向。对于 Windows 客户端,还可以使用 pktmon 或安装 Npcap 后使用 Wireshark 过滤 tcp.port==22。这类底层抓包方式能排除猜测,提高排查效率。
六、更换 SSH 端口作为临时或永久方案
如果确认是运营商封锁了 22 端口,最直接的解决方式是修改 SSH 监听端口。编辑 /etc/ssh/sshd_config,将 Port 22 改为 Port 2222 或其他高位端口,保存后重启 sshd 服务。同时需要在云安全组和系统防火墙中放行新端口,并删除或保留原 22 端口规则。修改端口后,客户端连接命令需要指定新端口,例如 ssh -p 2222 用户名@公网IP。如果修改后连接成功,说明原 22 端口确实被外部策略阻断。
不建议将端口设置为常见的 2222、22222 等容易被扫描的端口,可以选择 10000 到 65535 之间不常用的数值。但要注意,非标准端口并不能替代安全组和密钥认证,仍需保留严格的访问控制策略。某些企业网络只允许出站访问固定端口,修改 SSH 端口后需要同步调整本地防火墙或代理规则,否则新端口也可能超时。
七、排查步骤速查表
| 排查步骤 | 操作命令 | 预期结果 | 异常对应原因 |
|---|---|---|---|
| TCP 端口连通性 | telnet 公网IP 22 或 nc -vz 公网IP 22 | 连接成功 | 超时则继续下一步 |
| 安全组入方向 | 控制台查看 | TCP 22 端口放行 | 未放行导致超时 |
| 系统防火墙 | firewall-cmd --list-ports 或 ufw status | 22 端口放行 | 未放行导致超时 |
| SSH 服务状态 | systemctl status sshd | active (running) | 未运行或启动失败 |
| 监听地址 | ss -tlnp | grep :22 | 0.0.0.0:22 或 :::22 | 仅监听 127.0.0.1 导致公网超时 |
| 网络路径 | tracert 公网IP | 最终到达云服务器网关 | 中间节点中断或运营商封锁 |
| 服务器抓包 | tcpdump -i any port 22 -nn | 能看到客户端 SYN 包 | 看不到 SYN 说明被外部拦截 |
Connection timed out 的根因通常并不复杂,但涉及网络、云平台、操作系统多个层面。按照先测试连通性、再查安全组和防火墙、然后确认 SSH 服务与监听地址、最后抓包或更换端口的顺序,可以避免盲目重启服务器或反复修改配置。大部分情况下,安全组未放行和系统防火墙拦截是两个最高频的原因,优先核对这两处能快速解决问题。若仍无法连接,再考虑运营商限制或网络路径异常,并通过更换端口和抓包进一步验证。
云服务器SSH连接失败Connection timed outSSH排查修改时间:2026-08-23 21:51:31