NDPI (nDPI) 是一个开源的深度包检测(DPI)库,由意大利网络研究和监测公司 NetFilter 开发。nDPI 的主要功能是识别网络流量中的应用协议,nDPI 是一个库,可以很容易地集成到其他项目中。开发人员可以使用 nDPI 作为流量检测组件,将其嵌入到流量分析工具、防火墙或入侵检测系统中。nDPI 提供了简单易用的 API,方便开发者将其集成到现有的系统中。
nDPI 常用于以下场景:
- 流量监控:企业或服务提供商可以使用 nDPI 监控网络中的流量,了解哪些应用协议占用了带宽,以便做出流量管理决策。
- 网络安全:nDPI 可以帮助识别异常流量,例如特定协议的未授权使用,这在入侵检测和防火墙中非常有用。
- 流量优化:通过识别协议类型,管理员可以对流量进行优先级分配或限速,从而优化网络资源使用。
一、源码编译
- 获取源码git clone GitHub - ntop/nDPI: Open Source Deep Packet Inspection Software Toolkit
- 生成编译配置./autogen.sh
- 如没有特殊需求(DPDK收包这种),./configure && make -j8
二、构成
NDPI提供了示例程序,实现对数据包的流量识别。位于工程根目录下的example文件夹下。程序启动包含
- 配置文件(所有配置项在/doc下的configuration_parameters.md文件内说明)
- 启动参数(详情见附录1 启动参数说明)
- 可执行文件 ndpiReader
线程说明
包含两个线程
主线程(main):解析启动参数,解析配置文件内容
工作线程(调用ndpi lib api工作):包处理流程
三、主要接口说明
ndpi_init_detection_module
构造协议解析器,声明解析协议范围,主要用于加载和配置网络协议检测模块。它为协议分析过程做好准备,包括内存分配、配置设置和必要的数据加载。
返回值:struct ndpi_detection_module_struct
入参:struct ndpi_global_context *g_ctx #入参一般为NULL,
功能说明:
设置ndpi功能接口 |
自定义日志回调接口 |
set_ndpi_debug_function(ndpi_str, (ndpi_debug_function_ptr) ndpi_debug_printf); |
初始化ip 域名威胁资源 |
资源为威胁资源,dpi匹配到后会在统计信息分类中描述威胁详情 |
ndpi_init_ptree_ipv4(ndpi_str->protocols->v4, host_protocol_list); ndpi_init_ptree_ipv6(ndpi_str, ndpi_str->protocols->v6, host_protocol_list_6); |
ndpi_set_protocol_detection_bitmask2
设置位掩码来控制哪些协议应该被检测。通过这种方式,用户可以灵活配置 nDPI 协议检测模块,启用或禁用特定的协议检测
返回值:void
入参: ndpi_detection_module_struct 解析模块 协议位掩码
功能说明:
ndpi_finalize_initialization
完成 nDPI 初始化过程的最后步骤,完成自测
struct ndpi_proto ndpi_workflow_process_packet
包处理接口,
返回值:协议代号
入参:
struct ndpi_workflow * workflow:数据包分析工作流。该结构保存着流量分析的上下文,包括流的信息和状态。
const struct pcap_pkthdr *header:元数据包长
const u_char *packet:元数据
ndpi_risk *flow_risk :检测结果,安全风险评分或风险信息
struct ndpi_flow_info **flow):流相关信息
四、主要数据结构说明
五、应用-怎么在自己的项目中接入NDPI解析功能
相关库文件 |
libndpiReader.a(nDPI-dev/src/lib) libndpi.a(nDPI-dev/example) -lm -lpcap |
其中前两个在ndpi工程编译获得 |
相关头文件 |
nDPI-dev\src\include |
将这个文件夹放在自己项目中 Makefile -I 包含这个目录 |
自定义的文件 |
ndpi_third.c()附录2c文件 ndpi_third.h附录3头文件 |
编辑用于适配ndpi处理的c文件和头文件,这两个文件放在项目中。注意在自己的Makefile中加入c的编译 |
源码中将ndpi 三方库的头文件“#include "ndpi_third.h"”插入