现场是这样的。CentOS 7.9 双网卡机器,eth0 走内网 eth1 走公网,firewalld 在 public zone 放了 8080,从内网访问一直超时,firewall-cmd --list-all 显示 8080 已放行,iptables -L 里却看不到对应规则。

中间走过弯路,把「NetworkManager 重连后把网卡的 zone 又切了回去」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。eth0 被绑定到了 trusted 或 internal zone,public 的规则不生效;默认 zone 改过,命令查的是默认 zone 而不是网卡所属 zone;规则只加在 runtime 没加 permanent,重载后就消失。

第一件事是看每块网卡属于哪个 zone

firewall-cmd --get-active-zones && firewall-cmd --get-zone-of-interface=eth0

然后把网卡改到正确的 zone

firewall-cmd --permanent --zone=public --add-interface=eth0

再往下在对应 zone 放行端口并重载

firewall-cmd --permanent --zone=public --add-port=8080/tcp && firewall-cmd --reload

剩下的就是核对规则真的落到了链上

iptables -S | grep 8080

中途换过一次思路,把范围缩到最小的那一层,反而快了。

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。内网访问 8080 返回正常,firewall-cmd --zone=public --list-ports 里有 8080/tcp,重启 firewalld 后依然生效。

zone 绑在网卡上而不是全局开关,改完必须 reload,runtime 里的规则重启就没了。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189