Post

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

关键部分说明

  1. 表声明 (*filter):以 * 开头,后面跟表名。表示接下来的内容属于哪个表。
  2. 链策略 (:CHAIN POLICY [packets:bytes])
    • : 开头。
    • 定义了链的名称(如 INPUT)和默认策略(如 ACCEPT 或 DROP)。
    • [] 内是该链默认策略匹配到的计数器(包数:字节数)。
  3. 规则定义 (-A CHAIN ...)
    • 这部分看起来和直接输入 iptables 命令非常像,但省略了 iptables 命令本身。
    • -A 表示追加规则。
  4. 提交 (COMMIT):表示当前表的规则定义结束,告知 iptables-restore 将上述变更提交到内核。

4. iptables-save vs iptables -L

特性iptables-saveiptables -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 命令来初始化防火墙(容易导致中间状态或执行慢)。

正确的做法是:

  1. 在测试机上配置好规则。
  2. 使用 iptables-save 导出。
  3. 在生产环境使用 iptables-restore 原子性地加载。
This post is licensed under CC BY 4.0 by the author.