基于Linux系统的包过滤防火墙(4)
来源:asp之家 时间:2009-09-19 20:21:00
关于ICMP类型的更详细的表述参见RFC792。
2.2 iptables语法
2.2.1 Iptables的优点
→iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。
→iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。
→系统日志比ipchains更容易配置,扩展性也更好。
→对于网络地址转换(NetworkAddressTranslation)和透明代理的支持,Netfilter更为强大和易于使用。
→iptables能够阻止某些DoS攻击,例如SYS洪泛攻击。
2.2.2 Iptables的规则要素
一条iptables规则基本上应该包含5个要素:
→指定表(table)
→指定操作命令(command)
→指定链(chains)
→指定规则匹配器(matcher)
→指定目标动作(target)
(1)表。Iptables从其使用的3个表而得名,分别是filter、nat、mangle。对于包过滤防火墙只使用filter表。表filter是默认的表,无需显示说明。
(2)操作命令。包括添加、删除、更新等。
(3)链。对于包过滤防火墙可操作filter表中的INPUT链、OUTPUT链和FORWARD链。也可以操作由用户自己定义的自定义链。
(4)规则匹配器。可以指定各种规则匹配,如IP地址、端口、包类型等。
目标动作。当规则匹配一个包时,真正要执行的任务用目标标识。最常用的内置目标分别是:
→ACCEPT表示允许包通过
→DROP表示被丢弃
此外,包过滤防火墙还可以使用扩展的目标:
→REJECT表示拒绝包,丢弃包的同时给发送者发送没有接受的通知。
→LOG表示包的有关信息被记录日志。
→TOS表示改写包的ToS的值。
要使用上述的扩展目标,必须在内核中激活相应选项或者装载了相应的内核模块。
2.2.3 Iptables工具的调用语法
Iptables的语法非常复杂,要查看该工具的完整语法,应该查看其手册页。
Iptables的语法通常可以简化为下面的形式:
Iptables[-t table]CMD[chain][rule-matcher][-j target]
其中:tables为表名,CMD为操作命令,chain为链名,rule-matcher为规则匹配器,target为目标动作。
2.2.4 制定永久性规则
iptables软件包提供了两个命令分别用于保存和恢复规则集。可以使用下在的命令转储在内存中的内核规则集。其中/etc/sysconfig/iptables是iptables守护进程调用的默认规则集文件:
#/sbin/iptables-save >; /etc/sysconfig/iptables
要恢复原来的规则库,需使用命令:
#/sbin/iptables-restore < /etc/sysconfig/iptables
为了使得用iptables命令配置的规则在下次启动机器时还能被使用,有两种主法。
(1)使用iptables的启动脚本实现。Iptables的启动脚本/etc/rc.d/init.d/iptables每次启动时都使用/etc/sysconfig/iptables所提供的规则进行规则恢复,并可以使用如下的命令保存规则:
#service iptables save
(2)在自定义脚本中用iptables命令直接创建规则集。可以直接用iptables命令编写一个规则脚本,并在启动时执行这个脚本。
例如:若规则脚本的文件名为/etc/fw/rules,则可以在启动脚本/etc/rd.d/init.d/rc.local中加入下面的代码:
if[-x /etc/fw/rules];then /etc/fw/rules;fi;
这样,机器每次启动时即可执行该规则脚本。
如果使用此种方式,建议使用ntsysv命令关闭系统的iptables守护进程。
2.3 iptables命令使用举例
2.3.1 链的基本操作
(1)清除所有的规则。通常在开始配置包过滤防火墙之初清除所有的规则,重新开始配置,以免原有的规则影响新的设定。使用如下命令进行:
1) 清除预设表filter中所有规则链中的规则。
#iptables -F
2)清除预设表filter中使用者自定义链中的规则。
#iptables -X
3)将指定链所有规则的包字节记数器清零。
#iptables -Z
(2)设置链的默认策略。一般地,配置链的默认策略有两种方法。
1)首先允许所有的包,然后再禁止有危险的包通过防火墙。即“没有被拒绝的都允许”。这种方法对于用户而言比较灵活方便,但对系统而言,容易引起严重的安全问题。
为此,应该使用如下的初始化命令:
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
2)首先禁止所有的包,然后再根据需要的服务允许特定的包通过防火墙。即“没有明确允许的都被拒绝”。这种方法最安全,但不太方便。为了使得系统有足够的安全性,一般采用此种策略进行iptables防火墙的配置。
为此,应该使用如下的初始化命令:
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWAED DROP
3)列出表/链中的所有规则。包过滤防火墙只使用filter表,此表为默认的表,因此可以使用下面的命令列出filter表中所有规则:
#iptables -L
使用上面的命令时,iptables将逆向解析IP地址,这将发费很多时间,从而造成信息出来的非常慢。为了解决这个问题,可以使用下面的带有-n参数的命令(-n参数用于显示数字化的地址和端口):
#iptables -L -n
4)向链中添加规则。下面的语句用于开放网络接口:
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -j ACCEPT
#iptables -A OUTPUT -o eth0 -j ACCEPT
#iptables -A FORWARD -i eth0 -j ACCEPT
#iptables -A FPRWAED -o eth0 -j ACCEPT
5)使用用户自定义链。下面是一个用户自定义链的创建、修改和调用的简单命令序列: