ndpi 是如何实际检测 HTTP 协议的?

信息安全 http 协议
2021-08-15 14:20:16

我一直在挖掘ndpi代码库并试图了解它如何实际检测 HTTP 协议。

到目前为止,我发现他们正在搜索有效负载中的请求类型,如果没有找到,他们会执行一些检查以将其归类为 HTTP 响应,但这足以对数据包进行分类吗?显然有人可以纠结于请求数据并绕过那些字符串检查。

我在SSDP协议中看到的相同(只是字符串检查)。

将数据包分类为 HTTP(或任何“x”协议)的高级视图是什么?

2个回答

将数据包分类为 HTTP(或任何“x”协议)的高级视图是什么?

标准端口号与您获得的应用层协议的官方分类一样接近。但在实践中,服务通常不遵守它们的默认端口,并且根本没有通用的方法来检测正在使用的第 7 层协议。因此,深度数据包检查在很大程度上依赖于正则表达式启发式或只是基本的字符串比较(如在 nDPI 中引用的代码中)。

在大多数情况下,没有比在(最好是初始)数据包中寻找典型模式更好的检测协议的方法了——比如GET带有后续标头的请求行,以识别 HTTP 连接。因此,您是对的,通过隐藏协议(通常由 BitTorrent 应用程序完成)很容易逃避这些检查。已停产的Linux 第 7 层过滤器项目有一个解决这些问题的常见问题解答

问:这难道不是军备竞赛中的又一个毫无意义的步骤,协议将不断适应逃避分类吗?

A:你可以这样看,但基本上没有。HTTP 等 Internet 标准不会这样做。只有 P2P 程序之类的会。这意味着,在最坏的情况下,您需要做的是缩小“未知”分类,将大部分带宽留给 HTTP、SMTP 等已知协议。

还可以查看l7protocols wiki,它记录了协议识别的各种方法,其中大多数是基于正则表达式的。

添加到Arminius 的答案
DPI 解决方案有不同的用例:

  • 一个用例只是快速分类流量以优化重要流量的网络延迟,例如首选 VoIP 流量和减慢 BitTorrent。在这个用例中,使用不需要那么严格的快速启发式算法很重要,因为在最坏的情况下,错误的流量会变得更快或变慢。
  • 另一个用例是安全性。在这里,可靠地检测协议很重要,因为需要决定是否应该在没有进一步分析的情况下通过流量,是否应该阻止或更详细地检查。尽管在这些情况下也使用了 nDPI 中的启发式算法,但它们通常可以被绕过。一个更好但通常慢得多的替代方案是更详细的协议分析和协议执行,例如在 HTTP 代理中所做的那样。