firewall-cmd无原生“锁定配置”开关,但可通过禁用runtime修改、强制--permanent+--reload双步操作、启用panic模式、限制文件权限与用户权限、设默认zone为drop并显式绑定接口等组合策略实现等效只读锁定。

firewall-cmd 本身没有“锁定配置”这一开关功能,但可通过组合策略实现等效效果:让规则只读、禁用运行时修改、限制操作权限,并确保所有变更必须走持久化流程。核心思路是切断临时规则入口,强制所有改动需显式声明永久性并重载生效。
关闭运行时动态修改能力
firewalld 默认允许 runtime 规则(不加 --permanent 的命令立即生效但重启丢失),这是误操作高发点。要规避:
- 避免使用无 --permanent 的增删类命令,如 不要执行
firewall-cmd --add-port=8080/tcp - 统一采用“永久+重载”双步法:所有修改都带 --permanent,再执行
firewall-cmd --reload - 可定期检查是否存在残留 runtime 规则:
firewall-cmd --list-all对比firewall-cmd --permanent --list-all,若前者多出内容,说明有未持久化的临时规则
设置防火墙为只读模式(panic 模式)
启用 panic 模式可瞬间拒绝所有入站和出站连接,相当于“紧急冻结”,适合高风险时段或审计前快速锁死:
- 开启:
firewall-cmd --panic-on(立即生效,所有新连接被丢弃) - 确认状态:
firewall-cmd --query-panic返回 yes 即已锁定 - 恢复:
firewall-cmd --panic-off(仅限授权人员操作) - 注意:panic 模式不影响已有连接,但会阻断新连接和 DNS 查询等,慎用于生产环境
权限与操作约束
从系统层限制非授权修改:
- 将 firewall-cmd 配置文件设为只读:
sudo chmod 644 /etc/firewalld/及其子目录(尤其zones/和services/) - 禁止普通用户执行 firewall-cmd:移除其在 sudoers 中的免密权限,或仅授予特定子命令(如只允许
--state和--list-all) - 启用 audit 日志追踪变更:
sudo auditctl -w /usr/bin/firewall-cmd -p x -k firewall_cmd,便于事后审计谁在何时执行了哪条命令
固化默认行为:禁用默认区域自动接管
防止新网卡或服务意外落入 public 区域导致开放端口:
- 将默认区域设为最严格区域:
firewall-cmd --set-default-zone=drop(drop 区域默认丢弃所有入站) - 为每个接口显式绑定所需区域:
firewall-cmd --permanent --zone=public --add-interface=eth0,避免依赖默认行为 - 禁用自动区域分配:确保
/etc/firewalld/firewalld.conf中 AutomaticHelpers=no,防止内核模块绕过 firewalld 规则


















