iptables-save 详解与应用
iptables-save 详解与应用
iptables-save 详解与应用
本文详细介绍了 iptables-save 命令的用途、输出格式解析以及如何结合 iptables-restore 进行防火墙规则的高效备份与恢复。
1. 概述
- iptables-save:Linux 中用于将 iptables 表的内容转储(dump)到标准输出的工具。
- 核心优势:
- 格式可解析:输出格式专门设计用于
iptables-restore解析,而非人类阅读(虽然可读性也尚可)。 - 原子性:结合
restore使用时,可以原子性地应用规则集,避免在重置防火墙时出现瞬间的安全真空。 - 包含计数器:可以保存当前的流量和包计数器状态。
- 格式可解析:输出格式专门设计用于
2. 工作原理与基本用法
不同于 iptables -L 这种用于展示给用户看的命令,iptables-save 直接读取内核空间中的规则集并格式化输出。
基本命令
1
2
3
4
5
# 输出所有表的规则到屏幕
iptables-save
# 将规则保存到文件
iptables-save > /etc/iptables/rules.v4
指定表
默认情况下,它会输出所有表(filter, nat, mangle, raw, security)。你可以使用 -t 指定特定表:
1
2
# 仅输出 nat 表
iptables-save -t nat
###包含计数器
使用 -c 选项可以输出每条规则当前匹配的数据包数量和字节数。这对于调试或在重启后恢复统计数据很有用。
1
iptables-save -c
3. 输出格式解析
iptables-save 的输出结构非常严谨,通常包含以下部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Generated by iptables-save v1.8.7 on Mon Dec 22 10:00:00 2025
*filter
:INPUT ACCEPT [1024:89500]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [500:42000]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Dec 22 10:00:00 2025
关键部分说明
- 表声明 (
*filter):以*开头,后面跟表名。表示接下来的内容属于哪个表。 - 链策略 (
:CHAIN POLICY [packets:bytes]):- 以
:开头。 - 定义了链的名称(如 INPUT)和默认策略(如 ACCEPT 或 DROP)。
[]内是该链默认策略匹配到的计数器(包数:字节数)。
- 以
- 规则定义 (
-A CHAIN ...):- 这部分看起来和直接输入
iptables命令非常像,但省略了iptables命令本身。 -A表示追加规则。
- 这部分看起来和直接输入
- 提交 (
COMMIT):表示当前表的规则定义结束,告知iptables-restore将上述变更提交到内核。
4. iptables-save vs iptables -L
| 特性 | iptables-save | iptables -L |
|---|---|---|
| 用途 | 备份、恢复、机器解析 | 人类阅读、检查状态 |
| 速度 | 极快(一次性读取) | 较慢(涉及 DNS 反解等) |
| 完整性 | 包含所有参数和计数器 | 可能省略部分细节,默认尝试解析 IP 为主机名 |
| 可恢复性 | 可直接通过 restore 恢复 | 无法直接用于恢复 |
| 输出风格 | 脚本化指令 | 列表化展示 |
5. 恢复与持久化
iptables 规则默认存储在内存中,重启即丢失。必须配合 iptables-restore 实现持久化。
手动恢复
1
iptables-restore < /etc/iptables/rules.v4
结合 -c 恢复计数器
如果你之前的保存包含了计数器(使用了 -c),恢复时也想保留这些数值,需要加 -c 参数:
1
iptables-restore -c < /etc/iptables/rules.v4
自动化(持久化)
在 Debian/Ubuntu 系统中,通常使用 iptables-persistent 包来在启动时自动调用 restore:
1
2
3
apt install iptables-persistent
netfilter-persistent save
netfilter-persistent reload
6. 结论
在处理 Linux 防火墙时,永远不要依赖手动敲脚本里的 iptables 命令来初始化防火墙(容易导致中间状态或执行慢)。
正确的做法是:
- 在测试机上配置好规则。
- 使用
iptables-save导出。 - 在生产环境使用
iptables-restore原子性地加载。
This post is licensed under CC BY 4.0 by the author.