6.5.5 如何保存运行中的iptables规则

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

为了解决这个问题,可以使用命令iptables-save和iptables-restore。iptables-save用来把规则集保存到一个特殊格式的文本文件里,而iptables-restore则用来把这个文件重新装入内核空间中。这两个命令最好的地方在于只需要调用一次就可以装载和保存规则集,而不像在脚本中每个规则的改动都要调用一次iptables。iptables-save运行一次就可以把整个规则集从内核里提取出来,并保存到文件里,而iptables-restore每次只会装入一个规则表。换句话说,对于一个很大的规则集,如果用脚本来设置,那么这些规则就会反反复复地被卸载、安装,而我们现在可以把整个规则集一次性保存下来,安装时一次一个规则表,这样就可以节约大量的时间了。如果你的工作对象是一组巨大的规则,采用这两个工具将是明智的选择。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

系统启动iptables的规则后,默认有如下规则(虽然比较人性化,但很多时候达不到我们的要求,所以这里大家了解一下就好,不需要做深入研究,可以用cat命令来查看):

cat /etc/sysconfig/iptables

命令显示结果如下所示:

# Firewall configuration written by system-config-securitylevel

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT

-A FORWARD -j RH-Firewall-1-INPUT

-A RH-Firewall-1-INPUT -i lo -j ACCEPT

-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT

-A RH-Firewall-1-INPUT -p 50 -j ACCEPT

-A RH-Firewall-1-INPUT -p 51 -j ACCEPT

-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state ESTABLISHED、

RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

目前编写和调试iptables防火墙的通用做法还是通过脚本来进行的,这相对而言更为方便,调试的效率也更高,特别是按照标准流程来编写iptables脚本以后。当然这两种方法各有各的优点,我们可以根据自己的环境来选择到底采用哪种方法来保存iptables脚本,笔者个人还是倾向于自己手动编写iptables脚本。