iptables重启后规则丢失怎么办?终极指南:永久保存iptables规则 (Ubuntu/CentOS)
你是否曾花费数小时精心打造一套完美的iptables防火墙规则,却在一次服务器重启后,发现所有努力都付诸东流?这可能是每个iptables新手都会遇到的噩梦。本章的核心任务,就是正面回答这个至关重要的问题:iptables重启后规则丢失怎么办?
我们将为你提供针对主流Linux发行版的、可直接操作的终极解决方案,确保你的防火墙规则永久生效。
探究根源:为什么iptables规则会在重启后丢失?
首先,我们需要理解iptables命令的本质。我们通过iptables命令行工具下达的每一条指令,都是在直接修改内核中Netfilter的实时规则集。这些规则是存储在内存中的,它们非常高效,但也是临时性的。当系统重启时,内存中的所有数据都会被清空,Netfilter的规则集自然也就恢复到了内核模块加载时的默认状态(通常是所有链都是ACCEPT策略,且没有任何规则)。
因此,要实现规则的持久化,我们需要一个机制,能在系统关机前将当前内存中的规则导出到一个配置文件中,并在系统下次启动时,自动从这个文件中导入规则。
5.1 手动保存与恢复:iptables-save 和 iptables-restore
iptables 自带了两个非常重要的配套命令,它们是所有持久化方案的基础:
- iptables-save: 这个命令的作用是将当前内核中所有表的所有规则,以一种可被- iptables-restore识别的格式,打印到标准输出。
- iptables-restore: 这个命令从标准输入读取由- iptables-save生成的规则数据,并将其原子性地应用到内核中。
如何使用?
- 
保存当前规则到文件: # 将规则保存到 /etc/iptables.rules 文件中 sudo iptables-save > /etc/iptables.rules 你可以用 cat /etc/iptables.rules查看文件内容,你会发现它的格式非常清晰。
- 
从文件恢复规则: # 从 /etc/iptables.rules 文件恢复规则 sudo iptables-restore < /etc/iptables.rules 这个命令会清空现有规则,然后加载文件中的规则,非常适合在搞乱了规则后快速恢复到一个已知的良好状态。 
虽然可以手动执行这两个命令,甚至将 iptables-restore 命令写入开机启动脚本(如 /etc/rc.local),但这并不是推荐的最佳实践。更优雅、更可靠的方法是使用为特定发行版设计的服务来彻底解决规则丢失的问题。
5.2 使用服务实现持久化(推荐)
主流的Linux发行版都提供了专门的服务来自动化iptables规则的保存和加载过程,这是解决iptables重启后规则丢失问题的最佳方式。
Debian / Ubuntu: 使用 iptables-persistent 解决规则丢失问题
在Debian及其衍生版(如Ubuntu)中,最标准的工具是 iptables-persistent。
iptables-persistent安装和使用指南:
- 
安装: sudo apt-get update sudo apt-get install iptables-persistent 在安装过程中,它会弹出一个交互式窗口,询问你是否要保存当前的IPv4和IPv6规则。选择 即可。这会把你当前配置好的 iptables和ip6tables规则分别保存到/etc/iptables/rules.v4和/etc/iptables/rules.v6文件中。
- 
工作原理: 
 安装后,systemd会管理一个名为netfilter-persistent的服务。这个服务会在系统启动时,自动执行iptables-restore < /etc/iptables/rules.v4和ip6tables-restore < /etc/iptables/rules.v6,从而防止规则丢失。
- 
后续更新规则: 
 如果你在安装后修改了iptables规则,这些改动不会自动保存。为了避免下次重启规则再次丢失,你必须手动执行以下命令来更新保存的规则文件:sudo netfilter-persistent save 或者,你也可以直接调用 iptables-save覆盖旧文件:sudo iptables-save > /etc/iptables/rules.v4 强烈建议在每次确认规则修改无误后,立即执行保存命令,养成良好习惯。 
CentOS / RHEL 7+: 使用 iptables-services 实现规则持久化
在CentOS/RHEL 7及更高版本中,默认的防火墙管理工具是firewalld。如果你想回头使用传统的iptables,并永久保存规则,你需要进行一些额外的设置。
CentOS 7保存iptables规则的最佳实践:
- 
禁用 firewalld:
 firewalld和iptables-services会互相冲突,所以必须先禁用前者。sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl mask --now firewalld # 彻底屏蔽,防止被其他服务意外拉起 
- 
安装 iptables-services:
 这个软件包提供了管理iptables的systemd服务。sudo yum install iptables-services 
- 
启动并设置开机自启: sudo systemctl enable iptables sudo systemctl start iptables iptables.service会在启动时加载/etc/sysconfig/iptables文件中的规则。
- 
保存规则: 
 当你修改了iptables规则后,使用以下命令来永久保存它们:sudo service iptables save 或者直接使用 iptables-save:sudo iptables-save > /etc/sysconfig/iptables 这个命令会将当前规则写入 /etc/sysconfig/iptables文件,iptables服务下次启动时就会加载这个文件,完美解决问题。
附录:展望未来与备忘单
A.1 下一代:nftables
虽然我们深入学习了iptables,但了解技术的发展方向同样重要。nftables是Netfilter项目的下一代产品,旨在取代iptables、ip6tables、arptables等。它提供了更简洁的语法、更好的性能和更强的原子性操作。
好消息是,你学习iptables所掌握的所有核心概念——表、链、规则、匹配、动作、连接跟踪——在nftables中都以新的形式存在。掌握了iptables的底层逻辑,你将能非常轻松地迁移到nftables。
A.2 iptables 常用命令备忘单 (Cheatsheet)
| 功能描述 | 命令 | 
|---|---|
| 查看规则 | |
| 查看filter表规则(带编号、详情) | iptables -L -n -v --line-numbers | 
| 查看nat表规则 | iptables -t nat -L -n -v --line-numbers | 
| 基本操作 | |
| 清空所有规则 | iptables -F | 
| 删除所有自定义链 | iptables -X | 
| 设置INPUT链默认策略为DROP | iptables -P INPUT DROP | 
| 添加规则 | |
| 在INPUT链末尾追加规则 | iptables -A INPUT ... | 
| 在INPUT链开头插入规则 | iptables -I INPUT ... | 
| 在INPUT链第3行插入规则 | iptables -I INPUT 3 ... | 
| 删除规则 | |
| 删除INPUT链的第3条规则 | iptables -D INPUT 3 | 
| 按内容删除规则 | iptables -D INPUT -s 1.2.3.4 -j DROP | 
| 常用规则实例 | |
| 允许已建立的连接 | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | 
| 开放TCP 80端口 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT | 
| 屏蔽某个IP | iptables -I INPUT -s <恶意IP> -j DROP | 
| 配置NAT上网(伪装) | iptables -t nat -A POSTROUTING -o <外网网卡> -j MASQUERADE | 
| 配置端口转发 | iptables -t nat -A PREROUTING -p tcp --dport <外网端口> -j DNAT --to <内网IP:端口> | 
| 持久化 (防止重启丢失) | |
| (通用) 保存规则到文件 | iptables-save > /path/to/rules | 
| (通用) 从文件恢复规则 | iptables-restore < /path/to/rules | 
| (Ubuntu) 保存规则 | sudo netfilter-persistent save | 
| (CentOS) 保存规则 | sudo service iptables save |