远程连不上服务器大概率因ufw启用前未放行ssh端口;须先sudo ufw allow 22/tcp再sudo ufw enable,且default deny incoming前必须已配置ssh规则,否则将被锁。

远程连不上服务器?大概率是 ufw 启用前没放行 SSH 端口,直接把自己锁在外面了。这不是配置失败,而是顺序错了——先设规则,再启防火墙,这是唯一安全路径。
ufw status 显示 inactive 就别急着 enable
几乎所有刚接触 ufw 的人第一步就卡在这儿:sudo ufw status 输出 Status: inactive,以为要立刻 enable。其实此时防火墙根本没在工作,所有端口天然放行。贸然 enable 且无规则,等于瞬间切断所有入站连接。
- 必须先确认当前是否已有其他防火墙(如
iptables或nftables)在运行,冲突会导致规则不生效:运行sudo iptables -L和sudo nft list ruleset查看 - Ubuntu 24.04+ 默认已预装
ufw,无需安装;若提示命令不存在,才需sudo apt install ufw -y -
sudo ufw status verbose比普通status多显示默认策略和协议细节,排查时优先用它
default deny incoming 必须配合 allow ssh 才能保命
设默认拒绝入站流量本身没错,但 sudo ufw default deny incoming 单独执行就是高危操作。它不关心你有没有 SSH 规则,一启用就生效。
- 务必在执行该命令前,先加一条明确的 SSH 允许规则:
sudo ufw allow 22/tcp(或sudo ufw allow ssh) - 如果用了非标端口(比如
2222),规则必须写成sudo ufw allow 2222/tcp,仅写2222会同时放行 UDP,不安全 - 若已锁机,只能通过本地控制台或云平台 VNC 进入,然后
sudo ufw reset清空规则再重来
allow 80 和 allow http 不等价,协议细节决定能否访问
看似等效的写法,在实际中可能一个通、一个不通。关键在协议隐含行为:
-
sudo ufw allow 80—— 默认同时允许 TCP 和 UDP 的 80 端口,但 HTTP 只走 TCP,UDP 80 几乎无用,还多开攻击面 -
sudo ufw allow http—— 实际等价于sudo ufw allow 80/tcp,更精准,推荐用这种服务名方式 - HTTPS 同理:
sudo ufw allow https比sudo ufw allow 443更稳妥,避免误放 UDP 443 - 若服务监听在 IPv6,确保
/etc/default/ufw中IPV6=yes已启用,否则规则对 IPv6 流量无效
ufw delete 删除规则不能只靠端口号
删错规则是常见问题。比如你执行过 sudo ufw allow 80 和 sudo ufw allow 80/tcp,它们会被视为两条独立规则,sudo ufw delete allow 80 只删第一条。
- 最可靠的方式是先用
sudo ufw status numbered查看带编号的规则列表 - 再按编号删除:
sudo ufw delete 3(假设第 3 条是你想删的) - 或者用完整匹配删除:
sudo ufw delete allow 80/tcp,注意协议必须完全一致 - 别依赖
sudo ufw reset频繁清空——它会抹掉所有自定义规则,包括你可能忘了的白名单 IP
真正容易被忽略的点是:ufw 本身不管理 Docker 容器的端口映射。如果你跑着容器并映射了 -p 8080:80,ufw 规则必须针对宿主机的 8080 端口设,而不是容器内的 80。这点不注意,规则写了也白写。










