- Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能: 1) 网络地址转换(Network Address Translate) 2) 数据包内容修改 3) 以及数据包过滤的防火墙功能 Netfilter平台中制定了五个数据包的挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候有机会改变它们 的方向、内容),这5个挂载点分别是 1) PRE_ROUTING 2) INPUT 3) OUTPUT 4) FORWARD 5) POST_ROUTING
- Iptables Netfilter所设置的规则是存放在内核内存中的,Iptables是一个应用层(Ring3)的应用程序,它通过Netfilter放出的接口来对存放在内核内存中的Xtables(Netfilter的配置表)进行修改 (这是一个典型的Ring3和Ring0配合的架构)
Xtables
我们知道Netfilter是负责实际的数据流改变工作的内核模块,而Xtables就是它的规则配置文件,Netfilter依照Xtables的规则来运行,Iptables在应用层负责修改这个规则文件。
Xtables 由表,链,规则rule组成
Filter(表)
filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作
1) INPUT(链)
INPUT针对那些目的地是本地的包1.1\) 规则rule
..
2) FORWARD(链)
FORWARD链过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包2.1\) 规则rule
..
3) OUTPUT(链)
OUTPUT是用来过滤所有本地生成的包3.1\) 规则rule
..
Nat(表)
Nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包(因为包
的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表
,一个一个的被NAT,而是自动地完成
1) PREROUTING(链)
PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址1.1\) 规则rule
..
2) INPUT(链)2.1\) 规则rule
..
3) OUTPUT(链)
OUTPUT链改变本地产生的包的目的地址3.1\) 规则rule
..
4) POSTROUTING(链)
POSTROUTING链在包就要离开防火墙之前改变其源地址。4.1\) 规则rule
..
Mangle(表)
这个表主要用来mangle数据包。我们可以改变不同的包及包 头的内容,比如 TTL,TOS或MARK。 注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规
则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。注意,mangle表不能做任何NAT,它只是改变数据包的TTL,TOS或MARK,而不是其源目地址。NAT必须在nat表中操作的。
1) PREROUTING(链)
PREROUTING在包进入防火墙之后、路由判断之前改变 包1.1\) 规则rule
..
2) INPUT(链)
INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包2.1\) 规则rule
..
3) FORWARD(链)
FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包3.1\) 规则rule
..
4) OUTPUT(链)
OUTPUT在确定包的目的之前更改数据包4.1\) 规则rule
..
5) POSTROUTING(链)
POSTROUTING是在所有路由判断之后5.1\) 规则rule
Netfilter的Hook点
Netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK)(或者说是回调函数),而在每个检测点上登记(callback)了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)
- NF_IP_PRE_ROUTING:
刚刚通过数据链路层解包,进入网络层的数据包通过此点(刚刚进行完版本号,校验
和等检测),目的地址转换在此点进行 - NF_IP_LOCAL_IN
经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行 - NF_IP_FORWARD
要转发的包通过此检测点,FORWARD包过滤在此点进行 - NF_IP_POST_ROUTING
所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行 - NF_IP_LOCAL_OUT
本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行
总结:
当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"
判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它
本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
- 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)