怎么备份当前 iptables 规则以便系统重装后快速恢复

文章导读
最稳妥的方式是用iptables-save把规则导出到文件,重装后通过iptables-restore还原,同时根据发行版配置开机自动加载。
📋 目录
  1. 命令速用版
  2. 原理简述
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

最稳妥的方式是用iptables-save把规则导出到文件,重装后通过iptables-restore还原,同时根据发行版配置开机自动加载。

先说结论:备份 iptables 规则本质是把内存中的规则导出到文件,重装系统后需要重新安装 iptables 并导入规则文件,不同发行版的持久化机制有差异。

  • 适合:系统迁移、服务器重装、规则版本管理场景
  • 先看:当前发行版类型和 iptables 服务状态
  • 建议:备份文件存到外部存储,重装前验证文件完整性,恢复前确保有控制台访问权限

命令速用版

备份当前规则(IPv4):

sudo sh -c "iptables-save > /root/iptables-backup.rules"

备份 IPv6 规则(如有):

sudo sh -c "ip6tables-save > /root/ip6tables-backup.rules"

重装后恢复规则:

sudo iptables-restore < /root/iptables-backup.rules

CentOS/RHEL 系持久化(需先处理 firewalld):

sudo systemctl stop firewalld && sudo systemctl disable firewalld
sudo sh -c "iptables-save > /etc/sysconfig/iptables"
sudo systemctl enable iptables

Debian/Ubuntu 系持久化:

sudo apt install iptables-persistent
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
sudo netfilter-persistent save

原理简述

iptables 规则默认只存在内核内存中,系统重启或重装后规则会清空。这是因为 Netfilter 框架的设计决定规则直接加载到内核网络栈,性能高但不持久。

不同发行版处理方式不同:CentOS/RHEL 默认把规则存在/etc/sysconfig/iptables,Debian/Ubuntu 需要安装iptables-persistent包,规则存在/etc/iptables/rules.v4。重装系统时,这些配置文件会被覆盖或清除,所以需要把规则文件单独备份到外部位置。

分步处理

步骤一:确认当前规则状态

备份前先查看现有规则,确认没有遗漏:

sudo iptables -L -n -v
sudo iptables-save

如果第二条命令输出为空或只有默认策略,说明当前没有自定义规则,无需备份。

步骤二:导出规则到文件

把规则保存到本地文件(注意权限问题,使用 sh -c):

怎么备份当前 iptables 规则以便系统重装后快速恢复
sudo sh -c "iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules"

同时备份 IPv6 规则(如果使用了 ip6tables):

sudo sh -c "ip6tables-save > /root/ip6tables-backup-$(date +%Y%m%d).rules"

检查文件内容:

cat /root/iptables-backup-*.rules

步骤三:把备份文件转移到安全位置

系统重装会清空根目录,所以需要把备份文件传到外部:

  • scp传到另一台服务器
  • 下载到本地电脑
  • 存到云存储或配置管理仓库

示例:

scp /root/iptables-backup-*.rules user@backup-server:/backup/

步骤四:重装后恢复规则

系统重装完成后,先安装 iptables 服务:

# CentOS/RHEL
sudo yum install iptables-services
# Debian/Ubuntu
sudo apt install iptables iptables-persistent

重要:CentOS 7+ 默认启用 firewalld,与 iptables 服务冲突,恢复前必须关闭:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

把备份文件传回服务器,然后恢复:

sudo iptables-restore < /path/to/iptables-backup.rules

配置开机自动加载:

# CentOS/RHEL
sudo sh -c "cat /path/to/iptables-backup.rules > /etc/sysconfig/iptables"
sudo systemctl enable iptables
# Debian/Ubuntu
sudo sh -c "cat /path/to/iptables-backup.rules > /etc/iptables/rules.v4"
sudo netfilter-persistent save

怎么验证是否生效

恢复后检查规则是否正确加载:

sudo iptables -L -n -v
sudo iptables -S

对比输出和备份文件内容是否一致。测试关键端口的连通性,比如 SSH 22 端口、Web 80 端口等。

检查服务状态:

怎么备份当前 iptables 规则以便系统重装后快速恢复
# CentOS/RHEL
sudo systemctl status iptables
# Debian/Ubuntu
sudo systemctl status netfilter-persistent

重启服务器后再次检查规则是否保留,确认持久化配置生效。

常见坑

坑一:命令重定向权限不足

直接使用sudo iptables-save > /root/...会失败,因为重定向符号由 shell 执行而非 sudo。需改用sudo sh -c "..."或先备份到用户目录再移动。

坑二:只备份了 IPv4 规则

如果系统同时使用 IPv6,需要单独备份 ip6tables 规则,否则 IPv6 流量可能不受控。

坑三:firewalld 与 iptables 冲突

CentOS 7 及以上默认使用 firewalld,如果同时启用 iptables 服务可能冲突。重装后必须先停止并禁用 firewalld,再启用 iptables 服务。

坑四:恢复后网络中断(SSH 锁死)

如果恢复规则后无法 SSH 连接,可能是规则过于严格。恢复前确保有服务器控制台(VNC/物理机)或带外管理通道可用。建议先设置允许 SSH 的规则再导入完整备份。

坑五:发行版差异导致路径不同

CentOS 和 Debian 的配置文件位置不同,不要混用。恢复前先确认目标系统的发行版类型。

参考来源

  • iptables-save man page
  • CentOS Wiki - iptables
  • Ubuntu Server Guide - firewall