iptables 切换到 firewalld 过程中如何避免业务中断

文章导读
切换防火墙的核心在于“先配后切”,务必在保留 iptables 运行的情况下预先配置好 firewalld 规则,确认连通后再停用旧服务。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. Docker 环境兼容配置
  5. 怎么验证是否生效
  6. 常见坑
A A

切换防火墙的核心在于“先配后切”,务必在保留 iptables 运行的情况下预先配置好 firewalld 规则,确认连通后再停用旧服务。

先说结论:生产环境切换防火墙必须预留回滚方案,严禁直接停止 iptables 后才配置 firewalld。

  • 适合:CentOS 7/RHEL 7 及以上默认使用 firewalld 的场景
  • 先准备:备份 iptables 规则并配置 firewalld 白名单
  • 验收:验收通过后再禁用 iptables 服务

命令速用版

# 1. 安装 firewalld(若未安装)
yum install firewalld -y

# 2. 预先配置规则(放行 SSH 及业务端口)
firewall-cmd `--permanent` `--add-service`=ssh
firewall-cmd `--permanent` `--add-port`=80/tcp

# 3. 启动服务并重载配置(注意顺序:先 start 后 reload)
systemctl start firewalld
firewall-cmd `--reload`

# 4. 确认连通性正常后,再停止 iptables
systemctl stop iptables
systemctl disable iptables

为什么会这样

iptables 和 firewalld 底层都依赖 Linux 内核的 netfilter 模块管理网络包过滤。如果在同一台服务器上同时运行两个服务,它们会争抢规则链的控制权,导致规则冲突或覆盖。firewalld 支持动态更新规则而不中断连接,但前提是规则必须预先配置正确。直接停止 iptables 而 firewalld 未就绪,会导致所有入站流量被默认策略丢弃,造成业务中断。

分步处理

第一步:备份现有规则
在操作前保存当前的 iptables 配置,以便紧急回滚。

iptables-save > /root/iptables.backup.$(date +%F)

第二步:设置紧急回滚(远程操作必备)
为防止配置失误导致 SSH 锁死,建议设置定时任务自动恢复 iptables。若切换成功,需手动取消该任务。

iptables 切换到 firewalld 过程中如何避免业务中断
# 设置 10 分钟后自动恢复 iptables
echo "iptables-restore < /root/iptables.backup" | at now + 10 minutes

# 切换成功后,查看任务 ID 并取消(例如任务 ID 为 1)
atrm 1

第三步:安装并配置 firewalld
保持 iptables 运行,先安装 firewalld 并添加必要的放行规则。务必包含 SSH 端口,否则下次连接会失败。

firewall-cmd `--permanent` `--add-service`=ssh
firewall-cmd `--permanent` `--add-port`=你的业务端口/tcp

第四步:启动 firewalld 并测试
启动服务并重载配置,此时两个防火墙服务可能同时运行,需立即测试业务端口和 SSH 是否通畅。

systemctl start firewalld
firewall-cmd `--reload`

第五步:停用 iptables
确认 firewalld 工作正常后,再停止并禁用 iptables 服务,避免规则冲突。

iptables 切换到 firewalld 过程中如何避免业务中断
systemctl stop iptables
systemctl disable iptables

Docker 环境兼容配置

如果服务器运行 Docker,firewalld 可能会干扰 Docker 的 iptables 规则管理,导致容器网络不通。需将 Docker 网桥接口加入 trusted 区域。

# 将 docker0 接口加入 trusted 区域
firewall-cmd `--permanent` `--zone`=trusted `--add-interface`=docker0
firewall-cmd `--reload`

# 验证 Docker 容器网络是否恢复
docker run `--rm` alpine ping -c 4 8.8.8.8

怎么验证是否生效

使用以下命令检查 firewalld 状态及规则列表,确认默认区域(zone)和放行端口是否符合预期。

firewall-cmd `--state`
firewall-cmd `--list-all`

同时从外部机器测试 SSH 登录和业务端口连通性(如 telnet 或 curl)。检查系统日志 /var/log/messagesjournalctl -u firewalld 是否有报错。

常见坑

1. SSH 锁死风险
最严重的错误是未放行 SSH 端口就重启防火墙服务。务必先添加 `--add-service`=ssh 并验证。

iptables 切换到 firewalld 过程中如何避免业务中断

2. 服务同时运行
长期同时运行 iptables 和 firewalld 会导致规则混乱。切换完成后应确保只有一项服务处于 active 状态。

3. 规则未永久保存
使用 firewall-cmd 添加规则时,若不加 `--permanent` 参数,重启后规则会丢失。配置完务必 reload。

4. 命令语法错误
firewall-cmd 参数周围不应包含反引号(`),直接书写参数即可,例如 firewall-cmd `--permanent` 而非 firewall-cmd `--permanent`