网络分流器dpi深度数据包检测

  

网络分流器——戎腾网络dpi检测是当前比较流行的网络监控前端的一种模式,而网络分流器对于网络安全的重要性可以说是到头重要的!今天我们来聊聊DPI检测
网络分流器DPI深度数据包检测“> <br/> <img src=

  

深度数据包检测(DPI)

  

深度数据包检测(深度数据包检测,缩写为DPI)是一种特殊的网络技术,一般网络设备只会查看以太网头部,IP头部而不会分析TCP/UDP里面的内容这种被称为浅数据包检测;与之对应的DPI会检查TCP/UDP里面的内容,所以称为深度数据包检测。
DPI一般是一个硬件或者软件,一般用“旁挂”的方式接入到网络。它会对网络中的每个数据包进行检查,识别出应用层协议,根据识别的协议采取一定的措施(比如记录HTTP访问行为)。对于TCP协议它可以识别完整的TCP交互过程(比如HTTP请求从请求到响应中间会有多次TCP数据包发送)。
网络分流器DPI深度数据包检测“> <br/>戎腾网络移动互联网采集器支持160个10 g和20个100 g </p>
  <p> nDPI <br/> nDPI是一个C语言编写的DPI库,用来实现软件DPI系统。它是从OpenDPI扩展而来,二者的架构和实现基本上差不多。<br/>编译安装之后它生成/usr/地方/lib/libndpi。(a)库文件(一个静态库文件,所以动态链接库);/usr/地方/包括/会安装相关的头文件。<br/>我个人喜欢用静态库文件,这样会把所有的二进制代码合并到一个可执行文件中运行的时候不需要安装一大堆库。另外我也不喜欢把东西放到/usr/地方/lib下,所以我提供的代码是通过cmake做了一个“所有在alt=
网络分流器
第一个参数用来计算nDPI分析协议的各种超时时间,一般精确到毫秒就可以了1000 (nDPI协议分析部分和“全局部分“耦合非常紧,这个数据其实只有“协议分析模块”需要)

  

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

  

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

  

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

  

配置协议分析模块

  

nDPI支持多种协议,都在协议文件夹中。编译的时候所有协议都会被放到nDPI库中。使用的时候我们可以自己设置需要开启那些分析模块
网络分流器dpi深度数据包检测

  

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

  

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

  

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

  

子协议   

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

  

nDPI唯一的一份“QuickStartGuide”对这个有进一步解释,子协议识别是以配置文件的方式提供给nDPI的。比如
网络分流器dpi深度数据包检测

  

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

  

网络分流器dpi深度数据包检测“> <br/>网络分流器</p>
  <p> nDPI此处的实现使用了一个非常有名的算法——Aho-Corasick。以第一幅图为例子,里面配置了两条规则“谷歌”和“外衣”,我们有一个字符串(主机),怎么判断这个字符串符合那个规则呢?最简单的办法是循环所有的规则,如果规则条目很多那么速度会非常慢.Aho-Corasick就是这样一种算法,它可以在O (n)中完成所有的匹配任务。<h2 class=网络分流器dpi深度数据包检测