甲骨云服务器运维实战系列——家里连不上云服务器:TCP 能连、SSH 一握手就断,是端口被拦了

admin admin
2026-10-22 发布 | 3073 字 | 预计 8 分钟 | 3 次阅读 | 0 条评论

云服务器运维实战系列 · 第 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 监听、防火墙规则和本机连接。
先确认 sshd 监听、防火墙规则和本机连接。
Bash
Bash
# sshd 是否在跑、监听哪个端口
sudo ss -tlnp | grep -E ':22|:8443'

# 本机连自己,验证服务正常
ssh -p 22 用户名@127.0.0.1

再看本机防火墙是否放行(甲骨文镜像默认 iptables 有兜底 REJECT,需要显式放行):

Bash
Bash
sudo iptables -L INPUT -n --line-numbers | grep -E '22|REJECT|DROP'
sudo ufw status

如果本机连 127.0.0.1 正常、防火墙也放行了 22,但外网就是连不上,问题基本不在服务器。

第二步:看服务端有没有你的连接记录

这是判断"封锁发生在哪一段"的关键。在家里反复连接的同时,看服务器日志:

服务端无连接记录,问题可能发生在到达 sshd 之前。
服务端无连接记录,问题可能发生在到达 sshd 之前。
Bash
Bash
sudo tail -30 /var/log/auth.log | grep -E "Connection from|Failed|Accepted"
  • 如果日志里完全没有你家里 IP 的连接记录,但客户端却显示"TCP 已连接",说明连接在到达 sshd 之前就被中间设备处理掉了;

  • 如果有记录并显示 Accepted,那是连上后又被断开,方向另查。

我这边:家里连接时服务端毫无记录,手机热点连接立刻有 Connection from 和 Accepted。说明问题出在家宽到服务器之间的链路,针对 22 端口。

第三步:用 TCP 探测验证端口可达性

区分"端口被拦"还是"整条线路不通":

Bash
Bash
# 在家用机器上探测 22 端口
nc -vz <服务器IP> 22

# 对比探测一个确定开放的端口,如 443
nc -vz <服务器IP> 443

结果是:443 能通,22 要么超时、要么连上立刻被 reset。同一台服务器、同一个出口 IP,只有特定端口异常,这就是端口级封锁的特征——不是 IP 被封,而是 22 这个端口在家宽这条路上被设备干预了(家宽网络常见对 22 等端口做限制或干扰)。

对比同一线路的 22 与 443,判断是否端口级干预。
对比同一线路的 22 与 443,判断是否端口级干预。

第四步:确认是不是 fail2ban / 连接数

也要排除服务器端把你"ban"了的可能:

Bash
Bash
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 换一个高位端口。 家宽通常只针对常见端口,换个不常见的端口往往就通了:

Bash
Bash
# 新增监听端口(保留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. 临时用手机热点 / 其他网络。 排查和应急很方便,也能用来反证是不是家宽的问题。

排查顺序小结

  1. 服务器上确认 sshd 正常、防火墙放行、本机可连;

  2. 连接时看 auth.log 有没有你的记录——没有,说明没到服务器;

  3. nc 对比探测 22 和 443,只有 22 异常即端口级封锁;

  4. 排除 fail2ban、连接数、MaxStartups;

  5. 换高位端口,或走 443 反代,应急用热点。

判断要点就一条:同一条线路、同一台机器,别的端口通、只有某个端口不通,问题就不在你的服务器,而在中间网络对该端口的处理。

全文完
全站文章均为原创,转载请保留署名和出处。
阅读 3 次