iptables 规则怎么持久化
iptables 的规则默认只存在内核内存里,重启就全部丢失,这也是「明明配好了防火墙,重启后又全通」的原因。持久化有两条路:RHEL 系安装 iptables-services 并用 service iptables save 把规则写进 /etc/sysconfig/iptables,由服务开机恢复;或者用 iptables-save 手工导出、iptables-restore 在启动时载入。启用 iptables-services 后应停用 firewalld,避免两套工具同时操作内核过滤表。
基本信息
| 适用平台 | RHEL 系:银河麒麟、openEuler、CentOS 7、UOS 服务器版 |
|---|---|
| 服务包 | iptables-services |
| 保存位置 | /etc/sysconfig/iptables(服务方案) |
| 手工方案 | iptables-save > 文件,开机 iptables-restore < 文件 |
| 注意 | 与 firewalld 二选一,不要同时启用 |
典型使用场景
- 生产服务器防火墙落地:配好规则后固化,重启仍然生效
- 等保整改:要求防火墙策略持久可用,不能重启即失效
- 离线交付:现场配完规则写入文件,随镜像模板分发
- 应急回滚:把当前可用规则导出留档,出错时一条命令恢复
- 批量统一下发:规则文件统一维护,各机器用 restore 载入
方案一:iptables-services(RHEL 系)
方案一:iptables-services(RHEL 系)
iptables -L -n --line-numbers | head # 先确认当前规则
dnf install -y iptables-services # 安装服务包
systemctl start iptables # 先启动服务再保存
service iptables save # 保存到 /etc/sysconfig/iptables
cat /etc/sysconfig/iptables | head # 确认规则已写入
systemctl enable iptables # 设开机自启
systemctl disable --now firewalld 2>/dev/null # 停用 firewalld,避免冲突方案二:手工导出与载入
方案二:手工导出与载入
iptables-save > /etc/iptables.rules # 导出当前规则
chmod 600 /etc/iptables.rules # 规则可能含网络拓扑,收紧权限
# 自建 /etc/systemd/system/iptables-restore.service:
# [Service]
# Type=oneshot
# ExecStart=/sbin/iptables-restore /etc/iptables.rules
# [Install]
# WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable --now iptables-restore
# 验证持久化
reboot
systemctl is-active iptables; iptables -L -n | head方案对比
| 对比项 | iptables-services | 手工 save/restore |
|---|---|---|
| 适用平台 | RHEL 系为主 | 全部 Linux |
| 保存路径 | /etc/sysconfig/iptables | 自定义,如 /etc/iptables.rules |
| 开机恢复 | 由服务自动完成 | 需自建 unit 或 rc.local 调用 |
| 维护便利 | service iptables save 一条命令 | 每次改动要重新导出 |
| 与 firewalld | 需停用 firewalld | 同样需二选一 |
| 适合场景 | 标准 RHEL 系服务器 | 非 RHEL 系或需要自定义流程 |
启用 iptables-services 后建议停用 firewalld,避免两套规则同时操作内核过滤表导致行为不可预期。
导出留档时注意规则文件可能包含内网地址与开放端口规划,权限收紧到 600 并纳入变更管理。