iptables重启后规则丢失怎么办?终极指南:永久保存iptables规则 (Ubuntu/CentOS)

发布于 2025-10-29 分类: Linux

你是否曾花费数小时精心打造一套完美的iptables防火墙规则,却在一次服务器重启后,发现所有努力都付诸东流?这可能是每个iptables新手都会遇到的噩梦。本章的核心任务,就是正面回答这个至关重要的问题:iptables重启后规则丢失怎么办

我们将为你提供针对主流Linux发行版的、可直接操作的终极解决方案,确保你的防火墙规则永久生效。

探究根源:为什么iptables规则会在重启后丢失?

首先,我们需要理解iptables命令的本质。我们通过iptables命令行工具下达的每一条指令,都是在直接修改内核中Netfilter的实时规则集。这些规则是存储在内存中的,它们非常高效,但也是临时性的。当系统重启时,内存中的所有数据都会被清空,Netfilter的规则集自然也就恢复到了内核模块加载时的默认状态(通常是所有链都是ACCEPT策略,且没有任何规则)。

因此,要实现规则的持久化,我们需要一个机制,能在系统关机前将当前内存中的规则导出到一个配置文件中,并在系统下次启动时,自动从这个文件中导入规则

5.1 手动保存与恢复:iptables-saveiptables-restore

iptables 自带了两个非常重要的配套命令,它们是所有持久化方案的基础:

  • iptables-save: 这个命令的作用是将当前内核中所有表的所有规则,以一种可被iptables-restore识别的格式,打印到标准输出
  • iptables-restore: 这个命令从标准输入读取由iptables-save生成的规则数据,并将其原子性地应用到内核中。

如何使用?

  1. 保存当前规则到文件:

    # 将规则保存到 /etc/iptables.rules 文件中
    sudo iptables-save > /etc/iptables.rules
    

    你可以用 cat /etc/iptables.rules 查看文件内容,你会发现它的格式非常清晰。

  2. 从文件恢复规则:

    # 从 /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安装和使用指南:

  1. 安装:

    sudo apt-get update
    sudo apt-get install iptables-persistent
    

    在安装过程中,它会弹出一个交互式窗口,询问你是否要保存当前的IPv4和IPv6规则。选择 即可。这会把你当前配置好的iptablesip6tables规则分别保存到 /etc/iptables/rules.v4/etc/iptables/rules.v6 文件中。

  2. 工作原理:
    安装后,systemd会管理一个名为 netfilter-persistent 的服务。这个服务会在系统启动时,自动执行 iptables-restore < /etc/iptables/rules.v4ip6tables-restore < /etc/iptables/rules.v6,从而防止规则丢失。

  3. 后续更新规则:
    如果你在安装后修改了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规则的最佳实践:

  1. 禁用 firewalld:
    firewalldiptables-services 会互相冲突,所以必须先禁用前者。

    sudo systemctl stop firewalld
    sudo systemctl disable firewalld
    sudo systemctl mask --now firewalld # 彻底屏蔽,防止被其他服务意外拉起
    
  2. 安装 iptables-services:
    这个软件包提供了管理iptablessystemd服务。

    sudo yum install iptables-services
    
  3. 启动并设置开机自启:

    sudo systemctl enable iptables
    sudo systemctl start iptables
    

    iptables.service 会在启动时加载 /etc/sysconfig/iptables 文件中的规则。

  4. 保存规则:
    当你修改了iptables规则后,使用以下命令来永久保存它们:

    sudo service iptables save
    

    或者直接使用iptables-save

    sudo iptables-save > /etc/sysconfig/iptables
    

    这个命令会将当前规则写入 /etc/sysconfig/iptables 文件,iptables服务下次启动时就会加载这个文件,完美解决问题。


附录:展望未来与备忘单

A.1 下一代:nftables

虽然我们深入学习了iptables,但了解技术的发展方向同样重要。nftablesNetfilter项目的下一代产品,旨在取代iptablesip6tablesarptables等。它提供了更简洁的语法、更好的性能和更强的原子性操作。

好消息是,你学习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

-- 感谢阅读 --