跳转到内容
搜索 RHEL 文档

    浏览当前文档目录

    firewalld 规则不生效:nftables 后端排查

    “我加了端口/服务,还是不通”是 firewalld 最常见的工单。90% 的情况不是规则写错,而是改在了 permanent、没 reload,或者规则加到了非活动 zone。本页给一条可复现的排查顺序。

    在 PVE 390 rhel10-lab(RHEL 10.2 x86_64)上实际执行:

    Terminal window
    sudo dnf -y install firewalld
    sudo systemctl start firewalld
    firewall-cmd --state
    firewall-cmd --get-default-zone
    firewall-cmd --list-all
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload
    firewall-cmd --list-services
    sudo nft list ruleset | grep -A6 'table inet firewalld'
    sudo firewall-cmd --permanent --remove-service=http
    sudo firewall-cmd --reload
    firewall-cmd --list-services

    E3 记录:plans/content-expansion/evidence/rhel/rhel-firewalld/run.json(9 步,含每步输出 sha256)。

    操作写哪里何时生效
    firewall-cmd --add-service=httpruntime立即,重启/ reload 丢失
    firewall-cmd --permanent --add-service=http配置文件--reload 后
    firewall-cmd --reload把 permanent 加载到 runtime立即(会丢未保存的 runtime 改动)

    所以顺序必须是:先 --permanent 改,再 --reload;只做前者不会生效。

    Terminal window
    # 1. 服务在不在
    firewall-cmd --state # running / not running
    # 2. 哪个 zone 在管这个接口
    firewall-cmd --get-active-zones
    # public
    # interfaces: eth0
    # 3. 这个 zone 到底放了什么
    firewall-cmd --list-all
    # services: cockpit dhcpv6-client ssh
    # 4. runtime 的 services/ports
    firewall-cmd --list-services
    firewall-cmd --list-ports
    # 5. 内核里实际规则(nftables 后端)
    sudo nft list ruleset | grep -A6 'table inet firewalld'
    # 6. 配置语法自检
    sudo firewall-cmd --check-config

    如果 --list-all 有、nft list ruleset 没有,通常是没 reload 或看错 zone;如果两者都有但仍不通,问题在服务监听/路由/上游安全组,不在 firewalld。

    $ firewall-cmd --list-all
    public (active)
    interfaces: eth0
    services: cockpit dhcpv6-client ssh
    $ sudo firewall-cmd --permanent --add-service=http
    success
    $ sudo firewall-cmd --reload
    success
    $ firewall-cmd --list-services
    cockpit dhcpv6-client http ssh
    $ sudo nft list ruleset | grep -A6 'table inet firewalld'
    table inet firewalld {
    flags owner,persist
    chain mangle_PREROUTING {
    type filter hook prerouting priority mangle + 10; policy accept;
    ...

    RHEL 10 的 firewalld 用 nftables 后端,iptables -L 看不到这些规则;排查要看 nft list ruleset。table inet firewalld 存在,说明 firewalld 已接管。

    删除:

    Terminal window
    sudo firewall-cmd --permanent --remove-service=http
    sudo firewall-cmd --reload
    firewall-cmd --list-services
    # cockpit dhcpv6-client ssh
    Terminal window
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld # 如需
    • --state 是 running;
    • --get-active-zones 的接口是你要放行的接口;
    • permanent 改完是否 --reload;
    • --list-all 与 nft list ruleset 是否一致;
    • 服务本身是否在监听(ss -lntp);
    • 上游安全组/路由是否放行。
    • 未测试 rich rule、source/port 转发与 masquerade;
    • 未测试 --panic-on 与 emergency 模式;
    • 未测试 firewalld 与 NetworkManager zone 绑定的联动;
    • 未测试 IPv6 规则与 direct 规则。