讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

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

阿萱同学_6075

阿萱同学_6075

发布时间:2026-05-11 12:03:47

|

431人浏览过

|

来源于php中文网

原创

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/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/tcp.h>
<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 < iph->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");

注意点:

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) < 5) return NF_ACCEPT;
<p>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 < 2) return NF_ACCEPT;</p><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;
}
}

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

四、编译、加载与验证

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

加载后验证:

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

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

相关文章

驱动精灵
驱动精灵

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

下载

相关标签:

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

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

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

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

4490

2023.06.21

如何安装LINUX
如何安装LINUX

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

3773

2023.06.29

linux find
linux find

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

3073

2023.06.30

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

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

7630

2023.07.05

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

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

7262

2023.07.06

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

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

4113

2023.07.20

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

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

3605

2023.07.20

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

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

3859

2023.07.25

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn