规则的保存和恢复
Table of Contents
iptables提供了两个很有用的工具用来处理大规则集:
- iptables-save
- iptables-restore
它们把规则存入一个与标准脚本代码只有 细微查别的特殊格式的文件中,或从中恢复规则
速度
使用 iptables-save 和 iptables-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 结 束:说明在这一点,就要把规则装入内核了
- 链的详细说明是 :<chain-name> <chain-policy> [<packet-counter>:<byte-counter>] 。例如:
另外一个例子的输出如下:
# 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 : 不要覆盖已有的表或表内的规则。默认情况是 清除所有已存的规则