CentOS 7 到 8 没有官方支持的原地升级路径,配置丢失通常是因为迁移工具不完美或进行了全新安装。最稳妥的恢复方式是提前备份的 /etc/firewalld/ 目录还原,但还原前务必校验备份完整性并注意后端兼容性。
先说结论:firewalld 的配置文件集中存储在 /etc/firewalld/,升级前务必备份该目录,丢失后优先从备份还原。
- 适合:已完成系统版本迁移但发现防火墙规则失效的管理员
- 先准备:确认是否有升级前的
/etc/firewalld/目录备份,并校验文件完整性 - 验收:重载服务后通过命令验证端口和服务规则是否生效
- 注意:CentOS 8 默认后端切换为 nftables,旧版 direct.xml 规则可能需转换为 rich rules
配置还原实操步骤
本步骤合并了快速还原与详细检查流程,请在操作前确认已具备升级前的配置备份。
1. 校验备份文件完整性
在还原前,必须确认备份目录非空且包含关键子目录(如 zones/、services/),避免覆盖现有配置后仍无法生效。
# 查看备份目录结构
ls -R /backup/firewalld/
# 关键文件检查:确认存在 firewalld.conf 及 zones 目录
if [ -d "/backup/firewalld/zones" ] && [ -f "/backup/firewalld/firewalld.conf" ]; then
echo "Backup check passed."
else
echo "Backup incomplete, stop operation."
fi2. 停止服务并备份当前状态
即使当前配置可能丢失,也建议备份当前状态以防万一。
# 停止 firewalld 服务
systemctl stop firewalld
# 备份当前(可能为空的)配置
cp -r /etc/firewalld /etc/firewalld.broken_$(date +%F)3. 还原旧版配置
将备份文件复制回原目录,并严格修正文件权限。
# 还原配置(假设备份在 /backup/firewalld)
cp -r /backup/firewalld/* /etc/firewalld/
# 修正所有者与权限(关键步骤,权限错误会导致服务启动失败)
chown -R root:root /etc/firewalld/
find /etc/firewalld/ -type f -exec chmod 640 {} \;
find /etc/firewalld/ -type d -exec chmod 750 {} \;4. 启动并重载服务
systemctl start firewalld
firewall-cmd `--reload`兼容性处理与规则转换
CentOS 7 的 firewalld 默认底层实现通常基于 iptables,而 CentOS 8 默认切换为 nftables。虽然 firewalld 的配置文件格式(XML)基本兼容,但底层差异可能导致部分旧规则无法正确加载。
1. 检查后端配置
查看 /etc/firewalld/firewalld.conf 中的 Backend 字段。CentOS 8 推荐使用 nftables。若旧配置中包含大量 iptables 特定的 direct 规则,建议逐步测试。
2. direct.xml 规则迁移示例
旧版配置中若使用了 direct.xml 直接写入 iptables 规则,在 CentOS 8 的 nftables 后端下可能不生效。建议迁移为 firewalld 原生 rich rules。
示例场景: 允许特定网段转发
旧版 direct.xml 写法(可能失效):
<direct>
<rule ipv="ipv4" table="filter" chain="FORWARD" priority="0">
-s 192.168.1.0/24 -j ACCEPT
</rule>
</direct>建议改为 rich rule 写法(兼容性好):
# 永久添加规则
firewall-cmd `--permanent` `--add-rich-rule`='rule family="ipv4" source address="192.168.1.0/24" accept'
# 重载生效
firewall-cmd `--reload`验证与排查
1. 查看当前区域规则
列出当前活跃区域的所有配置,确认端口和服务是否在列。
firewall-cmd `--list-all`2. 检查服务状态
确认 firewalld 服务运行正常且无报错。
systemctl status firewalld3. 实际连通性测试
从外部机器尝试 telnet 或 curl 访问开放端口,确认流量未被拦截。同时查看日志 /var/log/messages 或 journalctl -u firewalld 是否有拒绝连接的记录。
常见坑
1. 区域名称不一致
确保还原的 zone 配置文件与当前网络接口绑定的区域名称一致。如果接口绑定了 public 区域,但还原的是 work 区域的配置,规则不会生效。使用 firewall-cmd `--get-active-zones` 确认接口绑定情况。
2. 运行时与永久配置混淆
firewall-cmd 修改分为运行时和永久配置。还原文件属于修改永久配置,必须执行 `--reload` 才能同步到运行时环境,否则重启后可能恢复原状。
3. 权限问题导致服务启动失败
还原配置后若忘记修正 /etc/firewalld/ 的权限(需 root 所有,文件 640),firewalld 可能拒绝加载配置并报错。
参考来源
- firewalld.org - Configuration Files: https://firewalld.org/documentation/configuration.html
- Red Hat Enterprise Linux 8 - Migrating from RHEL 7 to RHEL 8: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/releasing_notes_for_red_hat_enterprise_linux_8/index