1. Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能: 1) 网络地址转换(Network Address Translate) 2) 数据包内容修改 3) 以及数据包过滤的防火墙功能 Netfilter平台中制定了五个数据包的挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候有机会改变它们 的方向、内容),这5个挂载点分别是 1) PRE_ROUTING 2) INPUT 3) OUTPUT 4) FORWARD 5) POST_ROUTING
  2. Iptables Netfilter所设置的规则是存放在内核内存中的,Iptables是一个应用层(Ring3)的应用程序,它通过Netfilter放出的接口来对存放在内核内存中的Xtables(Netfilter的配置表)进行修改 (这是一个典型的Ring3和Ring0配合的架构)

Xtables

我们知道Netfilter是负责实际的数据流改变工作的内核模块,而Xtables就是它的规则配置文件,Netfilter依照Xtables的规则来运行,Iptables在应用层负责修改这个规则文件。

Xtables 由表,链,规则rule组成

  1. Filter(表)
    filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作
    1) INPUT(链)
    INPUT针对那些目的地是本地的包

     1.1\) 规则rule
    

    ..
    2) FORWARD(链)
    FORWARD链过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包

     2.1\) 规则rule
    

    ..
    3) OUTPUT(链)
    OUTPUT是用来过滤所有本地生成的包

     3.1\) 规则rule
    

    ..

  2. 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
    

    ..

  3. 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等,甚至可以是 用户自定义的功能)

  1. NF_IP_PRE_ROUTING:
    刚刚通过数据链路层解包,进入网络层的数据包通过此点(刚刚进行完版本号,校验
    和等检测),目的地址转换在此点进行
  2. NF_IP_LOCAL_IN
    经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行
  3. NF_IP_FORWARD
    要转发的包通过此检测点,FORWARD包过滤在此点进行
  4. NF_IP_POST_ROUTING
    所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行
  5. NF_IP_LOCAL_OUT
    本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行

总结:

  1. 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"
    判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)

  2. 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它

  3. 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)

  4. 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)

results matching ""

    No results matching ""