ufw status仅显示高层策略和显式添加的规则(如“80 ALLOW Anywhere”),不反映默认策略绕过、IPv6独立规则、Docker等直写nftables的bypass规则,也无法体现本地回环流量不受管控等底层细节。

Ubuntu 默认用 ufw 管理防火墙,但规则实际由 nftables 执行;直接看 ufw status 只能查到高层策略,底层放行/拦截细节得看 nft list ruleset 或 iptables -L -n -v。
ufw status 能看到什么?哪些情况它会“说谎”
执行 sudo ufw status 命令,会展示当前的启用状态以及明确添加的规则(例如 22/tcp ALLOW Anywhere)。然而,它无法反映出这些情况:默认策略是否被绕过、IPv6规则是否独立生效、或者某些服务(像Docker)悄然插入的bypass规则。打个比方,你执行了 ufw allow 80 命令,但nginx实际监听在 127.0.0.1:80,此时 ufw status 依然会显示“ALLOW”,但连接却会失败——原因在于该规则仅对入向流量起作用,而本地回环不受ufw的管控。
建议搭配以下命令交叉验证:
sudo ufw status verbose:看协议类型(tcp/udp)、方向(IN/OUT)、日志开关sudo ufw show raw:输出原始规则链顺序,确认默认策略(如ufw-before-input链末尾的DROP)是否真起作用sudo ufw status numbered:删错规则时避免误删,编号对应ufw delete <编号>
为什么 iptables -L 看不到规则?该用 nft 还是 iptables
Ubuntu 22.04+ 默认用 nftables 后端,但保留了 iptables 命令兼容层。执行 sudo iptables -L -n -v 有时显示空或旧规则,是因为:
- 实际规则存在 nftables 表里,iptables 只是映射视图
- IPv6 规则必须用
ip6tables -L -n单独查,ufw 不自动同步 IPv6 策略 - 某些 snap 应用或 docker 会直写 nftables,绕过 ufw 抽象层
正确做法是优先用:sudo nft list ruleset。它输出完整结构(table → chain → rule),包括注释、字节计数、跳转目标。若习惯 iptables 语法,可加 | grep -A5 'chain input' 快速定位入站链。
如何确认某个端口是否真被放行
ufw status 显示 8080 ALLOW 不等于你能从外网访问它。需分三步验证:
- 本机连自己:
nc -zv 127.0.0.1 8080—— 排除服务未启动 - 局域网其他机器连这台 IP:
nc -zv 192.168.x.x 8080—— 排除 ufw 的Anywhere是否含糊(比如规则绑定了特定 interface) - 检查是否被云平台安全组或物理路由器拦截 —— 此时
ufw和nft都正常,但流量根本到不了系统
特别注意:ufw 默认不管理转发流量(forward chain),如果你开了 NAT 或容器桥接,得额外查 nft list chain ip filter forward。
日志里看不到被拦的包?可能根本没过 ufw
启用 sudo ufw logging on 后,只记录匹配 ufw 规则的包(比如命中 ufw-user-input 链)。但若包被更早的链(如 ufw-before-input)丢弃,或走的是 raw 表提前标记,就不会进 ufw 日志。
排查方法:
- 先确认日志路径:
sudo tail -f /var/log/ufw.log - 临时开全量日志:
sudo ufw logging full(仅调试,性能损耗大) - 更可靠的方式是抓包:
sudo tcpdump -i any port 8080 -nn,看 SYN 包是否发出、是否有 RST 回复
真正容易被忽略的点是:ufw 规则只作用于 IPv4 的 filter 表,而 nftables 的 inet family 同时管 IPv4/IPv6,且 Docker 默认创建独立的 nft 表,完全游离于 ufw 之外。