当前位置 博文首页 > 积水成渊:netfilter框架分析

    积水成渊:netfilter框架分析

    作者:[db:作者] 时间:2021-07-29 12:35

    一、概述

    1. Netfilter/IPTables框架简介

    ??? ??? ? Netfilter/IPTables是继2.0.xIPfwadm2.2.xIPchains之后,新一代的Linux防火墙机制。Netfilter采用模块化设计,具有良好的可扩充性。其重要工具模块IPTables连接到Netfilter的架构中,并允许使用者对数据报进行过滤、地址转换、处理等操作。

    ??? ???? Netfilter提供了一个框架,将对网络代码的直接干涉降到最低,并允许用规定的接口将其他包处理代码以模块的形式添加到内核中,具有极强的灵活性。

    2.?主要源代码文件

    • Linux内核版本:2.4.21

    • Netfilter主文件:net/core/netfilter.c

    ??? ??? ??? Netfilter主头文件:include/linux/netfilter.h

    • IPv4相关:

    ??? ??? ??? ??? ??? ? c文件:net/ipv4/netfilter/*.c

    ??? ???? 头文件:include/linux/netfilter_ipv4.h

    ??? ??? ??? ??? ??? ??? ??? ?? ?? ??? include/linux/netfilter_ipv4/*.h

    • IPv4协议栈主体的部分c文件,特别是与数据报传送过程有关的部分:

    ??? ??? ??? ??? ??? ??? ip_input.cip_forward.cip_output.cip_fragment.c

    ?

    ?

    二、Netfilter/IPTables-IPv4总体架构

    ??? ??? Netfilter主要通过表、链实现规则,可以这么说,Netfilter是表的容器,表是链的容器,链是规则的容器,最终形成对数据报处理规则的实现。

    ?? 详细地说,Netfilter/IPTables的体系结构可以分为三个大部分:

    1. NetfilterHOOK机制

    ??? ??? Netfilter的通用框架不依赖于具体的协议,而是为每种网络协议定义一套HOOK函数。这些HOOK函数在数据报经过协议栈的几个关键点时被调用,在这几个点中,协议栈将数据报及HOOK函数标号作为参数,传递给Netfilter框架。

    ???? ????对于它在网络堆栈中增加的这些HOOK,内核的任何模块可以对每种协议的一个或多个HOOK进行注册,实现挂接。这样当某个数据报被传递给Netfilter框架时,内核能检测到是否有任何模块对该协议和HOOK函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查、修改、丢弃该数据报及指示Netfilter将该数据报传入用户空间的队列。

    ??? 这样,HOOK提供了一种方便的机制:在数据报通过Linux内核的不同位置上截获和操作处理数据报。

    2. IPTables基础模块

    ??? ??? IPTables基础模块实现了三个表来筛选各种数据报,具体地讲,Linux2.4内核提供的这三种数据报的处理功能是相互间独立的模块,都基于NetfilterHOOK函数和各种表、链实现。这三个表包括:filter表,nat表以及mangle表。

    3.?具体功能模块

    1. ?
      1. 数据报过滤模块

      2. 连接跟踪模块(Conntrack

      3. 网络地址转换模块(NAT

      4. 数据报修改模块(mangle

      5. 其它高级功能模块

    于是,Netfilter/IPTables总体架构如图http://blog.chinaunix.net/photo/24896_061206192251.jpg所示

    三、HOOK的实现

    1. Netfilter-IPv4中的HOOK

    ??? ??? Netfilter模块需要使用HOOK来启用函数的动态钩接,它在IPv4中定义了五个HOOK(位于文件include/linux/netfilter_ipv4.hLine 39),分别对应0-4hooknum

    简单地说,数据报经过各个HOOK的流程如下:

    ??? 数据报从进入系统,进行IP校验以后,首先经过第一个HOOK函数NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,其决定该数据报是需要转发还是发给本机的;若该数据报是发被本机的,则该数据经过HOOK函数NF_IP_LOCAL_IN处理以后然后传递给上层协议;若该数据报应该被转发则它被NF_IP_FORWARD处理;经过转发的数据报经过最后一个HOOK函数NF_IP_POST_ROUTING处理以后,再传输到网络上。本地产生的数据经过HOOK函数NF_IP_LOCAL_OUT?处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送出去。

    ??? 总之,这五个HOOK所组成的Netfilter-IPv4数据报筛选体系如图http://blog.chinaunix.net/photo/24896_061206192311.jpg:?(注:下面所说Netfilter/IPTables均基于IPv4,不再赘述)

    详细地说,各个HOOK及其在IP数据报传递中的具体位置如图http://blog.chinaunix.net/photo/24896_061206192340.jpg

    • NF_IP_PRE_ROUTING (0)

    ??? 数据报在进入路由代码被处理之前,数据报在IP数据报接收函数ip_rcv()(位于net/ipv4/ip_input.cLine379)的最后,也就是在传入的数据报被处理之前经过这个HOOK。在ip_rcv()中挂接这个HOOK之前,进行的是一些与类型、长度、版本有关的检查。

    ??? 经过这个HOOK处理之后,数据报进入ip_rcv_finish()(位于net/ipv4/ip_input.cLine306),进行查路由表的工作,并判断该数据报是发给本地机器还是进行转发。

    ??? 在这个HOOK上主要是对数据报作报头检测处理,以捕获异常情况。

    涉及功能(优先级顺序):Conntrack(-200)mangle(-150)DNAT(-100)

    • NF_IP_LOCAL_IN?(1)

    ??? 目的地为本地主机的数据报在IP数据报本地投递函数ip_local_deliver()(位于net/ipv4/ip_input.cLine290)的最后经过这个HOOK

    ??? 经过这个HOOK处理之后,数据报进入ip_local_deliver_finish()(位于net/ipv4/ip_input.cLine219

    ??? 这样,IPTables模块就可以利用这个HOOK对应的INPUT规则链表来对数据报进行规则匹配的筛选了。防火墙一般建立在这个HOOK上。

    涉及功能:mangle(-150)filter(0)SNAT(100)Conntrack(INT_MAX-1)

    • NF_IP_FORWARD?(2)

    ??? 目的地非本地主机的数据报,包括被NAT修改过地址的数据报,都要在IP数据报转发函数ip_forward()(位于net/ipv4/ip_forward.cLine73)的最后经过这个HOOK

    ??? 经过这个HOOK处理之后,数据报进入ip_forward_finish()(位于net/ipv4/ip_forward.cLine44

    ??? 另外,在net/ipv4/ipmr.c中的ipmr_queue_xmit()函数(Line1119)最后也会经过这个HOOK。(ipmr为多播相关,估计是在需要通过路由转发多播数据时的处理)

    ??? 这样,