云服务器运维实战系列 · 第 6 篇(共 7 篇)
家里连不上云服务器:TCP 能连、SSH 一握手就断,是端口被拦了
从家里连云服务器,会遇到一种很隐蔽的情况:网络看着是通的,端口也像开着,但 SSH 刚握手就被掐断,报 Connection closed、Connection reset,或者干脆超时。换手机热点却能正常连。
这篇记录怎么一步步确认问题出在端口、而不是服务器,以及怎么绕过去。
先分清是哪种"连不上"
不同报错指向不同环节,先对号入座:
| 现象 | 大致含义 |
|---|---|
Connection refused | 网络通,但目标端口没有服务监听(服务没起 / 端口错) |
Connection timed out | 包发出去没回应,可能被防火墙静默丢弃 |
Connection reset / closed | 连上了,但中途被设备主动掐断 |
| 能 TCP 连通,握手立刻断 | 典型的中间设备针对端口的干预 |
我遇到的是最后一种:SSH 客户端显示连接建立,紧接着 Connection closed by <IP> port 22,服务端没留下拒绝记录。
第一步:在服务器上确认服务和防火墙
先排除服务器自身问题。在能登录的通道(其他网络、面板终端、串口控制台)上检查:

# sshd 是否在跑、监听哪个端口 sudo ss -tlnp | grep -E ':22|:8443' # 本机连自己,验证服务正常 ssh -p 22 用户名@127.0.0.1
再看本机防火墙是否放行(甲骨文镜像默认 iptables 有兜底 REJECT,需要显式放行):
sudo iptables -L INPUT -n --line-numbers | grep -E '22|REJECT|DROP' sudo ufw status
如果本机连 127.0.0.1 正常、防火墙也放行了 22,但外网就是连不上,问题基本不在服务器。
第二步:看服务端有没有你的连接记录
这是判断"封锁发生在哪一段"的关键。在家里反复连接的同时,看服务器日志:

sudo tail -30 /var/log/auth.log | grep -E "Connection from|Failed|Accepted"
如果日志里完全没有你家里 IP 的连接记录,但客户端却显示"TCP 已连接",说明连接在到达 sshd 之前就被中间设备处理掉了;
如果有记录并显示
Accepted,那是连上后又被断开,方向另查。
我这边:家里连接时服务端毫无记录,手机热点连接立刻有 Connection from 和 Accepted。说明问题出在家宽到服务器之间的链路,针对 22 端口。
第三步:用 TCP 探测验证端口可达性
区分"端口被拦"还是"整条线路不通":
# 在家用机器上探测 22 端口 nc -vz <服务器IP> 22 # 对比探测一个确定开放的端口,如 443 nc -vz <服务器IP> 443
结果是:443 能通,22 要么超时、要么连上立刻被 reset。同一台服务器、同一个出口 IP,只有特定端口异常,这就是端口级封锁的特征——不是 IP 被封,而是 22 这个端口在家宽这条路上被设备干预了(家宽网络常见对 22 等端口做限制或干扰)。

第四步:确认是不是 fail2ban / 连接数
也要排除服务器端把你"ban"了的可能:
sudo fail2ban-client status sshd 2>/dev/null || echo "无 fail2ban" sudo ss -tnp | grep ":22" | grep -v LISTEN | wc -l grep -E "MaxStartups|Port " /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null
如果 fail2ban 的封禁列表里有你家里的出口 IP,解封即可(sudo fail2ban-client set sshd unbanip <IP>)。我这边没有 fail2ban 记录,连接数也正常,排除。
怎么绕过
确认是家宽针对端口的限制后,有三条路,按方便程度排:
1. 给 SSH 换一个高位端口。 家宽通常只针对常见端口,换个不常见的端口往往就通了:
# 新增监听端口(保留22,确认新端口可用后再决定是否关22) echo "Port 8443" | sudo tee -a /etc/ssh/sshd_config sudo systemctl restart ssh # 放行新端口:iptables 和 ufw 都要 sudo iptables -I INPUT -p tcp --dport 8443 -j ACCEPT sudo ufw allow 8443/tcp 2>/dev/null || true
连接:ssh -p 8443 用户名@<IP>。
2. 走 443,用 Nginx 反代/SSL 隧道。 443 几乎不会被家宽拦(拦了所有 HTTPS 网站都受影响)。把 SSH 藏到 443,或用 Nginx 按 SNI/流量特征分流,是最稳的长期方案。我同时也用 443 反代面板,访问明显稳定。
3. 临时用手机热点 / 其他网络。 排查和应急很方便,也能用来反证是不是家宽的问题。
排查顺序小结
服务器上确认 sshd 正常、防火墙放行、本机可连;
连接时看
auth.log有没有你的记录——没有,说明没到服务器;nc对比探测 22 和 443,只有 22 异常即端口级封锁;排除 fail2ban、连接数、MaxStartups;
换高位端口,或走 443 反代,应急用热点。
判断要点就一条:同一条线路、同一台机器,别的端口通、只有某个端口不通,问题就不在你的服务器,而在中间网络对该端口的处理。