UP | HOME

规则的保存和恢复

Table of Contents

iptables提供了两个很有用的工具用来处理大规则集:

它们把规则存入一个与标准脚本代码只有 细微查别的特殊格式的文件中,或从中恢复规则

速度

使用 iptables-saveiptables-restore 的一个最重要的原因是,它们能在相当程度上 提高装载、保存规则的速度 。使用脚本更改规则的问题是,改动每个规则都要调运命令iptables,而每一次调用iptables,它首先要把Netfilter内核空间中的整个规则集都提取出来, 然后再插入或附加,或做其他的改动,最后,再把新的规则集从它的内存空间插入到内核空间中。这会花费很多时间

为了解决这个问题,可以使用命令:

  • iptables-save : 把规则集保存到一个特殊格式的文本文件里
  • iptables-restore: 把这个文件重新装入内核空间的

这两个命令最好的地方在于一次调用就可以装载和保存规则集,而不象脚本中每个规则都要调用一次iptables。 iptables-save运行一次就可以把整个规则集从内核里提取出来,并保存到文件里,而iptables-restore每次装入一个规则表。换句话说,对于一个很大的规则集,如果用脚本来设置,那这些规则就会反反复复地被卸载、安装很多次,而现在可以把整个规则集一次就保存下来,安装时则是一次一个表,这可是节省了大量的时间

restore的缺陷

iptables-restore能替代所有的脚本来设置规则吗?不,到现在为止不行,很可能永远都不行

iptables-restore的主要不足是 不能用来做复杂的规则集 。例如,想在计算机启动时获取连接的动态分配的IP地址,然后用在脚本里。这一点,用iptables-restore来实现,或多或少是不可能的

一个可能的解决办法是 写一个小脚本来获取那个IP地址,并在iptables-restore调用的配置文件中设置相应的关键字,然后用获取的IP值替换关键字 。可以把更改后的配置文件存到一个临时文件中,再由iptables-restore使用它。然而这会带来很多问题,并且 不能用iptables-save来保存带关键字的配置文件

另一个办法是先装入iptables-restore文件,再运行一个特定的脚本把动态的规则装入。其实,这也是较笨的方法。iptables-restore并不适合于使用动态IP的场合,如果想在配置文件里使用选项来实现不同的要求,iptables-restore也不适用

iptables-restore和iptables-save还有一个不足,就是 功能不够齐全 。因为使用的人不是太多,所以发现这个问题的人也不多,还有就是一些match和target被引用时考虑不细致,这可能会出现预期之外的 行为

尽管存在这些问题,我还是强烈建议你使用它们,因为它们对于大部分规则集工作的还是很好的, 只要在规则中别包含那些新的都不知如何使用的match和target

iptables-save

iptables-save 用来把当前的规则存入一个文件里以备iptables-restore使用。它的使用很简单,只有两个参数:

iptables-save [-c] [-t table]
  • -c : 保存包和字节计数器的值。这可以使重启防火墙后不丢失对包和字节的统计,默认是 不使用
  • -t : 指定要保存的表,默认是 保存所有的表

下面给出未装载任何规则的情况下iptables-save的输出:

# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*filter
:INPUT ACCEPT [404:19766]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [530:43376]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*mangle
:PREROUTING ACCEPT [451:22060]
:INPUT ACCEPT [451:22060]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [594:47151]
:POSTROUTING ACCEPT [594:47151]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
  • # 后面的是注释
  • 表都以 *<table-name> 开始,例如 *mangle 。每个表都包含链和规则:
    • 链的详细说明是 :<chain-name> <chain-policy> [<packet-counter>:<byte-counter>] 。例如:
      • 链的名字是 PREROUTING
      • 策略是 ACCEPT
      • 包记数器
      • 字节计数器,这两个计数器和 iptables -L -v 输出中用到的计数器一样
      • 每个表的描述都以关键字 COMMIT 结 束:说明在这一点,就要把规则装入内核了

另外一个例子的输出如下:

# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*filter
:INPUT DROP [1:229]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*mangle
:PREROUTING ACCEPT [658:32445]
:INPUT ACCEPT [658:32445]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [891:68234]
:POSTROUTING ACCEPT [891:68234]
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*nat
:PREROUTING ACCEPT [1:229]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
-A POSTROUTING -o eth0 -j SNAT --to-source 195.233.192.1 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002

每个命令前都有包和字节计数器,这说明使用了 -c 参数

把规则集保存到/etc/iptables-save中,而且还有计数器:

$  iptables-save -c > /etc/iptables-save

iptables-restore

iptables-restore 用来装载由iptables-save保存的规则集。不幸的是, 它只能从标准输入接受输入,而不能从文件接受 。下面是它的指令:

iptables-restore [-c] [-n]
  • -c : 要求装入包和字节计数器。如果你用保存了计数器,现在想重新装入,就必须用这个参数
  • -n : 不要覆盖已有的表或表内的规则。默认情况是 清除所有已存的规则

Next:规则

Previous:状态机制

目录