Firewalld区域划分错误不会直接断网,而是导致流量进入错误zone,使本该放行的端口被拒绝或公网流量意外放行;需用firewall-cmd --get-active-zones确认网卡实际归属,避免NetworkManager等自动覆盖绑定。

Firewalld 区域划分错误不会直接“断网”,但会让流量进错 zone,导致本该放行的端口被默认策略拒绝,或本该限制的公网流量意外放行——表面看就是“通不了”“连不上”“重启后突然不通”。关键不在规则写没写对,而在流量根本没走到你配置的那个 zone 里。
确认网卡实际归属哪个 zone
运行 firewall-cmd --get-active-zones,只看输出里有没有你的物理网卡(如 eth0、ens33)及其所属 zone。如果输出为空,或你的网卡出现在 unexpected zone(比如该走 public 却在 trusted),就说明区域绑定失效。
常见情况:
- 系统启动时 NetworkManager 或 cloud-init 自动绑定了 zone,覆盖了你手动设置的配置
- 网卡重命名(如从 eth0 变成 ens33),旧绑定失效
- 使用 DHCP 后,某些发行版会根据网络特征自动切换 zone(如识别为 home 网络)
检查默认 zone 是否被误用
执行 firewall-cmd --get-default-zone,再查 firewall-cmd --zone=public --list-all(把 public 换成你看到的默认 zone)。如果这个 zone 是 drop、block 或 trusted,而你的服务跑在公网接口上,大概率被拦住。
注意:默认 zone 只兜底未显式绑定的网卡。它不等于“所有流量都走这里”——哪怕你设了 default-zone=public,只要 eth0 被悄悄绑到了 internal,那 eth0 的流量就完全不看你 public 里的任何规则。
验证流量是否真进了目标 zone
不能只信配置,要验证路径。用 firewall-cmd --direct --get-all-chains 查底层链加载情况(高级用户可选),更实用的是:
- 临时加一条 rich rule 到目标 zone,带日志标记:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" log prefix="TEST-ZONE-" level="info" accept' --permanent - reload 后从该源 IP 访问一次,再查 journalctl -u firewalld -n 50 | grep TEST-ZONE
- 没日志?说明请求压根没匹配到 public zone——流量走了别的 zone,甚至绕过了 firewalld
修复绑定并防止漂移
手动绑定是基础,防漂移才是关键:
- 绑定网卡:firewall-cmd --permanent --zone=public --add-interface=eth0
- 删掉可能冲突的自动绑定:firewall-cmd --permanent --remove-interface=eth0(先查哪些 zone 有它)
- 禁用 NetworkManager 的 zone 自动管理(推荐):
编辑 /etc/NetworkManager/NetworkManager.conf,在 [main] 下加:
firewall-backend=none - 最后 reload:firewall-cmd --reload,再确认 --get-active-zones 输出稳定











