nf_hook_ops 钩子的注册

netfilter框架概述 1 Netfilter 1.1 netfilter概述 Netfilter是linux 2.4.x引入的一个子系统,它是一个通用的、抽象的框架。其不依赖于具体的协议,而是为每种网络协议定义一套HOOK函数。这些HOOK函数在数据报经过协议栈的几个关键点被调用。 内核的任何模块可以对每种协议的一个或多个HOOK进行注册,实现挂接。这样当某个数据报被传递给Netfilter框架时,内核能检测到是否有任何模块对该协议和HOOK函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查、 阅读详情

nf_hook_ops 钩子的注册

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

 

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    在数据包离开本地主机“上线”之前

  struct nf_hook_ops只是存储勾子的数据结构,而真正存储这些勾子供协议栈调用的是nf_hooks,从定义可以看出,它其实就是二维数组的链表。
        struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; [net\filter\core.c]
        其中NFPROTO_NUMPROTO表示勾子关联的协议,NF_MAX_HOOKS表示勾子应用的位置,可选值在每个协议模块内部定义,这些值代表了勾子函数在协议流程中应用的位置。

再看看它的初始化,仍以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 }
};

 

 

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

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

内核同时还提供了nf_register_hooks()和nf_unregister_hooks(),将reg重复注册n次或将reg从nf_hooks中注销n次。当勾子函数注册完成后,nf_hooks的结构如图所示:

3ipt_hook钩子函数   iptable_raw.c

注册nf_hook_ops,也就向内核注册了一个钩子函数,这些函数有ipt_hook,ipt_local_hook,ipt_route_hook,ipt_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部份)

转载http://staff.ustc.edu.cn/~james/linux/netfilter-4.html


Linux网络 Netfilter之钩子函数注册 nf_hook_ops是注册的钩子函数的核心结构,字段含义如下所示,一般待注册的钩子函数会组成一个nf_hook_ops数组,在注册过程中调用nf_register_net_hooks将所有规则加入到指定的钩子点;nf_register_net_hooks在注册多个钩子函数时使用,它对多个函数顺序调用nf_register_net_hook进行注册,并且在注册失败时进行回滚;多个钩子函数在注册之后,是以多个nf_hook_entry实例的链表的形式存在的,其成员如下;废话不多说,开始分析; 阅读详情

相关推荐

linux内核协议栈 netfilter 之 hook 机制概述

1 netfilter介绍 Linuxnetfilter就是借助一整套的hook函数的管理机制,实现数据包在三层以上的过滤、地址转换(SNAT、DNAT)、基于协议的连接跟踪。我们所说的内核的netfilter,应该包括二层数据的filter操作,以及对三层及三层以上数据的filter等操作。 只不过二层的filter实现与三层及三层也上的filter实现有所不同。其中二层的filter与应用层程序ebtables结合使用,而三层及以上的filter结合iptables使用。但是二层filter与...

7609

linux 内核 hook函数介绍

在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数。现在来看看linux是如何实现hook函数的。 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数必须要用到的结构体,所在文件:linux/netfilter.h 定义为: typedef unsigned int nf_hookfn(unsigned int hooknu...

whatday的专栏 3390

netfilter hook 注册,调用示例

Linux4.x内核编程实战——netfilter hook 注册,调用示例.nf_hook_ops,nf_register_net_hook, nf_unregister_net_hook 使用

Linux3.13.0 netfilter 学习笔记 之一 HOOK机制

netfilter介绍 Linux netfilter就是借助一整套的 hook 函数的管理机制,实现数据包在三层以上的过滤、地址转换(SNAT、DNAT)、基于协议的连接跟踪。我们所说的内核的netfilter,应该包括二层数据的filter操作,以及对三层及三层以上数据的filter等操作。 只不过二层的filter实现与三层及三层也上的filter实现有所不同。其中二层的filter与应用层程序ebtables结合使用,而三层及以上的filter结合iptables使用。但是二层filter与三层fi

qq_28808697的博客 4090

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2286

R语言计算植物群落重要值:从基础概念到优势种判定

在植被生态学研究中,重要值是衡量物种在群落中地位的核心指标,它综合了相对多度、相对频度与相对显著度三个维度,能够客观反映物种的数量优势、分布广度与空间占据能力。理解重要值的生态学逻辑,是开展群落分类、优势种判定及多样性分析的基础。而R语言凭借其批量处理、可复现和与后续多元统计无缝衔接的优势,成为生态学研究者处理样方数据的高效工具。从野外记录的宽表到标准化长表,再到分组汇总计算相对指标,R语言能够显著提升数据处理效率与准确性。本文以实测群落数据为例,系统梳理重要值的两种算法口径、基于dplyr和tidyr的完

weixin_42634811的博客 265

netfilter源码分析(4)-nf_hook_ops 钩子的注册

转自:http://alexanderlaw.blog.hexun.com/8968799_d.html 四、nf_hook_ops 钩子的注册 在filter表的初始化函数static int __init init(void)中除了有一个nf_register_hook函数注册一个tables外,还由nf_register_hook函数注册了3个hook   4.1

淡蓝 2194

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 245

Netfilter 与struct nf_hook_ops 相关

1、协议/地址簇相关(#include <linux/socket.h>)) */2、hook返回值int thresh;p->pf = pf;p->sk = sk;//hook函数由 指定,其函数声明如下: nf_hookfn *hook#define NF_DROP 0 ----丢弃,释放sk_buff结构#define NF_ACCEPT 1 ----继续正常传输数据报(按照5个钩子点正常传输)

团长的专栏 1151

海康视觉相机驱动软件MVS参数配置全攻略(附接线图+避坑指南)

本文提供了海康视觉相机驱动软件MVS从硬件连接到软件参数配置的完整指南。详细解析了供电与通讯线缆的区分、PNP/NPN信号逻辑的接线避坑方法,并重点阐述了MVS软件中触发模式、网络IP配置、图像采集及光源控制等核心参数的设置技巧,旨在帮助用户快速完成相机调试,实现稳定高效的图像采集。

weixin_29204205的博客 399

SpringBoot 插件化开发详细总结

SpringBoot 插件化开发方案总结

congge 1万+

Linux netfilter源码分析(4)

四、nf_hook_ops 钩子的注册在filter表的初始化函数static int __init init(void)中除了有一个nf_register_hook函数注册一个tables外,还由nf_register_hook函数注册了3个hook 4.1        nf_hook_ops数据结构 netfilter.hstruct nf_hook_ops{     

venoy4806的专栏 1388

华为OD机试 新系统真题 【数字系统转换器】

华为OD机试 新系统真题【数字系统转换器】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【数字系统转换器】多语言题解。

qq_45776114的博客 541

linux内核中的hook函数详解,linux内核中的hook函数详解

在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数。现在来看看linux是如何实现hook函数的。先介绍一个结构体:struct nf_hook_ops,这个结构体是实现钩子函数必须要用到的结构体,其实际的定义为:其中的成员信息为:hook :是一个函数指针,可以将自定义的函数赋值给它,来实现当有数据包到达是调用你自定义的函数。自定义函数的返回值为:owner:是模块的所有者,...

weixin_28968285的博客 1300

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

OpenClaw Windows 安装指南

好的,我来一步一步带你在 Windows 上安装 OpenClaw。

m0_60605453的博客 549

netfilter hook函数

====================以下为hook函数执行大致流程============================ /* Respones from hook functions. */ #define NF_DROP 0 #define NF_ACCEPT 1 #define NF_STOLEN 2 #define NF_QUEUE 3 #define NF_REPEAT 4 ...

sidemap的博客 407

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux hook函数详解,linux内核中的hook函数详解

在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数。现在来看看linux是如何实现hook函数的。先介绍一个结构体:struct nf_hook_ops,这个结构体是实现钩子函数必须要用到的结构体,其实际的定义为: 其中的成员信息为:hook :是一个函数指针,可以将自定义的函数赋值给它,来实现当有数据包到达是调用你自定义的函数。自定义函数的返回值为: owner:是模块的所有...

weixin_42361933的博客 616

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Linux中netfilter模块编程实践

 上篇我们看了netfilter的实现机制,这篇来实现下netfilter模块实操一把。 为了注册一个钩子,需要填充nf_hook_ops结构体,包括优先级,钩子地点和钩子函数。然后调用nf_register_hook()函数。 1.   数据结构     struct nf_hook_ops {         /* User fills in from here down. */ ...

weixin_40581617的博客 674

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux进程函数钩子,linux中钩子函数的理解

看了一个回调函数,想再了解一下钩子函数,以下为在网络上查找的一些有用资料,记录一下:钩子函数(回调函数)也是系统内核为驱动程序提供的一些特定的函数,在驱动程序中某个变量的状态发生改变或将要改变或改变完成时,将会自动调用该回调函数,在netfilter中的状态就有五个(针对IPV4):hook调用的时机NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前NF_IP_LOCAL_IN 在...

weixin_34293510的博客 1649

Netfilter之框架初始化与对外接口

从Makefile中也可以看的出来,Netfilter框架的核心功能由如下几个文件实现: netfilter-objs := core.o nf_log.o nf_queue.o nf_sockopt.o obj-$(CONFIG_NETFILTER) = netfilter.o 其中core.c文件又是重中之重。 1. 数据结构 1.1 nf_hooks 这是一个二维数组,数组元素就是链表元...

九天小哥的专栏 1417

linux钩子硬盘序列号,linux中的钩子函数

看了一个回调函数,想再了解一下钩子函数,以下为在网络上查找的一些有用资料,记录一下:钩子函数(回调函数)也是系统内核为驱动程序提供的一些特定的函数,在驱动程序中某个变量的状态发生改变或将要改变或改变完成时,将会自动调用该回调函数,在netfilter中的状态就有五个(针对IPV4):hook调用的时机NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前NF_IP_LOCAL_IN 在...

weixin_33761747的博客 265
上一篇: linux lsof
下一篇: struct sockaddr_nl 结构体 由来、含义以及使用
kanda2012
博客等级 码龄16年 4粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值