目录

1、nDPI介绍

2、nDPI库

3、示例

4、API nDPI

5、开发nDPI自定义协


1、nDPI介绍

nDPI是一个基于OpenDPI的DPI库,目前由ntop维护。

为了给您提供一个跨平台的DPI体验,我们除了支持Unix/Linux外,同时也支持Windows。不仅如此,我们已经通过修改nDPI,使得它更加适合于流量监控应用,我们通过禁用那些对网络流量监控不必要的特性,已经实现了这一功能,因此也加快了DPI引擎的速度。

nDPI允许应用层检测协议,而不管使用的端口是什么。这意味着在非标准端口监测已知协议(例如在80号端口之外的端口检测HTTP协议)或者反过来(例如在80号端口检测Skype流量)都成为了可能。这是由于在当今“端口=应用”的概念不再适用。

在过去的几个月里,我们也已经新增加了几个功能特性,包括:

  1. 示例ndpiReader应用在速度/功能方面和封装支持上都得到了加强。(例如你现在可以对GTP隧道流量进行分析)
  2. 能够将nDPI编译到Linux内核中,以便于你能使用它开发高效的基于内核的模块。
  3. 多方面速度加强,nDPI现在比他的前身(之前的版本)更快。
  4. 添加了许多协议(到目前为止我们支持大约200个协议),其中包括如SAP与Citrix等的“业务”协议,也有像Dropbox与Spotify的“桌面”协议。
  5. 能够去定义基于端口(和端口范围)的协议检测,以便于你能使用经典的基于端口的检测来去补充协议检测。
  6. 为了能让nDPI支持加密的链接,我们已经为SSL(包括服务器与客户端)证书添加了解码器。因此,我们能够使用加密证书来理解弄清楚协议。同时这也能让我们去识别如Citrix Online与Apple ICloud等一般无法检测到的协议。
  7. 能通过使用基于字符串的匹配来支持子协议。

1.1、下载源

当你在构建ntop与nProbe时nDPI会自动被下载。当然也没有什么能阻止你将其用作一个独立的DPI库。你可以从https://github.com/ntop/nDPI 下载源码。

2、nDPI库

2.1、编译nDPI源码

开始使用nDPI库非常地简单。为了编译这个库,你必须满足一些先决条件比如:

GUN autotools/libtool
gawk
gcc

为了实现这些,你需要使用以下命令来安装他们:

一旦你完成了上面的安装,你就能使用以下命令编译nDPI源码:

cd <nDPI source code directory>
./autogen.sh
./configure
make

2.2、编译示例ndpiReader源码

开始使用ndpiReader也很简单。为了编译它你必须使用以下命令:

cd <nDPI source code directory>/example
make

2.3、ndpiReader命令行选项

这个示例ndpiReader应用在速度/功能分析方面和封装支持上均能被使用。特别的是,ndpiReader能够指定很多命令行选项。

下面列举了可使用的命令选项和每一个选项的简要简要介绍:

-i <file.pcap |device>

这项命令用于指定一个pcap文件来读取数据包,或者指定一个用于实时捕获的设备。而且只能指定两者当中的一个。

-f <BPF filter>

指定一个BPF过滤器用来过滤选定的流量。它只允许nDPI接受那些和过滤器匹配的数据包(如果被指定的话)。

-s <duration>

定义了捕获持续时间,以秒为单位,仅用于实时流量捕获。

-p <file.protos>

指定了一个协议文件(例如protos.txt)来扩展对子协议和基于端口协议检测的支持。尤其需要小心的是,协议一旦被定义到protos文件中就会覆盖之前的已经存在的协议。

-l <num loops>

检测循环数(仅用与测试)

-d

这个标志会禁用nDPI协议猜测,仅使用DPI。

-t

打印ndpiReader帮助

-v <1|2>

使用这个标志时,ndpiReader会生成详细的输出,这个输出能被用于调试其性能。数字1是显示带有“未知协议”数据包的最低等级,而2级会显示地更加详细,两者只能指定其一。

2.4、协议文件

nDPI能够通过基于字符串的匹配支持子协议。这是由于许多新的子协议比如Apple iCloud/iMessage,WhatsApp和许多其他的使用HTTP(s)的协议能够通过解码SSL证书主机或者HTTP“Host:”被检测到。因此我们决定将一个基于流行的Aho-Corasick 算法的高效字符匹配库嵌入到nDPI中,用于数十万子字符的高效匹配(即在普通硬件上能足够快地支持10Gb的流量)。

你可以在运行时通过使用一个用以下格式的协议文件来指定子协议:

除此之外,你也能使用以下格式来指定一个基于端口的检测:

你可以使用ndpiReader这个应用(使用 –p 选项)来测试你的自定义配置。或者你可以使用ndpi_load_protocls_file() nDPI API调用来增强你自己的应用。

3、示例

在这一节我们会展示一些ndpiReader的使用范例。

3.1、实时捕获模式

下面这个例子将会展示ndpiReader的实时捕获模式。使用参数-i指定接口设备,参数-s 指定实时捕获持续时间。

3.2、pcap 捕获模式

创建一个pcap文件最简单的方法就是通过使用tcpdump命令,就像下面这个例子:

一旦pcap文件被创建,你就能启动ndpiReader,使用参数-I :

3.3、协议文件

为了阐明协议文件的特性,我们现在将解释怎样让你识别来自ntop.org的流。

我们可以通过编辑protos.txt文件来实现它:

ntop$ echo 'host:"ntop.org"@nTop'> protos.txt

一旦这个协议文件已经被修改,你可以启动ndpiReader,使用参数 –p:

4、API nDPI

在这一节中nDPI API是重点。

示例ndpiReader现在有一个基础的例子用来展示如何初始化这个库。需要一个已经编译好的库和一个合适配置的Makefile(即示例Makefile)。

想要在你的应用中开始使用nDPI的API,除了你自己的包含外,必须也添加下面这个包含文件:

#include"dpi_main.h"

这个库可以像下面这样初始化:

1、声明协议位掩码,初始化检测模块:

NDPI_PROTOCOL_BITMASK all;
ndpi_struct = ndpi_init_detection_module(detection_ticks_resolution,malloc_wrapper,free_wrapper,debug_printf);

这个函数允许你初始化检测模块。字段有如下含义:

U_int32_t ticks_per_second

每秒时间戳分辨率(比如1000每毫秒分辨率)。

void*(*_ndpi_malloc)(unsigned long size);

指向一个内存分配器的函数指针。

void*(*_ndpi_free)(void*prt);

指向一个调试输出函数的函数指针,在生产环境下置空(NULL)

2、通过适当的宏并将他们设置到检测模块中来启用所有协议(需要注意的是,如果你愿意你也可以启用这些协议的子集)。

// enable all protocols
NDPI_BITMASK_SET_ALL(all);
ndpi_set_protocol_detection_bitmask2(ndpi_struct, &all);

这个函数能让你设置已经定义到检测模块中的协议位掩码。

3、为了加载一个存在的协议文件,你必须使用如下函数:

dpi_load_protocols_file(ndpi_struct, _protoFilePath);

4、每当从你的pcap文件或者入口设备中捕获到流时,它们可以通过使用以下函数分析:

protocol = (const u_int32_t)ndpi_detection_process_packet(ndpi_struct,ndpi_flow,iph ? (uint8_t *)iph : (uint8_t *)if,ipsize,time,src,dst);

这些字段有以下的含义:

struct ndpi_detection_module_struct*ndpi_struct;

检测模块。

 struct ndpi_flow_struct*flow;

指向连接状态机的流空指针。

const unsigned char*packet;

这个packet作为一个无符号的字符指针,长度为packetlen。这个指针必须指向第三层(IP报头)。

const unsigned short packetlen;

packetlen包的长度。

const U_int32_t current_tickt;

数据包的当前时间戳。

struct ndpi_id_struct*src;

指向源订阅状态机的空指针。

struct ndpi_id_struct*dst;

指向目的订阅状态机的空指针。

5、一旦流被分析后,有必要通过下面的函数来摧毁检测模块。

 ndpi_exit_detection_module(ndpi_struct, free_wrapper);

这些字段有以下含义:

 struct ndpi_detection_module_struct*ndpi_struct;

需要被消除的检测模块。

void*(*_ndpi_free)(void*prt);

指向一个内存释放函数的函数指针。

如需进一步的信息,我们建议可以阅读以下文件:

nDPI/example/ndpiReader.c,
nDPI/src/include/ndpi_structs.h,
nDPI/src/include/ndpi_public_functions.h
nDPI/src/ndpi_main.c

协议解析器文件被包含在nDPI/src/protocols 目录下。

5、开发nDPI自定义协

在这一节中,我们将展示将你的协议包含在nDPI中的方法。

5.1、介绍

每个nDPI协议都会作为一个入口函数被实现,在运行时通过nDPI被使用。nDPI有几个协议可以被用来当作这个方面的例子。下面,我们列出了一些主要的概念,如果你打算开发一个nDPI协议,这些是你必须知道的。

5.2、创建新的协议

每一个协议都必须在下面的头文件中有一个对应的定义:

<nDPI source code directory>/src/include/ndpi_protocols_osdpi.h

例如:

#define NDPI_PROTOCOL_MY_PROTOCOL     171

NDPI_PROTOCOL_MY_PROTOCOL是这个协议的名字,171是这个协议的ID,且必须是独一无二的。

一旦定义了协议,您必须创建一个新的协议源文件,如

<nDPI source code directory>/src/lib/protocols/my_protocol.c

包括以下内容:

#include "ndpi_utils.h"
#ifdef NDPI_PROTOCOL_MY_PROTOCOLS
.....
#endif

在里面,需要定义一个入口函数,如:

void ndpi_search_my_protocol(struct ndpi_detection_module_struct *ndpi_struct,struct ndpi_flow_struct *flow)
{struct ndpi_packet_struct *packet = &flow->packet;NDPI_LOG(NDPI_PROTOCOL_MY_PROTOCOL, ndpi_struct,NDPI_LOG_DEBUG, "my protocol detection...\n");
/* skip marked packets by checking if the detection protocol stack */if (packet->detected_protocol_stack[0] != NDPI_PROTOCOL_MY_PROTOCOL) {ndpi_check_my_protocol(ndpi_struct, flow);}
}

及其一个核心检测函数,用来处理一个流的数据包,包括以下内容:

static void ndpi_check_my_protocol(struct ndpi_detection_module_struct *ndpi_struct,struct ndpi_flow_struct *flow)
{struct ndpi_packet_struct *packet = &flow->packet;u_int32_t payload_len = packet->payload_packet_len;..........if("Found Protocol") {NDPI_LOG(NDPI_PROTOCOL_MY_PROTOCOL, ndpi_struct,NDPI_LOG_DEBUG, "Found my protocol.\n");ndpi_int_my_protocol_add_connection(ndpi_struct, flow);return;}/*Exclude Protocol*/NDPI_LOG(NDPI_PROTOCOL_MY_PROTOCOL, ndpi_struct, NDPI_LOG_DEBUG,"exclude my protocol.\n");NDPI_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask,NDPI_PROTOCOL_MY_PROTOCOL);}
}

还有一个特定的函数用来报告关于协议正确的识别信息,如:

static void ndpi_int_my_protocol_add_connection(struct ndpi_detection_module_struct *ndpi_struct,struct ndpi_flow_struct *flow,u_int8_t due_to_correlation)
{ndpi_int_add_connection(ndpi_struct, flow,NDPI_PROTOCOL_MY_PROTOCOL,/*Choose the type of your protocol*/NDPI_CORRELATED_PROTOCOL or NDPI_REAL_PROTOCOL);
}

5.3、添加你的协议到nDPI

协议被创建之后,你必须在下面的头文件中声明你的入口函数:

<nDPI source code directory>/src/include/ndpi_protocols.h

包括如下内容:

/* my protocol entry */
void ndpi_search_my_protocol(struct ndpi_detection_module_struct *ndpi_struct,struct ndpi_flow_struct *flow);

每个协议必须与一个NDPI_SELECTION_BITMASK相关联。NDPI_SELECTION_BITMASK的完整列表被包含在文件:

<nDPI source code directory>/src/include/ndpi_define.h

在为你的协议选择了一个确定的位掩码之后,你必须通知nDPI新协议的存在,通过编辑文件:

<nDPI source code directory>/src/lib/ndpi_main.c

需要将你的协议添加到如下函数中:

void ndpi_set_protocol_detection_bitmask2(struct ndpi_detection_module_struct *ndpi_struct,const NDPI_PROTOCOL_BITMASK * dbm)
.....
.....
.....
#ifdef NDPI_PROTOCOL_MY_PROTOCOL
ndpi_set_bitmask_protocol_detection(ndpi_struct,detection_bitmask,a,NDPI_PROTOCOL_MY_PROTOCOL,ndpi_search_my_protocol,NDPI_SELECTION_BITMASK_MY_PROTOCOL,SAVE_DETECTION_BITMASK_AS_UNKNOW,ADD_TO_DETECTION_BITMASK);
/* Update callback_buffer index */
a++;
#endif
.....
.....
.....
ndpi_struct->callback_buffer_size = a;
NDPI_LOG(NDPI_PROTOCOL_UNKNOWN, ndpi_struct, NDPI_LOG_DEBUG,"callback_buffer_size is %u\n", ndpi_struct->callback_buffer_size);

ndpi 流量协议分析相关推荐

  1. nDPI流量协议分析(应用软件识别)

    nDPI识别的协议号大全 #ifndef _NDPI_H_ #define _NDPI_H_ typedef enum {  NDPI_PROTOCOL_FTP_CONTROL=1  ,  //  1 ...

  2. 网络协议分析与仿真课程设计报告:网络流量分析与协议模拟

    公众号:CS阿吉 网络协议分析与仿真课程设计报告  题  目:网络流量分析与协议模拟 专业名称:         网络工程 班    级: 学生姓名:           阿吉 学号(8位): 指导教 ...

  3. 【智能路由器】ndpi深度报文分析之协议分析器

    [智能路由器]系列文章连接 http://blog.csdn.net/u012819339/article/category/5803489 本篇博客讲述ndpi已经实现的QQ协议分析器的实现 以及 ...

  4. 网络安全协议分析-wireshark流量监控(未完)

    文章目录 TCP的六个标志 一.ARP欺骗 二.SYN半连接扫描. 三.FTP爆破 HTTP抓包修改 DNS与DHCP协议分析 DNS DHCP(饿死攻击) DDOS攻击 TCP的六个标志 TCP的六 ...

  5. MISC:流量包取证(pcap文件修复、协议分析、数据提取)

    文章目录 1.流量包修复 2.协议分析 2.1 wireshark基本操作 2.2 一些例题(各种协议) 3.数据提取 1.流量包修复 这个方向的考点较少 当我们用 wireshark 打开流量包时, ...

  6. TLS握手协议分析与理解——某HTTPS请求流量包分析

    https://xz.aliyun.com/t/1039 HTTPS简介 HTTPS,是一种网络安全传输协议,在HTTP的基础上利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护 ...

  7. 【智能路由器】ndpi深度报文分析源码框架

    [智能路由器]系列文章连接 http://blog.csdn.net/u012819339/article/category/5803489 某些需求可能会要求路由能精确的分析出流经路由的流量是属于什 ...

  8. 宅男抖音某猫协议分析及应用破解

    " 分析传说中的快x,顺便提供破VIP线路及去启动广告方法." 在当今这个由应用市场主导的网络上,流传着一批应用,它们低调又神秘,依赖口碑与独立网站在地下渠道传播,应用市场中从来都 ...

  9. 从新手到入门,如何进入协议分析的世界

    " 协议分析与还原自学及入门指南." 有部分朋友给我发消息,说对协议还原很感兴趣,但苦于没人指导,希望得到我的帮助,问我如何进行协议分析的学习. 这篇文章从初学者的角度,编列了一个 ...

最新文章

  1. linux系统yum源,Linux开启安装EPEL YUM源
  2. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java
  3. 037——VUE中表单控件处理之表单修饰符:lazy/number/trim
  4. 选对论文,效率提升50% | 本周值得读
  5. 10.term level 查询
  6. mysql57win10安装配置_Win10 OS安装(配置)MySQL 5.7(解压版)
  7. C语言-输入一个正整数,输出它的所有质数因子
  8. 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性
  9. java 使用apollo,Springboot apollo原理及使用方法详解
  10. 电商生鲜网站开发(接口文档)
  11. 经过了多种方法的尝试,终于找到Quartus破解成功但是没有办法编译的解决方法
  12. 【数据库】E-R图相关知识、绘制方法及工具推荐
  13. 张飞流水帐(完整版)
  14. 我的世界个人服务器搭建
  15. mysql报错1357_mysql8 参考手册--错误代码1343-1367
  16. 计算机及其应用本课程,北京08自考计算机及应用(独本)课程设置
  17. 中测院能耗管理系统的设计及应用
  18. 《福布斯》评出全球十大豪华手机 Vertu居首
  19. 【工作日记】这一年来完全用Linux工作的感受
  20. 《大数据时代》 概要

热门文章

  1. 云原生思想 — 云原生应用
  2. VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
  3. Openstack Paste.ini 文件详解
  4. 扩展资源服务器解决oauth2 性能瓶颈
  5. Alpine Linux 3.9.1 发布,面向安全的轻量级 Linux 发行版
  6. 【Linux Deploy】一、Linux Deploy安装配置使用教程
  7. LIst和map的遍历
  8. I.MX6 Android i2c-tools porting
  9. maven打包跳过Test
  10. IE遭破坏后的自我修复方法