iptables各个表的优先级:4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter。
iptables利用表和链处理每个经过的数据包,具体流程(步骤)如下:
数据包到达网络接口,比如 eth0。
进入 raw 表的 PREROUTING 链,这个链的作用是在连接跟踪之前处理数据包。
如果进行了连接跟踪,则进行处理。
进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不做过滤。
决定路由,看是交给本地主机还是转发给其它主机,即决定是否继续往内还是往外。
到了这里需要分两种不同的情况进行讨论了。
若数据包决定要转发给其它主机,这时候它会依次经过:
进入 mangle 表的 FORWARD 链,这里是在第一次路由(即步骤6)决定之后,在进行最后的路由决定之前,仍然可以对数据包进行某些修改。
进入 filter 表的 FORWARD 链,这里可以对所有转发的数据包进行过滤。
进入 mangle 表的 POSTROUTING 链,这里将完成了所有的路由决定,但数据包仍然在本地主机,还可以进行某些修改。
进入 nat 表的 POSTROUTING 链,这里一般都是用来做 SNAT ,不在这里进行过滤。
进入出去的网络接口,然后进行发送。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
进入 mangle 表的 INPUT 链,这里是在第一次路由(即步骤6)决定之后,在进行最后的路由决定之前,仍然可以对数据包进行某些修改。
进入 filter 表的 INPUT 链,这里可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
交给本地主机的应用程序进行处理。
处理完毕后进行路由决定,看该往那里发出。
进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
连接跟踪对本地的数据包进行处理。
进入 mangle 表的 OUTPUT 链,这里可以修改数据包,但不做过滤。
进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
再次进行路由决定。
进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步(里将完成了所有的路由决定,但数据包仍然在本地主机,还可以进行某些修改。)。
进入 nat 表的 POSTROUTING 链,同上一种情况的第10步(里一般都是用来做 SNAT ,不在这里进行过滤。)。
进入出去的网络接口,然后进行发送。