很多人第一次给 VPS 开防火墙,最容易犯的错不是“没开安全防护”,而是先执行了:
sudo ufw enable
然后当前 SSH 还能撑一会儿,新开终端却连不上了。再过一会儿,网络抖一下,现有 SSH 也断了,服务器就像把你锁在门外。
这种情况很常见,尤其是 Ubuntu / Debian 系统。UFW 本身没问题,它只是把你没有明确放行的入站连接拦住了。真正的问题通常在三处:
- 没有先放行 SSH 端口
- SSH 改过端口,但只放行了 22
- 云厂商安全组和系统 UFW 规则互相打架
这篇按“还能连上”和“已经连不上”两种状态来处理。先别急着重装系统,大部分情况都能救回来。
如果你还有一个没有断开的 SSH 窗口,优先在这个窗口里操作,不要关掉它。
如果你已经完全连不上,但 VPS 控制台里有 VNC、Console、Serial Console、Rescue Mode,也还有机会恢复。
先看报错:
ssh root@your_server_ip
常见表现大概是这几类:
| 现象 | 更可能的原因 |
|---|---|
Connection timed out | 防火墙、安全组、端口未放行 |
Connection refused | SSH 服务没监听,或端口不对 |
Permission denied | 密钥、用户、权限问题 |
| 只有公司/家里网络连不上 | 本地 IP 被限制或 Fail2Ban 误封 |
如果你看到的是 Permission denied,重点不在 UFW,可以先看这篇:VPS SSH Permission denied 怎么办。
如果是 Connection timed out,这篇继续往下排。
这是最好救的情况。先不要重启,不要退出,不要关闭终端。
sudo ufw status verbose
如果看到类似:
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
说明入站默认拒绝。接下来要确认 SSH 端口是否放行。
不要凭感觉猜端口。直接看监听:
sudo ss -lntp | grep ssh
可能看到:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=888,fd=3))
也可能是:
LISTEN 0 128 0.0.0.0:2222 0.0.0.0:* users:(("sshd",pid=888,fd=3))
再查配置文件确认:
sudo grep -E '^Port|^ListenAddress' /etc/ssh/sshd_config
如果没有输出 Port,通常就是默认 22。
如果 SSH 是默认 22:
sudo ufw allow OpenSSH
sudo ufw allow 22/tcp
OpenSSH 是 UFW 的应用配置,通常等价于放行 22,但我更建议同时明确写一条 22/tcp,以后排查时更直观。
如果你改成了 2222:
sudo ufw allow 2222/tcp
如果你不确定端口,先不要乱删规则,先把当前 SSH 监听端口放进去。
sudo ufw reload
sudo ufw status numbered
你应该能看到类似:
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 2222/tcp ALLOW IN Anywhere
然后不要退出当前窗口,另开一个新终端测试:
ssh root@your_server_ip
如果你用的是自定义端口:
ssh -p 2222 root@your_server_ip
新窗口能连上,再关闭旧窗口。
很多 VPS 面板提供 VNC Console、Serial Console 或 Web Console。它不走公网 SSH 端口,所以 UFW 把 SSH 挡住时,控制台通常还能打开。
进入控制台后,先登录系统。然后执行:
sudo ufw status numbered
如果只是 SSH 端口没放行,直接补规则:
sudo ufw allow 22/tcp
sudo ufw reload
如果你不确定 SSH 端口:
sudo ss -lntp | grep ssh
sudo grep -E '^Port|^ListenAddress' /etc/ssh/sshd_config
再按实际端口放行:
sudo ufw allow 2222/tcp
sudo ufw reload
如果你急着先恢复访问,可以临时关闭 UFW:
sudo ufw disable
但这只是临时自救。能重新 SSH 登录后,建议马上补回最小规则:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
如果你的 SSH 不是 22,把 22/tcp 换成实际端口。
如果 VPS 面板没有可用控制台,或者控制台登录不了,就要用 Rescue Mode。不同厂商名字不一样,常见叫法有:
- Rescue Mode
- Recovery Mode
- Rescue ISO
- Boot from ISO
- Emergency Console
进入救援模式后,系统通常会启动到一个临时 Linux 环境。你要做的是挂载原系统磁盘,进去修改 UFW 规则或直接禁用 UFW。
先看磁盘:
lsblk
假设原系统分区是 /dev/vda1,挂载它:
sudo mkdir -p /mnt/sysroot
sudo mount /dev/vda1 /mnt/sysroot
如果有单独的 boot、efi 分区,要按实际情况挂载。普通小 VPS 多数只有一个根分区。
进入原系统:
sudo mount --bind /dev /mnt/sysroot/dev
sudo mount --bind /proc /mnt/sysroot/proc
sudo mount --bind /sys /mnt/sysroot/sys
sudo chroot /mnt/sysroot
禁用 UFW:
ufw disable
或者补放行规则:
ufw allow 22/tcp
ufw reload
退出并重启:
exit
sudo reboot
如果你不熟悉救援模式,可以配合这篇看:VPS 救援模式怎么用。
很多人只改了系统里的 UFW,却忘了云厂商面板还有一层防火墙。
公网访问链路通常是:
你的电脑 -> 云厂商安全组/防火墙 -> VPS 系统 UFW -> sshd 服务
任何一层不通,SSH 都连不上。
所以你要同时检查:
- 云厂商安全组是否放行 SSH 端口
- 入站规则是不是只允许了某个 IP
- VPS 是否绑定了正确的公网 IPv4 / IPv6
- 系统 UFW 是否放行同一个端口
- sshd 是否真的监听这个端口
如果你的站点服务也访问不了,排查思路可以参考:VPS 服务启动了但外网访问不了。
以后别直接 ufw enable。更稳的顺序是:
sudo ufw status verbose
sudo ss -lntp | grep ssh
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --dry-run enable
sudo ufw enable
sudo ufw status numbered
如果你用自定义 SSH 端口,比如 2222:
sudo ufw allow 2222/tcp
然后另开一个 SSH 窗口测试,确认新连接可用后再关旧连接。
--dry-run 不会真的启用规则,但能让你看 UFW 会做什么。它不能替你发现所有问题,但比直接开防火墙安全。
如果 VPS 上跑 Docker,只看 UFW 可能会误判。Docker 会改 iptables 规则,有些端口即使 UFW 看起来没放行,也可能因为 Docker 端口映射暴露到公网。
比如:
docker run -p 8080:80 nginx
这类端口不一定完全受 UFW 控制。生产环境更建议:
- 云厂商安全组只放必要端口
- Docker 服务尽量绑定到
127.0.0.1 - 外部访问统一走 Nginx / Caddy 反代
- 不要把数据库、Redis、管理后台直接映射公网
如果你是因为 Docker 服务访问异常,可以再看:VPS Docker 容器一直 Restarting 怎么办。
如果 SSH 还是默认 22,通常没问题。但如果你改过 /etc/ssh/sshd_config 里的 Port,OpenSSH 可能救不了你。
稳妥做法是按实际端口放行:
sudo ufw allow 2222/tcp
系统里放行了 2222,云面板只放了 22,也会超时。
要两边一致。
ufw status numbered 的编号会随着删除变化。一次删一条,删完重新查看:
sudo ufw status numbered
sudo ufw delete 3
sudo ufw status numbered
不要凭旧编号连续删。
UFW 本质上是前端工具,底层还是规则系统。你如果又手写 iptables / nftables,又用 Docker,又开云防火墙,排查会变复杂。
普通 VPS 建议先保持简单:云防火墙管公网入口,UFW 做系统内最小放行。
如果你现在 SSH 进不去,按这个顺序做:
- 看 SSH 报错是
timed out还是Permission denied - 检查云厂商安全组是否放行 SSH 端口
- 尝试 Web Console / VNC Console 登录
- 执行
ufw status numbered - 用
ss -lntp | grep ssh找 SSH 真实端口 - 放行真实端口:
ufw allow 端口/tcp ufw reload后另开窗口测试- 控制台也不行,再进 Rescue Mode 禁用或修复 UFW
- VPS 被 Fail2Ban 误封怎么办:如果你怀疑是本机 IP 被封,不是 UFW 问题,看这篇。
- VPS SSH Permission denied 怎么办:如果 SSH 能连到服务器但认证失败,看密钥、用户和权限。
- VPS 救援模式怎么用:如果控制台进不去,需要从救援环境修系统。
最后记住一句:开启 UFW 前,先放行当前 SSH 端口,并保持一个旧 SSH 窗口不断开。防火墙不是越快开启越安全,规则顺序错了,最先拦住的往往是你自己。
