参考:https://www.linuxso.com/linuxpeixun/10330.html
iptables的数据包的流程介绍
iptables 相关概念
匹配(match)
:符合指定的条件,比如指定的 IP 地址和端口。
丢弃(drop)
:当一个包到达时,简单地丢弃,不做其它任何处理。
接受(accept)
:和丢弃相反,接受这个包,让这个包通过。
拒绝(reject)
:和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。
目标(target)
:指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
跳转(jump)
:和目标类似,不过它指定的不是一个具体的动作,而是另一个链,表示要跳转到那个链上。
规则(rule)
:一个或多个匹配及其对应的目标。
链(chain)
:每条链都包含有一系列的规则,这些规则会被依次应用到每个遍历该链的数据包上。每个链都有各自专门的用途, 这一点我们下面会详细讨论。
表(table)
:每个表包含有若干个不同的链,比如 filter 表默认包含有 INPUT,FORWARD,OUTPUT 三个链。iptables 有四个表,分别是:raw,nat,mangle和filter,每个表都有自己专门的用处,比如最常用filter表就是专门用来做包过滤的,而 nat 表是专门用来做NAT的。
策略(police)
:我们在这里提到的策略是指,对于 iptables 中某条链,当所有规则都匹配不成功时其默认的处理动作。
连接跟踪(connection track)
:又称为动态过滤,可以根据指定连接的状态进行一些适当的过滤,是一个很强大的功能,但同时也比较消耗内存资源。
经过iptables的数据包的流程介绍
一个数据包到达时,是怎么依次穿过各个链和表的(图)。
基本步骤如下:
-
数据包到达网络接口,比如 eth0。
-
进入
raw
表的PREROUTING
链,这个链的作用是赶在连接跟踪之前处理数据包。 -
如果进行了连接跟踪,在此处理。
-
进入
mangle
表的PREROUTING
链,在此可以修改数据包,比如 TOS 等。 -
进入
nat
表的PREROUTING
链,可以在此做DNAT,但不要做过滤。 -
决定路由,看是交给本地主机还是转发给其它主机。
到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
-
进入
mangle
表的FORWARD
链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。 -
进入
filter
表的FORWARD
链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。 -
进入
mangle
表的POSTROUTING
链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。 -
进入
nat
表的POSTROUTING
链,在这里一般都是用来做 SNAT,不要在这里进行过滤。 -
进入出去的网络接口。完毕。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
-
进入
mangle
表的INPUT
链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。 -
进入
filter
表的INPUT
链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。 -
交给本地主机的应用程序进行处理。
-
处理完毕后进行路由决定,看该往那里发出。
-
进入
raw
表的OUTPUT
链,这里是在连接跟踪处理本地的数据包之前。 -
连接跟踪对本地的数据包进行处理。
-
进入
mangle
表的OUTPUT
链,在这里我们可以修改数据包,但不要做过滤。 -
进入
nat
表的OUTPUT
链,可以对防火墙自己发出的数据做 NAT 。 -
再次进行路由决定。
-
进入
filter
表的OUTPUT
链,可以对本地出去的数据包进行过滤。 -
进入
mangle
表的POSTROUTING
链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。 -
进入
nat
表的POSTROUTING
链,同上一种情况的第10步。 -
进入出去的网络接口。完毕。