怎么在Linux利用Netfilter钩子函数编写轻量级的报文指纹过滤驱动

阿萱同学_6075

阿萱同学_6075

2026-05-11

431人浏览

原创

Netfilter钩子驱动实现轻量级报文指纹过滤,核心是注册钩子函数、提取端口/协议/载荷特征并快速比对,直接在内核协议栈判定丢弃或标记,不依赖iptables等用户态工具,延迟低、开销小。

怎么在linux利用netfilter钩子函数编写轻量级的报文指纹过滤驱动

在 Linux 内核中,利用 Netfilter 钩子编写轻量级报文指纹过滤驱动,核心是:注册钩子函数、提取关键字段(如 TCP/UDP 端口、协议、载荷特征等)、做快速比对、决定是否丢弃或标记。它不依赖用户态工具(如 iptables/nftables 规则),而是直接在内核协议栈关键路径上做判定,延迟低、开销小。

一、明确“指纹”定义和匹配粒度

“指纹”不是全包内容匹配,而是可稳定标识某类流量的轻量特征组合。常见选择包括:

  • 五元组 + 协议标志:源/目的 IP + 源/目的端口 + 协议号(如 TCP SYN+ACK+PSH 组合)
  • 固定载荷偏移特征:如 TLS ClientHello 固定位置的字节(0x16 0x03)、HTTP GET /admin 的前 12 字节(需确保 skb 数据可读)
  • 长度+标志组合:如 UDP 包长 = 74 且目的端口 = 53(某些 DNS 探针)

避免使用动态字段(如时间戳、随机序列号)或需深度解析的字段(如 HTTP Host 头全名)。目标是单次 skb 访问、常数时间判断。

二、编写最小可行钩子模块(IPv4 + NF_INET_PRE_ROUTING)

以丢弃匹配特定 TCP 目的端口(如 65535)的报文为例,代码结构精简如下:

#include <linux>
#include <linux>
#include <linux>
#include <linux>
#include <linux>
#include <linux><p>static struct nf_hook_ops nfho = {
.hook     = hook_func,
.pf       = PF_INET,
.hooknum  = NF_INET_PRE_ROUTING,  // 早于路由,所有入向 IPv4 包
.priority = NF_IP_PRI_FIRST,      // 最高优先级(可选)
};</p>
<p>unsigned int hook_func(void <em>priv, struct sk_buff </em>skb,
const struct nf_hook_state <em>state) {
struct iphdr </em>iph;
struct tcphdr *tcph;</p>
<pre class="brush:php;toolbar:false;">if (!skb || !(iph = ip_hdr(skb))) return NF_ACCEPT;

if (iph->protocol != IPPROTO_TCP) return NF_ACCEPT;

// 确保 TCP 头完整且可访问(避免分片或头被裁剪)
if (skb->len ihl*4 + sizeof(struct tcphdr)) return NF_ACCEPT;
tcph = (struct tcphdr *)((u8*)iph + iph->ihl*4);

if (ntohs(tcph->dest) == 65535) {
    kfree_skb(skb);  // 直接释放,不进入协议栈
    return NF_STOLEN; // 表示已处理完毕
}

return NF_ACCEPT;

}

static int __init init_module(void) { nf_register_net_hook(&init_net, &nfho); printk(KERN_INFO "fingerprint_filter: loaded\n"); return 0; }

static void __exit cleanup_module(void) { nf_unregister_net_hook(&init_net, &nfho); printk(KERN_INFO "fingerprint_filter: unloaded\n"); } MODULE_LICENSE("GPL");

linux>

注意点:

Linuxdo Application
Linuxdo Application

为 Linux.do 注册撰写高通过率、去 AI 化的中文小作文。进行自适应调查以了解申请人的真实背景,...

下载
  • 用 NF_STOLEN 替代 NF_DROP 可省去 Netfilter 统计开销;
  • 必须检查 skb->len 和 IP/TCP 头长度,防止越界访问导致 oops;
  • 若需读取载荷(如第 40 字节),用 skb_header_pointer() 安全提取,不要直接指针解引用;
  • 避免在钩子中睡眠、分配大内存、调用可能阻塞的函数。

三、支持简单载荷指纹(如 TLS ClientHello)

若需匹配 TLS 握手起始字节(0x16 0x03),在确认是 TCP 且含数据后操作:

// 继续在 hook_func 中(TCP 分支后)
if (tcph->syn || tcph->fin || tcph->rst) return NF_ACCEPT; // 跳过控制报文
if (!tcph->doff || ntohs(tcph->doff) int tcp_header_len = tcph->doff <em> 4;
int payload_len = ntohs(iph->tot_len) - iph->ihl</em>4 - tcp_header_len;
if (payload_len <p>// 安全读取前两个字节
u8 tls_sig[2];
if (skb_header_pointer(skb, 
(u8*)tcph - skb->data + tcp_header_len, 
2, &tls_sig) != NULL) {
if (tls_sig[0] == 0x16 && (tls_sig[1] == 0x03 || tls_sig[1] == 0x01)) {
kfree_skb(skb);
return NF_STOLEN;
}
}
</p>

该方式不拷贝整个载荷,仅按需提取固定偏移字节,保持轻量。

四、编译、加载与验证

Makefile 示例:

obj-m += fingerprint_filter.o
KDIR := /lib/modules/$(shell uname -r)/build
<p>all:
make -C $(KDIR) M=$(PWD) modules</p><p>clean:
make -C $(KDIR) M=$(PWD) clean
</p>

加载后验证:

  • sudo insmod fingerprint_filter.ko
  • 用 tcpdump -i any port 65535 发包测试是否消失
  • dmesg | tail 查看加载/卸载日志
  • 必要时加 printk 打点(但上线前应移除,避免性能影响)

不复杂但容易忽略:务必在不同网络场景(如分片包、TSO/GSO 启用网卡)下测试,必要时在 NF_INET_LOCAL_IN 或启用 nf_ct_untrack 避免连接跟踪干扰。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4490

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3773

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

3073

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

7630

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

7262

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

4113

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3605

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3859

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习