(注:最近在学习ntop这个工具,其核心是nDPI这个库,关于这个库,官方有一个快速入门指南,不过肯定是英文的,我在阅读过程中,顺便翻译了一下,当然个人知识有限,翻译的有问题的地方,望留言指正,感谢。如果有疑问,建议访问官方文档地址:https://github.com/ntop/nDPI/blob/dev/doc/nDPI_QuickStartGuide.pdf)

nDPI – 快速入门指南

-开源可扩展LGPLv3深度包检测库

nDPI网页

http://www.ntop.org/products/ndpi/

Ntop网址

www.ntop.org

nDPI许可

LGPLv3

目录

nDPI – 快速入门指南

-开源可扩展LGPLv3深度包检测库

1、nDPI介绍

1.1、下载源

2、nDPI库

2.1、编译nDPI源码

2.2、编译示例ndpiReader源码

2.3、ndpiReader命令行选项

2.4、协议文件

3、示例

3.1、实时捕获模式

3.2、pcap 捕获模式

3.3、协议文件

4、API nDPI

5、开发nDPI自定义协议

5.1、介绍

5.2、创建新的协议

5.3、添加你的协议到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库非常地简单。为了编译这个库,你必须满足一些先决条件比如:

  1. GUN autotools/libtool
  2. gawk
  3. gcc

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

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

2.2、编译示例ndpiReader源码

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

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文件来实现它:

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

4、API nDPI

在这一节中nDPI API是重点。

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

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

#include"dpi_main.h"

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

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

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

  • U_int32_t ticks_per_second

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

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

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

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

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

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

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

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

dpi_load_protocols_file(ndpi_struct, _protoFilePath);

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

这些字段有以下的含义:

  • 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/src/protocols 目录下。

5、开发nDPI自定义协

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

5.1、介绍

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

5.2、创建新的协议

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

例如:

#define NDPI_PROTOCOL_MY_PROTOCOL     171

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

协议被定义好了之后,你必须创建一个协议源文件,就像:

包括以下内容:

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

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

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

5.3、添加你的协议到nDPI

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

包括如下内容:

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

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

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

**注:此文档为学习ndpi所用,为了防止文章链接丢失才转载的。 原文作者:A_lber_t 文章地址:https://blog.csdn.net/A_lber_t/article/details/89552332 请尊重原作者权益,若侵权,请联系我删除**

nDPI – 快速入门指南相关推荐

  1. BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自 | GitHub    作者 | Jay Alammar 转自 | 机器之心 如 ...

  2. BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南

    2019-12-31 10:50:59 选自GitHub 作者:Jay Alammar 参与:王子嘉.Geek AI 如果你是一名自然语言处理从业者,那你一定听说过最近大火的 BERT 模型.本文是一 ...

  3. RMAN快速入门指南

    RMAN快速入门指南   1. What is RMAN? 什么是RMAN?    4 2. Terminology 专业词汇解释    4 2.1. Backup sets 备份集合    4 2. ...

  4. 150页书籍《PyTorch 深度学习快速入门指南》附PDF电子版

    为什么说是极简教程,首先本书只涵盖了150页.内容比较精简,特别适合作为 PyTorch 深度学习的入门书籍.为什么这么说呢?因为很多时候,一份厚重的书籍往往会削弱我们学习的积极性,在学习一门新的语言 ...

  5. h5py快速入门指南

    h5py是Python语言用来操作HDF5的模块.下面的文章主要介绍h5py的快速入门指南,翻译自h5py的官方文档:http://docs.h5py.org/en/lates... .该翻译仅为个人 ...

  6. 2017 Vue.js 2快速入门指南

    注意,据部分读者反映本文水多,怕湿身者勿进.后续推荐详解 Vue & Vuex 实践 2017 Vue.js 2快速入门指南翻译自Vue.js 2 Quickstart Tutorial 20 ...

  7. Flux快速入门指南

    翻译自 http://www.jackcallister.com/2015/02/26/the-flux-quick-start-guide.html 2015年2月26日 本文将概述如何使用Flux ...

  8. AngularJS快速入门指南09:SQL

    我们可以将之前章节中的代码用来从数据库中读取数据. 通过PHP Server从MySQL数据库中获取数据 <div ng-app="myApp" ng-controller= ...

  9. AngularJS快速入门指南03:表达式

    AngularJS通过表达式将数据绑定到HTML. AngularJS表达式 AngularJS表达式写在双大括号中:{{ 表达式语句 }}. AngularJS表达式绑定数据到HTML的方式与ng- ...

最新文章

  1. Unity游戏开发技巧集锦2.1.3实现效果
  2. Windows下查看dll被哪个进程调用
  3. mysql 5.7和8.0区别_前沿观察 | MySQL性能基准测试对比:5.7 VS 8.0
  4. iOS开发学无止境 - 这样好用的ReactiveCocoa,根本停不下来
  5. VUE3.x的基本使用
  6. 从0开始学习自动化测试框架cypress(三)特性
  7. 4个mos管驱动的全桥电路原理_逆变器工作原理
  8. PHP文件操作 读取与写入
  9. 如何在电脑上装一个虚拟机
  10. 一次学会两种方式将 pyton 打成 exe
  11. [VS2010]读秀资源咨询法下载器:逸雨清风读秀批量下载 V5.20 2015-5-20
  12. 【C语言管理系统】 医院住院病人信息管理系统
  13. NYOJ 42 一笔画
  14. SkyWalking触发告警发送邮箱
  15. Bug:数据库的有数据,但是查出来是0
  16. 数学实验——函数绘图实验
  17. 怎么配置java环境
  18. 怎么解决app下载链接被微信屏蔽拦截导致打开显示已停止访问该网页问题?
  19. TFT显示模组是什么?tft显示模组有什么功能?
  20. 蓝桥杯-正则问题-栈应用-java

热门文章

  1. DVWA靶场通关(SQL注入)
  2. OpenSSH: 通过 LDAP 做认证
  3. 领导 - 如何培养您的团队的信心
  4. mysql inet aton ipv6_Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结
  5. 这可能是史上最好用的PickerView库了
  6. (收藏)【 数字化客户体验】NPS、CSAT和CES——2020年跟踪的客户满意度指标
  7. 关于win10输入法问题(打不出中文)解决方法
  8. 虚拟服务器和vdi,桌面虚拟化---SBC和VDI的区别
  9. Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Random forest 和 gradient boosting的区别
  10. kettle扩大运行内存