nDPI
nDPI用于检测通信流中应用程序所属的应用层协议,针对对象为互联网流量,并能够解析互联网社区中的标准协议(HTTP和SMTP)和专用协议(Skype和Citrix)。对于标准协议,可以根据公开的协议规范进行协议解析和元数据提取。对于专用协议,由于其协议规范未公开,可以通过网络抓包,反向推断其协议结构并创建解析器。nDPI可以在Linux内核空间和用户空间中使用,并可以移植到Linux,Windows,MacOS X和BSD系列等大多数操作系统。
对于nDPI,一条数据流的协议识别生命周期为:
- nDPI首先解析数据报文的第3、4层,即IP包头和传输层包头,IP包头有源目的地址,传输层包头有端口号。IP包头中可以通过识别协议字段分析其为TCP还是UDP。
- 如果存在注册端口号,则首先通过端口号进行判断。
- 如果未进行匹配,则会通过协议规则库进行进一步识别。此时注意,如果运输层为TCP,则只用TCP承载服务的协议插件进行匹配。UDP同理。插件和数据包匹配失败存在两种情况,第一种是该数据包并不对应插件所属的协议,例如DNS数据包用SNMP插件进行匹配。第二种是与该数据包属于同一条流的后续数据包会匹配成功,这种情况下会继续进行匹配过程。
- 只要有协议匹配成功,则终止本条流的匹配过程。
DPI典型问题是多少数据报文能够识别出未知数据流所属的应用层协议。对大多数基于UDP的协议例如DNS、NetFlow或者SNMP等而言,一个数据报文足以。但是对于BT协议,需要8个数据报文才能获取签名信息。因此得出经验法则,最多单向的8个数据报文即可识别所属协议。
除了以上特点之外,nDPI也可应用于加密流量。虽然也有很大的作用,但实际仍然是在分析HTTPS明文的握手阶段。
- SNI(不可靠,走CDN服务器)
- 证书(TLS1.3证书加密)
另外相对OpenDPI,也增加了配置功能。
nDPI作为优秀的开源工具包,能够处理170种类型协议。并通过第三方验证其性能优于其他商业和开源工具包。采用双核CPU与硬件结合,能够处理满载10G的流量。该工具包适用于高性能和高检准率的场景。
nDPI的具体设计,例如流表管理,线程设计等主要体现在源码中,源码链接见上篇