最稳妥的方式是用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):
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 端口等。
检查服务状态:
# 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