1. <dl id='8o3ep'></dl>
      <ins id='8o3ep'></ins>
    2. <tr id='8o3ep'><strong id='8o3ep'></strong><small id='8o3ep'></small><button id='8o3ep'></button><li id='8o3ep'><noscript id='8o3ep'><big id='8o3ep'></big><dt id='8o3ep'></dt></noscript></li></tr><ol id='8o3ep'><table id='8o3ep'><blockquote id='8o3ep'><tbody id='8o3ep'></tbody></blockquote></table></ol><u id='8o3ep'></u><kbd id='8o3ep'><kbd id='8o3ep'></kbd></kbd>
    3. <span id='8o3ep'></span>
      <acronym id='8o3ep'><em id='8o3ep'></em><td id='8o3ep'><div id='8o3ep'></div></td></acronym><address id='8o3ep'><big id='8o3ep'><big id='8o3ep'></big><legend id='8o3ep'></legend></big></address>
      <fieldset id='8o3ep'></fieldset>

        <code id='8o3ep'><strong id='8o3ep'></strong></code>
      1. <i id='8o3ep'><div id='8o3ep'><ins id='8o3ep'></ins></div></i>
      2. <i id='8o3ep'></i>

          安全基础:简单解析Linux系统防火墙框架

          • 时间:
          • 浏览:5
          • 来源:124软件资讯网

            Linux系统中的Netfilter提供了一个抽象、通用化的框架  ,该框架界说的一个子功效的实现就是包过滤子系统  ,框架包罗以下五部门:

            1. 为每种网络协议(IPv4、IPv6等)界说一套钩子函数(IPv4界说了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个要害点被挪用  。在这几个点中  ,协议栈将把数据报及钩子函数标号作为参数挪用Netfilter框架  。

            2. 内核的任何模块可以对每种协议的一个或多个钩子举行注册 ,实现挂接  ,这样当某个数据包被通报给Netfilter框架时  ,内核能检测是否有任何模块对该协媾和钩子函数举行了注册  。若注册了  ,则挪用该模块的注册时使用的回调函数  ,这样这些模块就有时机检查(可能还会修改)该数据包、抛弃该数据包及指示Netfilter将该数据包传入用户空间的行列  。

            3 .那些排队的数据包是被通报给用户空间的异步地举行处置惩罚  。一个用户历程能检查数据包  ,修改数据包  ,甚至可以重新将该数据包通过脱离内核的统一个钩子函数中注入到内核中  。

            4. 任何在IP层要被扬弃的IP数据包在真正扬弃之前都要举行检查  。例如允许模块检查IP-Spoofed包(被路由扬弃)  。

            5.IP层的五个HOOK点的位置如下所示:

            (1)NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚举行完版本号  ,校验 和等检测)  ,源地址转换在此点举行;IP_Input.c中IP_Rcv挪用;

            (2)NF_IP_LOCAL_IN:经路由查找后 ,送往本机的通过此检查点  ,INPUT包过滤在此点举行  ,IP_local_deliver中挪用;

            (3)NF_IP_FORWARD:要转发的包通过此检测点 ,FORWORD包过滤在此点举行;

            (4)NF_IP_POST_ROUTING:所有马上便要通过网络装备出去的包通过此检测点 ,内置的目的地址转换功效(包罗地址伪装)在此点举行;

            (5)NF_IP_LOCAL_OUT:本机历程发出的包通过此检测点  ,OUTPUT包过滤在此点举行  。

            这些点是已经在内核中界说好的  ,内核模块能够注册在这些HOOK点举行的处置惩罚  ,可使用nf_register_hook函数指定 。在数据报经由这些钩子函数时被挪用  ,从而模块可以修改这些数据报  ,并向Netfilter返回如下值:

            NF_ACCEPT 继续正常传输数据报
            NF_DROP 抛弃该数据报  ,不再传输
            NF_STOLEN 模块接受该数据报  ,不要继续传输该数据报
            NF_QUEUE 对该数据报举行排队(通常用于将数据报给用户空间的历程举行处置惩罚)
            NF_REPEAT 再次挪用该钩子函数

            一个基于Netfilter框架的、称为IPtables的数据报选择系统在Linux2.4内核中被应用 ,实在它就是IPchains的后继工具  ,但却有更强的可扩展性 。内核模块可以注册一个新的规则表(table)  ,并要求数据报流经指定的规则表 。这种数据报选择用于实现数据报过滤(filter表)  ,网络地址转换(Nat表)及数据报处置惩罚(Mangle表)  。 Linux2.4内核提供的这三种数据报处置惩罚功效都基于Netfilter的钩子函数和IP表  。它们是自力的模块  ,相互之间是自力的 。它们都完善的集成到由Netfileter提供的框架中  。

            包过滤

            Filter表格不会对数据报举行修改  ,而只对数据报举行过滤  。IPtables优于IPchains的一个方面就是它更为小巧和快速  。它是通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入Netfilter框架的  。因此对于任何一个数 报只有一个地方对其举行过滤  。这相对IPchains来说是一个庞大的革新  ,由于在IPchains中一个被转发的数据报会遍历三条链  。

            NAT

            NAT表格监听三个Netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT  。 NF_IP_PRE_ROUTING实现对需要转发的数据报的源地址举行地址转换而NF_IP_POST_ROUTING则对需要转发的数据包的目的地址举行地址转换  。对于当地数据报的目的地址的转换则由NF_IP_LOCAL_OUT来实现  。NAT表格差别于filter表格  ,由于只有新毗连的第一个数据报将遍历表格  ,而随后的数据报将凭据第一个数据报的效果举行同样的转换处置惩罚  。NAT表格被用在源NAT、目的NAT  ,伪装(其是源NAT的一个特例)及透明署理(其是目的NAT的一个特例)  。

            数据报处置惩罚(Packet Mangling)

            Mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中举行注册  。使用 mangle表 ,可以实现对数据报的修改或给数据报附上一些带外数据  。当前mangle表支持修改TOS位及设置skb的nfmard字段  。

            源码剖析

            若是我们想加入自己的代码  ,便要用nf_register_hook函数 ,其函数原型为:

            int nf_register_hook(struct nf_hook_ops *reg) 
            struct nf_hook_ops 
            { 
            struct list_head list; 
             
            nf_hookfn *hook; 
            int pf; 
            int hooknum; 
             
            int priority; 
            };

            我们的事情即是天生一个struct nf_hook_ops结构的实例 ,并用nf_register_hook将其HOOK上  。其中list项我们总要初始化为{NULL,NULL};由于一样平常在IP层事情 ,pf总是PF_INET;hooknum就是我们选择的HOOK点;一个HOOK点可能挂多个处置惩罚函数  ,谁先谁后  ,便要看优先级 ,即priority的指定了 。Netfilter_IPv4.h中用一个枚举类型指定了内置的处置惩罚函数的优先级:

            enum nf_IP_hook_priorities { 
            NF_IP_PRI_FIRST = INT_MIN, 
            NF_IP_PRI_CONNTRACK = -200, 
            NF_IP_PRI_MANGLE = -150, 
            NF_IP_PRI_NAT_DST = -100, 
            NF_IP_PRI_FILTER = 0, 
            NF_IP_PRI_NAT_SRC = 100, 
            NF_IP_PRI_LAST = INT_MAX, 
            };

            Hook是提供的处置惩罚函数 ,也就是我们的主要事情  ,其原型为:

            unsigned int nf_hookfn(unsigned int hooknum, 
            struct sk_buff **skb, 
            const struct net_device *in, 
            const struct net_device *out, 
            int (*okfn)(struct sk_buff *));

            它的五个参数将由NFHOOK宏传进去 。nf_register_hook凭据reg中注册的协议簇类型和优先级在nf_hooks中找到响应的位置并插入到此表中  。_hooks[NPROTO][NF_MAX_HOOKS]在Netfilter初始化时(Netfilter_init/Netfilter.c  ,而它在sock_init时挪用)已经初始为一个空表  。

            例如IPtable在初始化时(init/IPtable_filter.c)挪用nf_register_hook注册他的hook函数  。

            static struct nf_hook_ops IPt_ops[] 
            = { { { NULL, NULL }, IPt_hook, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_FILTER }, 
            { { NULL, NULL }, IPt_hook, PF_INET, NF_IP_FORWARD, NF_IP_PRI_FILTER }, 
            { { NULL, NULL }, IPt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT, 
            NF_IP_PRI_FILTER } 
            };

             
            mangle在init/IPtable_mangle.c中注册它自己的hook函数 。 

            static struct nf_hook_ops IPt_ops[] 
            = { { { NULL, NULL }, IPt_hook, PF_INET, NF_IP_PRE_ROUTING, NF_IP_PRI_MANGLE }, 
            { { NULL, NULL }, IPt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT, 
            {NF_IP_PRI_MANGLE } 
            };

            NAT在init/IP_nat_standalone.c中注册它自己的hook函数


            static struct nf_hook_ops IP_nat_in_ops