iptables 提供了两个很有用的工具用来处理大规则集: iptables-save 和iptables-restore,它们把规则存入一个与标准脚本代码只有细微查别的特殊格式的文件中,或从中恢复规则。
使用 iptables-save 和 iptables-restore 的一个最重要的原因是,它们能在相当程度上提高装载、保存规则的速度。使用脚本更改规则的问题是,改动每个规则都要调运命令 iptables,而每一次调用 iptables,它首先要把 Netfilter 内核空间中的整个规则集都提取出来,然后再插入或附加,或做其他的改动,最后,再把新的规则集从它的内存空间插入到内核空间中。这会花费很多时间。
为了解决这个问题,可以使用命令 iptables-save 和 restore 。 iptables-save用来把规则集保存到一个特殊格式的文本文件里,而 iptables-restore 是用来把这个文件重新装入内核空间的。这两个命令最好的地方在于一次调用就可以装载和保存规则集,而不象脚本中每个规则都要调用一次 iptables。iptables-save 运行一次就可以把整个规则集从内核里提取出来,并保存到文件里,而 iptables-restore 每次装入一个规则表。换句话说,对于一个很大的规则集,如果用脚本来设置,那这些规则就会反反复复地被卸载、安装很多次,而我们现在可以把整个规则集一次就保存下来,安装时则是一次一个表,这可是节省了大量的时间。
iptables-restore 的主要不足是不能用来做复杂的规则集。例如,我们想在计算机启动时获取连接的动态分配的 IP 地址,然后用在脚本里。这一点,用 iptables-restore 来实现,或多或少是不可能的。另外还有一个不足地方是功能不够齐全。因为使用的人不是太多,所以发现这个问题的人也不多,还有就是一些 match和target 被引用时考虑不细致,这可能会出现我们预期之外的行为。
iptables-save 用来把当前的规则存入一个文件里以备 iptables-restore 使用。
iptables-save [-c] [-t table ]
参数-c 的作用是保存包和字节计数器的值。这可以使我们在重启防火墙后不丢失对包和字节的统计。带-c 参数的 iptables-save 命令使重启防火墙而不中断统计记数程序成为可能。这个参数默认是不使用的。
参数-t 指定要保存的表,默认是保存所有的表。
输出格式解释:
#后面的是注释。表都以*开始,例如*mangle。每个表都包含链和规则,链的详细说明是: [:]。例如,链的名字是PREROUTING,策略是 ACCEPT,然后是包记数器和字节计数器,这两个计数器和iptables -L -v 输出中用到的计数器一样。每个表的描述都以关键字 COMMIT 结束,它说明在这一点,就要把规则装入内核了。
保存配置可使用重定向:
iptables-save -c > /etc/iptables-save
这就会把规则集保存到/etc/iptables-save 中,而且还有计数器。
iptables-restore 用来装载由 iptables-save 保存的规则集。只能从标准输入接受输入,而不能从文件接受。
iptables-restore [-c] [-n]
参数-c 要求装入包和字节计数器。如果你用 iptables-save 保存了计数器,现在想重新装入,就必须用这个参数。
参数-n 告诉 iptables-restore 不要覆盖已有的表或表内的规则。默认情况是清除所有已存的规则。
这样规则集应该正确地装入内核并正常工作了。
温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!