firewalld 添加 permanent rule 后重启失效的根本原因是仅执行 --permanent 未执行 --reload,导致规则写入配置文件但未同步至运行时;正确做法是先 --permanent 再 --reload。

firewalld 添加 permanent rule 后重启失效,根本原因不是规则没加成功,而是 只执行了 --permanent 操作,却没触发永久配置的真正生效。--permanent 只是把规则写进配置文件(如 /etc/firewalld/zones/public.xml),但不会自动加载到运行时(runtime)中,更不会在 reboot 后自动应用——firewalld 服务启动时默认只加载 runtime 状态,除非明确启用持久化加载逻辑。
✅ 正确添加 permanent rule 的两步必须都做
添加永久规则后,必须显式 reload 才能让 firewalld 重新读取配置文件并同步 runtime 状态:
-
✗ 错误写法(仅永久):
firewall-cmd --permanent --add-port=8080/tcp→ 规则已存盘,但当前防火墙不放行,重启后也不生效 -
✓ 正确写法(永久 + 重载):
firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload -
--reload会:① 从磁盘重新加载所有 zone 配置;② 将 permanent 状态完全覆盖 runtime;③ 不中断已有连接(相比 restart 更安全)
⚠️ reboot 失效的常见连带原因
即使加了 --permanent 和 --reload,reboot 后仍失效,可能是以下情况之一:
-
firewalld 服务未设为开机自启:运行
systemctl is-enabled firewalld,若返回disabled,需执行systemctl enable firewalld -
SELinux 或其他防火墙冲突:如 iptables-services 仍在运行,会覆盖 firewalld 规则;检查
systemctl status iptables并禁用:systemctl disable iptables -
zone 配置被覆盖或误删:/etc/firewalld/zones/ 下的 xml 文件被手动编辑出错,或被 ansible/salt 等工具重置;建议用
firewall-cmd --list-all --permanent核对磁盘配置是否与预期一致
? 验证 permanent rule 是否真生效
不要只信命令返回 success,要分层验证:
- 查磁盘配置:
firewall-cmd --list-all --permanent(看输出里是否有你加的端口/服务) - 查运行时状态:
firewall-cmd --list-all(应与 --permanent 输出一致,否则 reload 没成功) - 模拟重启影响:
systemctl restart firewalld && firewall-cmd --list-all(等效于 reboot 后的首次状态) - 确认服务自启:
systemctl is-active firewalld(重启后应为 active)
? 小技巧:避免漏 reload 的习惯写法
日常操作建议统一用函数封装,例如在 ~/.bashrc 中添加:
fwadd() { firewall-cmd --permanent "$@" && firewall-cmd --reload; }
之后直接用 fwadd --add-port=8080/tcp,一气呵成,不再手抖忘 reload。










