切换防火墙的核心在于“先配后切”,务必在保留 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。若切换成功,需手动取消该任务。
# 设置 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 服务,避免规则冲突。
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/messages 或 journalctl -u firewalld 是否有报错。
常见坑
1. SSH 锁死风险
最严重的错误是未放行 SSH 端口就重启防火墙服务。务必先添加 `--add-service`=ssh 并验证。
2. 服务同时运行
长期同时运行 iptables 和 firewalld 会导致规则混乱。切换完成后应确保只有一项服务处于 active 状态。
3. 规则未永久保存
使用 firewall-cmd 添加规则时,若不加 `--permanent` 参数,重启后规则会丢失。配置完务必 reload。
4. 命令语法错误
firewall-cmd 参数周围不应包含反引号(`),直接书写参数即可,例如 firewall-cmd `--permanent` 而非 firewall-cmd `--permanent`。