iptables遍历表和链

这一章我们来讨论数据包是以什么顺序、如何遍历不同的链和表的。稍后,在你自己写规则时,就会知道这个顺序是多么的重要。一些组件是iptables与内核共用的,比如,数据包路由的判断。了解到这一点是很重要的,尤其在你用iptables改变数据包的路由时。这会帮助你弄明白数据包是如

何以及为什么被那样路由,一个好的例子是DNAT和SNAT,不要忘了TOS的作用

概述

当一个报文进入防火墙时候,首先触发硬件,接着被传递给内核中的合适设备。在这个报文到最终目的之前,它会在内核中会经历一系列步骤,
首先我们来看一下目的是本机的报文,在被实际送到最终的应用程序前,它会通过如下的步骤:

1.                     到了接口上(例如eth0)
2.raw       PREROUTING 这个链在连接跟踪之前处理报文,它能够设置一条连接不被连接跟踪处理。
3.                     这儿是连接跟踪处理的点
4.mangle    PREROUTING 这个链主要用来修改报文,例如修改TOS等等。
5.nat       PREROUTING 这个链主要用来处理DNAT,我们应该避免在这条链里面做过滤,因为可能有一些报文会漏掉。
6.                     路由决定,例如决定报文是上本机还是转发或者其他地方。
7.mangle    INPUT      到了这点,mangle表的INPUT链被使用,在把这个报文实际送给本机前,路由之后,我们需要再次修改报文。
8.filter    INPUT      在这儿我们对所有送往本机的报文进行过滤,要注意所有收到的并且目的地址为本机的报文都会经过这个链,而不管哪个接口进来的或者它往哪儿去。
10. 本地进程或者应用程序,例如服务器或者客户端程序。

下面我们在看看源地址是本机的报文,要经过哪些步骤:

1.                   本地进程或者应用程序
2.                   路由选择,用哪个源地址以及从哪个接口上出去,当然还有其他一些必要的信息。
3.raw     OUTPUT     这儿是你能够在连接跟踪生效前处理报文的点,这儿你可以标记某个连接不被连接跟踪处理。
4.                   这儿就是本地发出报文进行连接跟踪处理的地儿。
5.mangle  OUTPUT     这儿是我们修改报文的地方,在这儿做报文过滤是不被推荐的,因为它可能有副作用。
6.nat     OUTPUT     这儿对于本级发送的报文做目的NAT(DNAT)
7.filter  OUTPUT     这儿是对发送报文做过滤的地方。
8.                   路由决定,因为前面的mangle和nat表可能修改了报文的路由信息。
9.mangle POSTROUTING 这条链可能被两种报文遍历,一种是转发的报文,另外就是本级产生的报文。
10.nat   POSTROUTING 在这儿我们做源NAT(SNAT),我们建议你不要在这儿做报文过滤,因为有副作用。即使你设置了默认策略,一些报文也有可能溜过去。
11.                  在接口上发出(例如eth0)。

下面的例子我们假设报文的目的地址是另外一个网络要经过哪些步骤:

                      到了接口(例如eth0)
1.raw     PREROUTING  在这儿你可以设置不想被连接跟踪系统处理的连接。
2.                    这儿做的是非本地报文的连接跟踪系统处理
3.mangle  PREROUTING  这条链主要用来修改报文,例如改变TOS等等。
4.nat     PREROUTING  这条链主要完成DNAT,SNAT后面处理。在这条链上面不要做报文过滤。
5.                    路由决定,例如转发报文还是上送本机
6.mangle  FORWARD     包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。
7.filter  FORWARD     只有转发报文才会到这儿,因此这儿我们做所有报文的过滤。
8.                    路由决定,因为前面的mangle和nat表可能修改了报文的路由信息。
10.mangle POSTROUTING 这一步mangle是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。
11. nat   POSTROUTING 这个链只能作为SNAT作用,千万不要做报文过滤,伪装(Masquerading)也是在这儿工作的。
12. 到了报文的出接口(例如eth1)。

 

RAW表

RAW表的一个主要用途就是为了一件事情,那就是对报文设置一个标志,让这个报文不被连接跟踪系统所跟踪。我们通过NOTRACK target来实现这个功能。一个连接在NOTRACK里面被处理,接着连接跟踪系统就不会再处理这个报文。不增加一个表是解决不了前面的问题的,因为我们其他表都是在连接跟踪处理完之后再处理报文。

这个表只有PREROUTING和OUTPUT两个链,只是因为这两个地方是他们hit连接跟踪的唯一地方。

Mangle表

这个表主要用来进行报文修改,你可以自由的修改报文的TOS、TTL、MARK、SECMARK、CONNSECMARK之类的

NAT表

这个表只能用来完成NAT功能,换句话讲,它只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表只能用来完成NAT功能,换句话讲,它只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表的target有:

  1. DNAT
  2. SNAT
  3. MASQUERADE
  4. REDIRECT

DNAT target主要用在我们只有一个公网IP,然后我们需要把用户访问数据重定向到不同的服务器。换句话讲我们改变了报文的目的地址,然后重路由到实际主机。

SNAT target改变包的源地址,这在很大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似 192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。

MASQUERADE target的作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。

Filter表

这个表主要是用来报文过滤的,我们可以在任何时候匹配包并过滤它们。我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。

用户自定义链

一个报文在处理的时候能够通过jump规则跳转到本表的另外一个链,但是需要指出的是这个新的链表必须是用户自定义的,不能是任何内建的链表。这个规则的查询是逐条的,自上向下的。遍历结束的条件是被一个target终止或者内建的链表结束。

如果报文匹配都一个jump target,他就跳转到新的链里面自顶向下逐条匹配,直到遇到target终止或者return会主链。例如上面的图,在链1里面到tule3的时候匹配成功,跳到转链2从头开始执行,最后通过链2返回链1继续rule4的执行。

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
永久连接: http://www.nfvschool.cn/?p=259
标签:

发表评论