iptables通过socket接口对netfilter进行操作,创建socket的方法如下:
socket(TC_AF,SOCK_RAW,IPPROTO_RAW);
其中TC_AF就是AF_INET,然后通过getsockopt()和setsockopt()系统调用来读取和更改netfilter的设置。
netfilters/iptables就好像是一个网络包裹传送和转发中心,如图12.2所示。它预先配好了五条传送带,它们是PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING,并且配备了4个非常先进的包裹过滤处理规范(表),它们是filter、nat、mangle和raw。4个表的优先级由高到低的顺序为:raw>mangle>nat>filter。举例来说:如果在PRROUTING链上,既有mangle表,也有nat表,那么先由mangle表处理,然后再由nat表处理。raw表只在PREROUTING链和OUTPUT链上使用,因为优先级最高,从而拥有对收到的数据包在连接跟踪前进行处理的特权。一但用户在某个链上使用了raw表,处理方式就很简单粗暴。当raw表处理完后,会跳过nat表和 ip_conntrack的处理,直接拍拍屁股离开这条链,即不再做地址转换和数据包的链接跟踪处理了。raw表可以应用在那些不需要做nat的情况以提高性能。例如在有大量访问的web服务器上设置一下规则,实行从80端口来的数据包不麻烦iptables做链接跟踪处理的策略。采用这种策略会提高用户的访问速度。
理解了 iptables 的工作原理后,我们再来看看它的命令格式:
iptables [-t table] command [match] [target/jump]
在iptables命令里,
(1) 选项-t用来指定使用哪个表,它可以是表中的任何一个,默认是filter表,关于iptables过滤表的说明如表12.3所示。
表12.3iptables 过滤表
表名 | 解释 |
nat | nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址。如果需要的话,OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。 |
mangle | 这个表主要用来mangle[1]数据包。我们可以改变包及包头的内容,比如 TTL、TOS或MARK。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING、POSTROUTING、OUTPUT、INPUT和FORWARD。Mangle包操作在这个5个链中的不同位置上执行。PREROUTING在包进入防火墙之后、路由判断之前,POSTROUTING是在所有路由判断之后,OUTPUT在确定包的目的之前,INPUT在包被路由到本地之后以及在用户空间的程序看到它之前,FORWARD在最初的路由判断之后、最后一次更改包的目的之前。注意,mangle表不能做任何NAT,它只是改变数据包的TTL、TOS或MARK,而不是其源或目的地址。NAT是在nat表中操作的。 |
filter | filter表是专门过滤包的,内建三个链,对包进行DROP、LOG、ACCEPT和REJECT[2]等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。 |
raw | 在netfilter框架中非常靠前的表,在PREROUTING和OUTPUT链上有钩子,所以可以对收到的数据包在连接跟踪前进行处理。在其他表处理之前,-j NOTRACK会跳过其它表处理。例如可以使用 “NOTRACK” target 允许规则指定80端口的包不进入NAT子系统的链接跟踪。 |
上面介绍了四个表的最基本的内容。你不仅要清楚它们的使用目的,还要清楚每一条链的使用方法才能更好地实现你所要达到的目的。如果你不了解的话,就可能会在防火墙上留下漏洞,给不法之徒以可乘之机。
(2) command指定iptables 对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或做点儿其他什么有意义的事情。
(3) match提供了判断数据包的匹配条件。iptables 的匹配条件繁多,提供了从协议、ip地址、网络接口、MAC地址、最大匹配速度和状态方面的通用及其扩展匹配选项。由于篇幅有限,各种匹配项目的说明还有劳各位自己查找参考手册。
(4) target/jump决定符合条件的包到何处去,语法是--jump target或-j target。Target和Jump唯一的区别是jump的目标是一个在同一个表内的链,而target的目标是具体的操作。例如ACCEPT和DROP是两个基本的target。
图12.2 网络包裹传送流程