Linux netfilter源码分析(4)

四、nf_hook_ops 钩子的注册

filter表的初始化函数static int __init init(void)中除了有一个nf_register_hook函数注册一个tables外,还由nf_register_hook函数注册了3hook

 

4.1        nf_hook_ops数据结构 netfilter.h

struct nf_hook_ops
{
        struct list_head list;                        //
链表成员
        /* User fills in from here down. */
        nf_hookfn *hook;                        //
钩子函数指针
        struct module *owner;
        int pf;                                        //
协议簇,对于ipv4而言,是PF_INET
        int hooknum;                                //hook
类型
        /* Hooks are ordered in ascending priority. */
        int priority;                                //
优先级
};

 

list成员用于维护Netfilter hook的列表。
hook
成员是一个指向nf_hookfn类型的函数的指针,该函数是这个hook被调用时执行的函数。nf_hookfn同样在linux/netfilter.h中定义。
pf
这个成员用于指定协议族。有效的协议族在linux/socket.h中列出,但对于IPv4我们使用协议族PF_INET

hooknum这个成员用于指定安装的这个函数对应的具体的hook类型:

        NF_IP_PRE_ROUTING    在完整性校验之后,选路确定之前
        NF_IP_LOCAL_IN        
在选路确定之后,且数据包的目的是本地主机
        NF_IP_FORWARD        
目的地是其它主机地数据包
        NF_IP_LOCAL_OUT        
来自本机进程的数据包在其离开本地主机的过程中
        NF_IP_POST_ROUTING   
在数据包离开本地主机上线之前

再看看它的初始化,仍以filter表为例

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 }
};

 

 

4.2   int nf_register_hook函数   netfilter.c

注册实际上就是在一个nf_hook_ops链表中再插入一个nf_hook_ops结构

int nf_register_hook(struct nf_hook_ops *reg)

{

      struct list_head *i;

 

      spin_lock_bh(&nf_hook_lock);

      list_for_each(i, &nf_hooks[reg->pf][reg->hooknum]) {

           if (reg->priority < ((struct nf_hook_ops *)i)->priority)

                 break;

      }

      list_add_rcu(&reg->list, i->prev);

      spin_unlock_bh(&nf_hook_lock);

 

      synchronize_net();

      return 0;

}

list_for_each 函数遍历当前待注册的钩子的协议pfHook类型所对应的链表,其首地址是&nf_hooks[reg->pf][reg->hooknum],如果当前待注册钩子的优先级小于匹配的的节点的优先级,则找到了待插入的位置,也就是说,按优先级的升序排列。

list_add_rcu
把当前节点插入到查到找的适合的位置,这样,完成后,所有pf协议下的hooknum类型的钩子,都被注册到&nf_hooks[reg->pf][reg->hooknum]为首的链表当中了。

 

 

 

4.3  ipt_hook钩子函数   iptable_raw.c

注册nf_hook_ops,也就向内核注册了一个钩子函数,这些函数有ipt_hookipt_local_hookipt_route_hookipt_local_out_hook等。

前面在nf_iterate()里调用的钩子函数就是它了

下面是ipt_hook函数的定义:

static unsigned int

ipt_hook(unsigned int hook,          /* hook */

       struct sk_buff **pskb,

       const struct net_device *in,

       const struct net_device *out,

       int (*okfn)(struct sk_buff *))     /* 默认处理函数 */

{

  /* 参数&packet_filter是由注册该nf_hook_ops的表(filter)决定的,也有可能是&packet_raw */

      return ipt_do_table(pskb, hook, in, out, &packet_filter, NULL);

}

实际上是直接调用ipt_do_table(ip_tables.c)函数

接下来就是根据table里面的entry来处理数据包了

一个table就是一组防火墙规则的集合

而一个entry就是一条规则,每个entry由一系列的matches和一个target组成

一旦数据包匹配了该某个entry的所有matches,就用target来处理它

Match又分为两部份,一部份为一些基本的元素,如来源/目的地址,进/出网口,协议等,对应了struct ipt_ip,我们常常将其称为标准的match,另一部份match则以插件的形式存在,是动态可选择,也允许第三方开发的,常常称为扩展的match,如字符串匹配,p2p匹配等。同样,规则的target也是可扩展的。这样,一条规则占用的空间,可以分为:struct ipt_ip+n*match+n*target,(n表示了其个数,这里的match指的是可扩展的match部份)。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux IPsec是一种在Linux系统中实现IPsec(Internet协议安全)的技术。IPsec用于保护网络通信的机密性、完整性和真实性。对于问题要求的源码分析,以下是我可以提供的300字回答。 Linux IPsec的主要源码位于内核的网络协议栈中,其实现主要以C语言编写。在分析IPsec源码时,需要关注以下几个关键组件和函数: 1. XFRM框架:XFRM是Linux内核中的IPsec子系统,负责安全策略和转发规则的管理。它的源码位于`net/netfilter/xfrm`目录下。通过分析XFRM的源码,可以了解IPsec中安全策略和变换规则的创建、更新和删除过程,并可以了解与XFRM相关的数据结构和算法。 2. IPSec SA和SP:IPsec安全关联(SA)和安全策略(SP)是IPsec实现的核心概念。SA用于描述两个网络节点之间的安全通信参数,SP用于定义哪些数据需要进行IPsec保护。在源码中,SA和SP的创建和管理涉及相关数据结构和算法,可以在XFRM源码中找到它们的实现。 3. 加密算法和哈希算法:IPsec中使用的加密和哈希算法在Linux内核中也有实现。可以在`crypto`目录中找到它们的源码分析加密算法和哈希算法的源码可以了解其实现细节和性能特征,并验证其安全性和可靠性。 4. 网络协议栈:IPsec是在网络协议栈中实现的,因此对内核网络协议栈的源码分析也是重要的。网络协议栈的源码位于`net`目录下。可以通过分析协议栈的源码,了解IPsec与其他网络层协议(如IP、TCP和UDP)之间的交互过程,以及数据的处理流程。 综上所述,分析Linux IPsec的源码需要关注XFRM框架、IPSec SA和SP、加密算法和哈希算法,以及网络协议栈。通过深入研究这些关键组件和函数的源码,可以更好地理解IPsec在Linux系统中的实现原理和工作机制。同时,这也为我们在实际应用中使用和调试IPsec提供了有价值的参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值