另一个办法是先装入iptables-restore文档,再运行一个特定的脚本把动态的规则装入。其实,这也是较笨的方法。iptables-restore并不适合于使用动态IP的场合,假如您想在配置文档里使用选项来实现不同的需要,iptables-restore也不适用。
iptables-restore和iptables-save更有一个不足,就是功能不够齐全。因为使用的人不是太多,所以发现这个问题的人也不多,更有就是一些match和target被引用时考虑不细致,这可能会出现我们预期之外的行为。 尽管存在这些问题,我还是强烈建议您使用他们,因为他们对于大部分规则集工作的还是很好的,只要在规则中别包含那些新的都不知如何使用的match和target。
5.3. iptables-save
iptables-save用来把当前的规则存入一个文档里以备iptables-restore使用。他的使用很简单,只有两个参数:
iptables-save [-c] [-t table]
参数-c的作用是保存包和字节计数器的值。这能够使我们在重启防火墙后不丢失对包和字节的统计。带-c参数的iptables-save命令使重启防火墙而不中断统计记数程式成为可能。这个参数默认是不使用的。
参数-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结束,他说明在这一点,就要把规则装入内核了。
上面的例子是最基本的,我想用一个简短的例子说明会更好,其中包含一个很小的规则集Iptables-save ruleset。iptables-save的输出如下:
# 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参数。除了有计数器,其他的都和普通的脚本相同。现在的问题是怎么把输出保存到文档中。很简单,既然使用linux,您应该早就知道了,用重定向啊:
iptables-save -c > /etc/iptables-save
这就会把规则集保存到/etc/iptables-save中,而且更有计数器。
5.4. iptables-restore
iptables-restore用来装载由iptables-save保存的规则集。不幸的是,他只能从标准输入接受输入,而不能从文档接受。下面是他的事方法:
iptables-restore [-c] [-n]
参数-c需要装入包和字节计数器。假如您用iptables-save保存了计数器,现在想重新装入,就必须用这个参数。他的另一种较长的形式是--counters。
参数-n告诉iptables-restore不要覆盖已有的表或表内的规则。默认情况是清除任何已存的规则。这个参数的长形式是--noflush。
用iptables-restore装载规则有好几种方法,我们来看看最简单、最一般的:
这样规则集应该正确地装入内核并正常工作了。假如有问题,您就要除措了。