从 CentOS 7 升级到 8 后 firewall 配置丢失怎么迁移恢复

文章导读
CentOS 7 到 8 没有官方支持的原地升级路径,配置丢失通常是因为迁移工具不完美或进行了全新安装。最稳妥的恢复方式是提前备份的 /etc/firewalld/ 目录还原,但还原前务必校验备份完整性并注意后端兼容性。
📋 目录
  1. A 配置还原实操步骤
  2. B 兼容性处理与规则转换
  3. C 验证与排查
  4. D 常见坑
  5. E 参考来源
A A

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."
fi

2. 停止服务并备份当前状态

即使当前配置可能丢失,也建议备份当前状态以防万一。

# 停止 firewalld 服务
systemctl stop firewalld

# 备份当前(可能为空的)配置
cp -r /etc/firewalld /etc/firewalld.broken_$(date +%F)

3. 还原旧版配置

从 CentOS 7 升级到 8 后 firewall 配置丢失怎么迁移恢复

将备份文件复制回原目录,并严格修正文件权限。

# 还原配置(假设备份在 /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。

示例场景: 允许特定网段转发

从 CentOS 7 升级到 8 后 firewall 配置丢失怎么迁移恢复

旧版 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 firewalld

3. 实际连通性测试

从 CentOS 7 升级到 8 后 firewall 配置丢失怎么迁移恢复

从外部机器尝试 telnet 或 curl 访问开放端口,确认流量未被拦截。同时查看日志 /var/log/messagesjournalctl -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