当前位置: > Linux服务器 > iptables >

Iptables 指南 1.1.19(6)

时间:2014-12-10 23:35来源:www.it.net.cn 作者:IT
Chapter 5. 规则的保存与恢复
iptables提供了两个很有用的工具用来处理大规则集: iptables-save和iptables-restore,它们把规则存入一个与标准脚本代码只有 细微查别的特殊格式的文件中,或从中恢复规则。
 
5.1. 速度
使用iptables-save和iptables-restore的一个最重要的 原因是,它们能在相当程度上提高装载、保存规则的速度。使用脚本更改规则的问题是,改动每个规则都要 调运命令iptables,而每一次调用iptables,它首先要把Netfilter内核空间中的整个规则集都提取出来, 然后再插入或附加,或做其他的改动,最后,再把新的规则集从它的内存空间插入到内核空间中。这会花费 很多时间。
 
为了解决这个问题,可以使用命令iptables-save和restore 。 iptables-save用来把规则集保存到一个特殊格式的文本文件里,而iptables-restore是用来把这个文件重新装入内核空间的。这两个命令最好的地方在于 一次调用就可以装载和保存规则集,而不象脚本中每个规则都要调用一次iptables。 iptables-save运行一次就可以把整个规则集从内核里提取出来,并保存到文件里,而iptables-restore每次装入一个规则表。换句话说,对于一个很大的规则集,如果用脚 本来设置,那这些规则就会反反复复地被卸载、安装很多次,而我们现在可以把整个规则集一次就保存下 来,安装时则是一次一个表,这可是节省了大量的时间。
 
如果你的工作对象是一组巨大的规则,这两个工具是明显的选择。当然,它们也有不足之处,下面的章 节会详细说明。
 
5.2. 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。
 
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装载规则有好几种方法,我们来看看最简单、最一般的:
 
这样规则集应该正确地装入内核并正常工作了。如果有问题,你就要除措了。 (责任编辑:IT)
------分隔线----------------------------