firewalld常见问题根源是运行时与永久配置不一致、zone绑定错误及rich rule语法错误;必须用--permanent写入磁盘并执行--reload生效,否则规则仅临时存在或完全不匹配。

firewalld 不是“配一次就完事”的工具,运行时配置和永久配置不一致是 90% 的连不上问题根源。
firewall-cmd --permanent 参数漏了就白干
几乎所有端口开放失败,都是因为只加了 --add-port 却没加 --permanent。临时规则在 reload 或重启后直接消失,但你可能根本没意识到它只是“临时”的。
- 正确写法:
firewall-cmd --permanent --add-port=8080/tcp(写入磁盘配置) - 错误写法:
firewall-cmd --add-port=8080/tcp(仅内存生效,systemctl restart firewalld后失效) - 加了
--permanent后必须执行firewall-cmd --reload才能真正启用,否则规则还在文件里躺着没加载 - 想验证是否真写进去了?查配置文件:
cat /etc/firewalld/zones/public.xml,看里面有没有对应<port port="8080" protocol="tcp"></port>
双网卡场景下 zone 绑定错一个接口就全不通
比如外网卡 ens192 和内网卡 ens224,默认都落在 public 区域。如果你只开了 public 的 80 端口,但实际请求走的是内网卡——而内网卡没显式绑定到任何 zone,它就用默认 zone;如果默认 zone 被改成 drop,那所有流量直接丢弃,连 SSH 都连不上。
- 查接口归属:
firewall-cmd --get-active-zones - 把外网卡明确绑到
public:firewall-cmd --permanent --zone=public --change-interface=ens192 - 把内网卡绑到宽松的
trusted或自定义 zone:firewall-cmd --permanent --zone=trusted --change-interface=ens224 - 改完务必
firewall-cmd --reload,否则--change-interface不生效
rich rule 写错 source 就等于没写
想限制只有 192.168.2.100 能访问 8088 端口,用富规则最直接,但 source 地址写法有坑:
- 正确:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.100" port port="8088" protocol="tcp" accept' - 错误:漏掉
family="ipv4"—— 默认是 ipv6,ipv4 流量完全不匹配 - 错误:写成
source ip="192.168.2.100"——ip不是合法关键字,必须用address - 错误:没加
--permanent,reload 后规则消失,但你以为它还在 - 调试技巧:加
log prefix="rich-8088"到规则末尾,然后journalctl -u firewalld | grep rich-8088看是否命中
真正麻烦的不是命令记不住,而是 --permanent 和 --reload 这两个动作总被当成可选步骤跳过;一旦出问题,第一反应往往是怀疑端口、服务、路由,却忘了 firewalld 本身根本没加载你写的那行规则。

















