firewalld --permanent 规则 reboot 后消失,主因是未执行 firewall-cmd --reload 或 firewalld 服务未启用;--permanent 仅写入磁盘配置,需 reload 才加载至运行时,且服务必须 enabled 并正常启动。
firewalld --permanent 规则 reboot 后消失?先确认是否漏了 --reload
加了
不等于规则已生效,它只是写进磁盘配置;真正加载进运行时防火墙的是
。很多人执行完
就以为完事了,结果 reboot 后发现端口不通——因为没 reload,旧的 runtime 配置还在,而 reboot 会清空 runtime,只从 permanent 配置重建,但若 permanent 配置没被显式 reload 过,systemd-firewalld 服务启动时可能因依赖顺序或初始化时机问题未能正确载入。
每次修改
规则后,必须手动执行
(哪怕刚加完就 reboot)
reboot 前建议补一次
,确保磁盘配置和内存状态一致
检查是否真写入了 permanent 配置:
,而不是只看
systemd firewalld 服务未启用导致 reboot 后规则不加载
是按需启动的服务,如果没设为开机自启,reboot 后服务压根没跑,自然不会读取
下的 permanent 配置。
运行
,输出不是
就要补上:
即使启用了,也要确认服务实际启动成功:
,留意是否有
或
类错误
某些最小化安装的系统(如 CentOS Stream 9 minimal)默认禁用 firewalld,且不自带
回退方案
使用 --runtime-only 添加规则却误以为 --permanent 生效
容易混淆的点:
(无
)是 runtime-only,reboot 必丢;但有人加完 runtime 规则后,顺手执行了
,却忘了 reload,于是误判“permanent 也没用”。
区分清楚:带
的命令只改配置文件,不改当前防火墙行为
带
的命令只改当前内存,不写磁盘
最稳妥流程:
→
→
验证是否在 runtime 中出现
nftables 后端下 zone 文件损坏导致 reload 失败静默丢规则
firewalld 在较新系统(RHEL 8+/CentOS 8+)默认用 nftables 后端。如果手动编辑过
,格式出错或标签不闭合,
会失败但不报错(只在 journal 里记 warning),导致后续 reboot 时 firewalld 初始化跳过该 zone,所有规则失效。
执行
后立刻查结果:
应返回
,再
看规则是否在 runtime 中
查日志:
,重点关注
或
不要直接改 xml 文件,优先用
命令操作;非改不可时,用
校验格式
permanent 规则 reboot 失效,八成不是 bug,而是 reload 没做、服务没启、或者 reload 实际失败了却没验证。别信“加了 permanent 就一劳永逸”,firewalld 的两层抽象(runtime + permanent)恰恰是出问题最多的地方。
--permanentfirewall-cmd --reloadfirewall-cmd --permanent --add-port=8080/tcp--permanentfirewall-cmd --reloadfirewall-cmd --reloadfirewall-cmd --permanent --list-all--list-allfirewalld/etc/firewalld/zones/systemctl is-enabled firewalldenabledsystemctl enable firewalldsystemctl status firewalldFailed to initialize nftablesZone 'public' not foundiptables-servicesfirewall-cmd --add-port=8080/tcp--permanentfirewall-cmd --permanent --add-port=8080/tcp--permanent--runtime-onlyfirewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --reloadfirewall-cmd --list-ports/etc/firewalld/zones/public.xml--reloadfirewall-cmd --reloadfirewall-cmd --staterunningfirewall-cmd --list-alljournalctl -u firewalld --since "1 hour ago" | grep -i "error\|warn"Failed to load zoneInvalid XMLfirewall-cmdxmllint --noout /etc/firewalld/zones/public.xml