许多ntop产品,如ntopng、nProbe和PF_RING FT等都是基于网络流的。然而,并不是所有的用户都详细知道什么是网络流,以及它在实践中是如何工作的。这篇博客文章描述了它们是什么以及它们在实践中是如何工作的。
什么是网络流量
网络流是一组具有公共财产的数据包。它们通常由5元组密钥标识,这意味着给定流的所有数据包都具有相同的源和目的IP、源和目的端口以及应用协议(例如TCP)。在实践中,流密钥还至少包括VLAN Id,并且最终包括诸如封装业务的隧道ID之类的其他属性。流是一种通过使用公共密钥对数据包进行聚类然后对流量进行分类的方法,它与运行netstat-na等命令时在计算机上看到的情况类似。每个流都有各种计数器,用于跟踪流数据包/字节和各种其他属性,如流计时器(第一个和最后一个流数据包的时间)、统计信息(重传、数据包无序等)和安全属性(例如流风险)。
流量是如何存储在内存中的?
网络流保存在一个名为流缓存的数据结构中(通常使用哈希表实现),该数据结构不断地提供传入的数据包。流高速缓存在存储器中存储活动流(即,当接收到属于流的分组时仍然活动的那些流)。下面您可以看到ntopng如何显示实时流缓存及其5元组密钥。
网络流何时开始?
一旦观察到第一个流分组,网络流就开始。在启动时,流缓存是空的,并且随着数据包的接收而被填满。对每个传入的数据包进行解码,并计算流密钥。在流缓存中搜索这样的密钥:如果没有找到,则向流缓存中添加新的条目,否则更新具有这样的密钥的现有条目,即更新流数据包/字节和计时器的计数器。因此,本质上,当观察到第一个流分组时,流就开始了。
网络流何时结束?
每个流都有两个老化计时器:空闲计时器(它跟踪自接收到最后一个流数据包以来已经过去了多少时间)和持续时间计时器(它记录流持续的时间)。当这两个老化定时器中的一个到期时,即当流空闲太长(例如,有一段时间没有接收到分组)或当流在流高速缓存中存储太长时,流结束。在nProbe和PF_RING FT中,当流过期时,它将从流缓存中删除并发送到收集器。相反,在ntopng中,从流缓存中删除流只是为了空闲,因为持久流不会从缓存中删除。原因是像nProbe这样的流量探测器需要定期向收集器(例如ntopng)报告有关监控流量的信息,因此流量会被“剪切”并发送到收集器。相反,在ntopng中,不需要通知收集器,因此只要在首选项中配置了必要的内容,流就会留在内存中。
流的关键点和方向
如果流是在接收到第一个流数据包时创建的,那么我们可以将流客户端视为真正的网络客户端。例如,从主机1.2.3.4上的客户端到主机5.6.7.8的SSH,这种通信的流程将是1.2.3.4:X<->5.6.7.8:22(我们假设SSH在端口22上运行)。看起来是对的吧?但有时你会看到,在流缓存中,这样的流被报告为5.6.7.8:22<->1.2.3.4:X。为什么?这可能是由于各种原因造成的:
- 应用程序(例如ntopng)在流开始后启动,ntopng观察到的第一个数据包是5.6.7.8:22->1.2.3.4:X,而不是1.2.3.4:X->5.6.7.8:22。
- 流使用正确的密钥存储在缓存中,但有一段时间(例如2分钟)没有交换数据包,因此应用程序已将流声明为过期,并将其从流缓存中删除。然后,如果突然观察到一个新的数据包,则该数据包可能会被发送到错误的方向(例如5.6.7.8:22->1.2.3.4:X),因为这可能是服务器的保存数据包。在这种情况下,流以相反的方向(9,因此是错误的)放置在高速缓存中。
可以配置ntopng(通过首选项)和nProbe(使用带有-t和-d的命令行)流超时,因此这些问题得到了缓解(尽管没有完全解决)。然而,仅仅调整超时是不够的,特别是对于UDP流,因为与TCP相反,没有TCP标志可以用来猜测真实的流方向。因此,ntopng实现了一些启发式来交换流向,但这种启发式不能太激进,因为我们可能会报告无效信息。
我们希望这篇文章能让大家明白基于流量的网络流量分析是如何工作的,以及为什么有时会观察到一些“意外”行为,不是因为漏洞,而是因为这些测量的性质。