跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    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.conf
    FirewallBackend=nftables

    EL10 的 firewalld 默认把规则写进 nftables 的 inet firewalld 表;iptables 命令虽然还能用(由 iptables-nft 提供),但它操作的是另一张表。所以 iptables -L 看起来「什么都没有」。

    $ nft list tables
    table inet firewalld
    $ iptables -nL
    Chain INPUT (policy ACCEPT)
    target prot opt source destination

    nft list tables 告诉你「谁在这台机器上建了表」,iptables -nL 只看得到 iptables-nft 自己那张。两者不是同一个视图。

    $ firewall-cmd --add-service=http
    success
    $ 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 上必然误判。

    Rocky Linux 10.2:iptables 空、nft 有规则

    1. firewall-cmd --state —— 服务是否运行;
    2. firewall-cmd --get-active-zones —— 接口落在哪个 zone;
    3. firewall-cmd --list-all —— 该 zone 放行了什么;
    4. nft list chain inet firewalld filter_IN_<zone>_allow —— 需要看原始规则或顺序时。

    前三步能解决九成问题,第四步用于确认「规则是否真的在链上」。

    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 里出现多张表是正常的。
    Terminal window
    sudo firewall-cmd --state
    nft list tables
    sudo firewall-cmd --add-service=https
    sudo 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

    检查:

    1. 第二条能看到 table inet firewalld;
    2. 第四条能 grep 到 dport 443;
    3. 第五条计数为 0(iptables 看不到);
    4. 最后撤销放行,恢复原状。

    常见问题

    为什么 EL10 默认换成 nftables?

    nftables 是 iptables 的后继实现,单表结构、原子更新、性能更好;firewalld 从 0.9 起就支持,EL10 把它设为唯一推荐后端。

    还需要装 iptables 吗?

    最小化安装默认没装 iptables 主包,只有 iptables-nft 提供兼容命令;除非有只认 iptables 的旧脚本,否则不需要。

    怎么把旧 iptables 规则迁过来?

    优先改写成 firewall-cmd 的 --add-port/--add-rich-rule;确有复杂需求可先用 iptables-save 记录,再逐条映射到 nft 规则并验证。