Rocky 10:firewalld 规则藏在 nft,不在 iptables
Rocky Linux 10.2 虚拟机(最小化安装),firewalld 2.4.0、nftables 1.1.5、iptables-nft 1.8.11。
在同一个会话里完成:查后端 → 看两张表 → 加一条放行 → 对比两侧输出(截图 public/evidence/nftables/rocky-iptables-vs-nft.png)。
$ grep -E "^FirewallBackend" /etc/firewalld/firewalld.confFirewallBackend=nftablesEL10 的 firewalld 默认把规则写进 nftables 的 inet firewalld 表;iptables 命令虽然还能用(由 iptables-nft 提供),但它操作的是另一张表。所以 iptables -L 看起来「什么都没有」。
看两张表的区别
Section titled “看两张表的区别”$ nft list tablestable inet firewalld
$ iptables -nLChain INPUT (policy ACCEPT)target prot opt source destinationnft list tables 告诉你「谁在这台机器上建了表」,iptables -nL 只看得到 iptables-nft 自己那张。两者不是同一个视图。
加规则做对照
Section titled “加规则做对照”$ firewall-cmd --add-service=httpsuccess$ iptables -nL | grep -c 'dpt:80'0$ nft list chain inet firewalld filter_IN_public_allow tcp dport 22 accept ip6 daddr fe80::/64 udp dport 546 accept tcp dport 9090 accept ip saddr 10.0.0.0/24 tcp dport 8443 accept tcp dport 80 accept放行确实生效了(nft 侧有 tcp dport 80 accept),但用 iptables 永远查不到。用 iptables 验证 firewalld 是否放行,在 EL10 上必然误判。

排障时按这个顺序看
Section titled “排障时按这个顺序看”firewall-cmd --state—— 服务是否运行;firewall-cmd --get-active-zones—— 接口落在哪个 zone;firewall-cmd --list-all—— 该 zone 放行了什么;nft list chain inet firewalld filter_IN_<zone>_allow—— 需要看原始规则或顺序时。
前三步能解决九成问题,第四步用于确认「规则是否真的在链上」。
iptables 后端还能用,但别用
Section titled “iptables 后端还能用,但别用”firewalld.conf 里写得很直白:
# Note: The iptables backend is deprecated. It will be removed in a future release.改回 iptables 只是把技术债往后拖;EL10 之后就没有这个选项了。
- 空 iptables 误判为没防护:
firewall-cmd --list-all才是结论; - 手写 iptables 规则与 firewalld 并存:两套表各自生效,命中顺序难以推理,reload 也清不掉手写规则;
- 以为
--direct规则能被 iptables 看到:direct 规则同样进inet firewalld; - 容器场景:podman 会建自己的 nft 表,
nft list tables里出现多张表是正常的。
练习:三分钟验证
Section titled “练习:三分钟验证”sudo firewall-cmd --statenft list tablessudo firewall-cmd --add-service=httpssudo nft list chain inet firewalld filter_IN_public_allow | grep "dport 443"sudo iptables -nL | grep -c "dpt:443"sudo firewall-cmd --remove-service=https检查:
- 第二条能看到
table inet firewalld; - 第四条能 grep 到
dport 443; - 第五条计数为 0(iptables 看不到);
- 最后撤销放行,恢复原状。
常见问题
为什么 EL10 默认换成 nftables?
nftables 是 iptables 的后继实现,单表结构、原子更新、性能更好;firewalld 从 0.9 起就支持,EL10 把它设为唯一推荐后端。
还需要装 iptables 吗?
最小化安装默认没装 iptables 主包,只有 iptables-nft 提供兼容命令;除非有只认 iptables 的旧脚本,否则不需要。
怎么把旧 iptables 规则迁过来?
优先改写成 firewall-cmd 的 --add-port/--add-rich-rule;确有复杂需求可先用 iptables-save 记录,再逐条映射到 nft 规则并验证。
- zone 概念:/firewalld-zones/
- rich rule:/firewalld-rich-rules/
- 网络基础:bond 与 VLAN