通过Linux内核协议栈netfilter拦截数据报文
发布网友
发布时间:2024-09-27 17:45
我来回答
共1个回答
热心网友
时间:2024-10-04 00:06
通过内核模块的方式向netfilter框架注册钩子函数,实现简单的数据包转发调试,当有数据包经过Linux协议栈时,打印相关信息。目的在于熟悉netfilter框架的基础api,为后续开发防火墙等功能做准备。
netfilter简介:netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率*等。
网卡转发包流程:以下为网口收包到转发的流程,NF_HOOK位置为netfilter钩子。
netfilter框架流程:netfilter是Linux协议栈的一个子系统,用于数据报文的过滤。在路由器设备中,数据报文的来源和去向有很多场景。比如转发数据、本地发出的数据、访问设备本身的数据等,可以通过下图简单了解基本流程。
netfilter钩子注册:netfilter为通用的框架,Linux系统已经内建了常用的钩子。netfilter和iptables命令时密切相关的,iptables命令的最终实现是基于netfilter,比如filter表、nat表、mangle表的各个链的实现,都在netfilter源码中找到具体实现,这里就不一一讲解。
netfilter外部接口:我们可以通过以下接口注册和卸载钩子函数,在钩子函数中可以将数据报文解析出来进行处理,比如过滤。
接口列表注册结构体定义结构体参数说明hooknum可配置的值priority可配置的值:priority可以配置任意整数的,因为系统有默认的钩子,定义了一些参考值,我们开发过程中一般在系统priority的基础上进行加减操作,用于标记自己加入钩子的位置以下为系统定义的优先级。
下面我们写一个实例,通过打印数据包信息,看看数据包的走向 代码中,我们定义hook_ops数组,包含3个钩子实体 forward_hook、forward_hook2、local_in_hook,其中前两个为forward钩子,但挂载的优先级不一样,我们可以通过打印看到,优先级情况,而local_in_hook为访问设备本身的数据,通过ip地址我们可以很方便查看是否是我们想要的结果。
钩子实例ops注册实例编译运行:环境 代码:OpenWrt 19.07 或其他版本OpenWrt分支版本,linux内核5.4.xx版本 编译环境: ubuntu18 运行环境: OpenWrt系统(内核版本和编译模块版本一致) 编译 将源码包拷贝到OpenWrt package目录,make menuconfig选择kmod-netfilter_hook并保存。
编译完成后会在build_dir子目录生成netfilter_hook.ko文件,将该文件通过winscp工具传输到OpenWrt开发板(路由器)中 然后执行以下命令:
保证开发板能够通过wan口连接*,并接入一台pc到lan口,pc分别访问设备和*。
测试结果开源作品:github.com/destan19/Ope...