深度数据包检测DPI开发解析

简介:

深度数据包检测(Deep packet inspection,缩写为 DPI)是一种特殊的网络技术,一般网络设备只会查看以太网头部、IP头部而不会分析TCP/UDP里面的内容这种被称为浅数据包检测;与之对应的DPI会检查TCP/UDP里面的内容,所以称为深度数据包检测。

DPI一般是一个硬件或者软件,一般用“旁挂”的方式接入到网络。它会对网络中的每个数据包进行检查,识别出应用层协议,根据识别的协议采取一定的措施(比如记录HTTP访问行为)。对于TCP协议它可以识别完整的TCP交互过程(比如HTTP请求从请求到响应中间会有多次TCP数据包发送)。

深度数据包检测DPI开发解析

nDPI

nDPI是一个C语言编写的DPI库,用来实现软件DPI系统。它是从OpenDPI扩展而来,二者的架构和实现基本上差不多。https://github.com/ntop/nDPI此处是它的老巢,大家可以自己下载编译它。怎么编译,它的README写的非常清楚了我就不废话了(唯一一个文档~~囧)。

编译安装之后它生成/usr/local/lib/libndpi.(a,so)库文件(a静态库文件,so动态链接库);/usr/local/include/会安装相关的头文件。

我个人喜欢用 静态库文件,这样会把所有的二进制代码合并到一个可执行文件中运行的时候不需要安装一大堆库。另外我也不喜欢把东西放到/usr/local/lib下,所以我提供的代码是通过cmake做了一个“all in one”的编译。github上放到是1.6版本的,如果你想更新代码只要替换src文件夹就行了。

如何用nDPI

nDPI的代码写的很烂,也没有什么架构就是一团乱麻(其实稍微写写都要比这个好)。但是它至少还能正常工作而且是唯一一个“开放”的DPI库,所以无论什么原因你选择了它都必须忍受它的“丑陋”。

nDPI几乎没有文档说明,只带了一个“ndpiReader”的例子,写的“洋洋洒洒”如行云流水一般(就不吐槽了)。这就是我这篇文章的写作原因,希望能给使用nDPI的同学一点帮助。

初始化

nDPI最重要的一个数据结构是ndpi_detection_module_struct_t它通过ndpi_init_detection_module构造出来

深度数据包检测DPI开发解析

第一个参数用来计算nDPI分析协议的各种超时时间,一般精确到毫秒就可以了1000(nDPI协议分析部分和“全局部分”耦合非常紧,这个数据其实只有“协议分析模块”需要)

第二个、三个参数是封装过的“内存分配”函数;nDPI的内存管理非常乱,有些地方是我们自己申请内存而由nDPI内部帮我们释放。所以必须nDPI并不直接使用malloc、free之类的申请、释放内存而是交由程序员自己提供函数;

第三个参数是调试函数,如果定义了NDPI_ENABLE_DEBUG_MESSAGES那么nDPI会调用这个函数输出一些调试信息;

所有的nDPI API都是这种“鬼畜”风格,几乎是各种纠结。。。万幸我们只需要使用很少的API就可以完成任务了。

配置协议分析模块

nDPI支持多种协议,都在protocols文件夹中。编译的时候所有协议都会被放到nDPI库中。使用的时候我们可以自己设置需要开启那些分析模块

深度数据包检测DPI开发解析

NDPI_PROTOCOL_BITMASK定义开启协议的“位图”,通过NDPI_BITMASK_ADD函数可以添加支持的协议,最后调用ndpi_set_protocol_detection_bitmask2配置位图。

ndpi_set_protocol_detection_bitmask2函数的第一个参数就是ndpi_detection_module_struct_t(上面我们初始化的那个数据结构);第二个参数是位图标志。

特别注意:开启的协议越多识别速度越慢;nDPI识别协议的时候是一个串行结构,无论是否被成功是被都会认认真真遍历完我们配置好的协议

子协议

子协议是某个协议的细分,比如我们想要分析所有“Google”的HTTP请求那么第一步是分析出“HTTP”请求,第二步是判断HOST包含google.com。这里的第二步就是“子协议”。

nDPI唯一的一份“QuickStartGuide”对这个有进一步解释,子协议识别是以配置文件的方式提供给nDPI的。比如

深度数据包检测DPI开发解析

它还支持端口的方式(TCP的81、8181直接被标记为HTTP不再做内容检测)

深度数据包检测DPI开发解析

nDPI此处的实现使用了一个非常有名的算法—— Aho-Corasick。以第一幅图为例子,里面配置了两条规则“Google”和“Veneer”,我们有一个字符串(HOST),怎么判断这个字符串符合那个规则呢?最简单的办法是循环所有的规则,如果规则条目很多那么速度会非常慢。Aho-Corasick就是这样一种算法,它可以在O(n)中完成所有的匹配任务。

通过ndpi_load_protocols_file函数加载“子协议”。

深度数据包检测DPI开发解析

开始识别

识别协议的API非常简单——ndpi_detection_process_packet函数。就是这个坑爹的函数,变态程度几乎可以说用令人发指来形容。

深度数据包检测DPI开发解析

  • ndpi_struct全局的结构体
  • flow比较特殊,我们后面讲
  • packet指向IP头部的指针
  • packetlen数据包大小
  • current_tick_l当前时间(精确到毫秒)用于判断“过期的TCP请求”
  • src,dst其实没有什么用途,文档上说是跟状态机有关其实没有半毛钱关系。唯一的用途是更新“分析协议”的配置。一般设置为NULL就行了

TCP协议是一个流(flow)式的协议,经过从三次握手开始通讯双方都是“请求->响应”的结构。DPI可以跟踪其中的一个或者几个数据包,也可以实现全部跟踪(后续我会交叉使用TCP会话、会话、flow,三个名词其实是一样的)。

nDPI内部不会记录完整的TCP数据包,而是用一个定义非常模糊的ndpi_flow_struct类型来表示一个TCP会话(这个数据结构还包含了“协议分析”部分数据,所以定义非常模糊)。为了便于分析完整的TCP请求我们定义了一个自己的数据结构dpi_flow_t,ndpi_flow_struct作为它的一个成员。用伪代码表示分析过程:

深度数据包检测DPI开发解析

落到代码上就是get_ndpi_flow函数;实现上我们会对目标、源端口排序再做hash;这是由于数据包是“相互通讯”的所以发送方、接收方是相对而言,否则识别到的可能是“一方”的数据。

一般我们用一个二叉树存放所有正在分析的TCP会话,nDPI移植了FreeBSD中的一组函数ndpi_tfind、ndpi_tsearch、ndpi_twalk、ndpi_tdelete等用来实现常用的数据结构操作。

完成分析

调用完ndpi_detection_process_packet函数后我们需要检查返回值,如果它不等于NDPI_PROTOCOL_UNKNOWN证明就找到了协议类型。

DPI分析一般分为三种情况:

  • 第一个数据包就能确定协议类型,这种情况下找到“协议类型”后续直接把flow从二叉树中删除
  • 第N个数据包确定协议,flow数据包会一直存在在二叉树中,直到知道协议类型。这种情况下每次我们调用ndpi_detection_process_packet传递的flow其实是相同的数据
  • 一直无法确定协议类型,flow经历过一段时间之后超时,我们认为无法识别出协议释放相关数据。

前两种情况可以合二为一,都是判断出协议类型后释放资源;第三种请比较特殊,我们需要遍历整个二叉树寻找“过期”的flow然后删除。这就是例子中最后一部分的含义(遍历的时候我们每次寻找一个flow,用变量idle_scan_idx表示)。


本文作者:佚名

来源:51CTO

相关文章
|
8月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
483 27
|
8月前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
522 31
|
11月前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
665 84
|
8月前
|
人工智能 小程序 前端开发
【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?
本文介绍了如何将相机抽取的RGBA帧图像解析为`.jpg`或`.png`格式,适用于体测、赛事等场景。首先讲解了RGBA图像结构,其为一维数组,每四个元素表示一个像素的颜色与透明度值。接着通过`uni.createOffscreenCanvas()`创建离屏画布以减少绘制干扰,并提供代码实现,将RGBA数据逐像素绘制到画布上生成图片。最后说明了为何不直接使用拍照API及图像转换的调用频率建议,强调应先暂存帧数据,运动结束后再进行转换和上传,以优化性能。
|
8月前
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
379 7
|
8月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离的开发模式中,API 调试的效率直接影响项目的质量和交付速度。通过本文的对比分析,我们可以看到无工具调试模式虽具备灵活性和代码复用能力,但在操作便利性和团队协作上稍显不足。而传统的外部调试工具带来了可视化、高效协作与扩展性,却可能存在工具切换带来的开发链路断层问题。Apipost-Hepler 融合了两者的优势,让开发者无需离开熟悉的 IDEA 环境,就能享受可视化调试工具的强大功能。
251 5
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
9月前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
612 9
|
10月前
|
人工智能 监控 数据可视化
提升开发效率:看板方法的全面解析
随着软件开发复杂度提升,并行开发模式下面临资源分配不均、信息传递延迟及缺乏全局视图等瓶颈问题。看板工具通过任务状态实时可视化、流量效率监控和任务依赖管理,帮助团队直观展示和解决这些瓶颈。未来,结合AI预测和自动化优化,看板工具将更高效地支持并行开发,成为驱动协作与创新的核心支柱。
|
10月前
|
JSON 供应链 搜索推荐
淘宝APP分类API接口:开发、运用与收益全解析
淘宝APP作为国内领先的购物平台,拥有丰富的商品资源和庞大的用户群体。分类API接口是实现商品分类管理、查询及个性化推荐的关键工具。通过开发和使用该接口,商家可以构建分类树、进行商品查询与搜索、提供个性化推荐,从而提高销售额、增加商品曝光、提升用户体验并降低运营成本。此外,它还能帮助拓展业务范围,满足用户的多样化需求,推动电商业务的发展和创新。
340 5

热门文章

最新文章

推荐镜像

更多
  • DNS