为什么 Wireshark 对我的 Netflow 数据包序列号不满意?

网络工程 网络流量 修复
2021-07-27 13:41:35

我写了一个 Netflow v10 (IPFIX) 流量生成器。它欺骗源 IP 地址以假装来自多个站点,并发送有关假冒用户的报告。这个想法与 Solarwinds Flow Generator 非常相似,如果有人遇到过那个工具的话。

它似乎工作得很好,但是当我使用 Wireshark 进行数据包捕获时,Wireshark 告诉我我的序列号不正确。

据我阅读 IPFIX RFC 所见,序列号从 0 开始(在第一个数据包中),并且在后续数据包中按前一个数据包中的流数递增(不计算模板或选项流)。它们是收集器知道它是否错过任何数据包的一种方式。

因此,对于给定站点(出口商 IP),如果我每个数据包发送 10 个数据流,第一个数据包的序列为 0,下一个数据包的序列为 10,然后是 20,依此类推。这正是我正在做的事情,但 Wireshark 不高兴。

Wireshark 提到了它期望的序列号是什么,但它期望的数字没有任何意义。例如,我来自 80.40.20.41 的第一个数据包有一个数据模板和 17 个数据流。我有一个序列号 0,wireshark 说它期望它是 71。它似乎在计算来自其他源 IP(其他出口商)的流量,并期望序列号由于某种原因在不同站点之间同步.

有谁知道我的问题可能是什么?

这是我的数据包捕获,如果有人有时间看看:https : //drive.google.com/file/d/1_Sz-ndnbA8w0FZwBriXykXb-O3hZFoqC/view?usp=sharing


编辑:

看来,如果我让每个出口商的观察域都是唯一的,Wireshark 对我的序列号很满意。为什么不同的出口商需要不同的观察域 ID?这怎么可能同步?如果 2 个不同的路由器充当 netflow 导出器并发送单个 netflow 收集器数据,那么这两个路由器如何知道用于观察域 ID 的内容,以便它们不会相互干扰?观察域是否需要管理员在每个导出器上手动配置以确保它们是唯一的?

2个回答

根据我对规范的理解,Wireshark 是错误的,因为它应该为每个唯一的传输会话或 SCTP 流独立跟踪序列号。

(引用的内容来自 RFC 7011)

观察域 ID

观察域的 32 位标识符,对于导出过程本地唯一的. 导出过程使用观察域 ID 向收集过程唯一标识计量流的观察域。建议此标识符对于每个 IPFIX 设备也是唯一的。收集进程应该使用传输会话和观察域 ID 字段来分离源自同一导出器的不同导出流。当没有特定的观察域 ID 与整个 IPFIX 消息相关时,观察域 ID 应该为 0,例如,在导出导出过程统计信息时,或者在导出聚合数据记录时收集器的层次结构的情况。

观察域ID只需“本地唯一”即可。确保 ID 是全局唯一的只是一个建议,不是必需的,因此收集过程将无法依赖于此。

序列号

由导出过程从当前观察域发送到当前流中的所有 IPFIX 数据记录的增量序列计数器模 2^32 每个 SCTP 流单独计算序列号,而 TCP 连接或 UDP 会话中的所有消息都被视为同一流的一部分。 收集过程可以使用该值来确定是否遗漏了任何 IPFIX 数据记录。模板和选项模板记录不会增加序列号。

序列号是一个递增的数字,其范围是当前流(对于 UDP 或 TCP,这是传输会话,对于 SCTP,这是传输会话中的单个流)和观察域 ID收集过程需要使用传输会话参数和观察域 ID 来跟踪每个独立的序列号计数器。

传输会话

在流控制传输协议(SCTP)中,传输会话称为 SCTP 关联,由 SCTP 端点唯一标识 [RFC4960];在 TCP 中,传输会话称为 TCP 连接,它由使用的 IP 地址和 TCP 端口的组合唯一标识。在 UDP 中,传输会话称为 UDP 会话,它由使用的 IP 地址和 UDP 端口的组合唯一标识。

传输会话由会话的连接参数标识。例如,对于 UDP,这些是源地址和目标地址以及源和目标端口。

为什么不同的出口商需要不同的观察域 ID?这怎么可能同步?如果 2 个不同的路由器充当 netflow 导出器并发送单个 netflow 收集器数据,那么这两个路由器如何知道用于观察域 ID 的内容,以便它们不会相互干扰?观察域是否需要管理员在每个导出器上手动配置以确保它们是唯一的?

您需要注意 RFC 所说的内容。例如,您认为观察域是什么?RFC 解释了它:

观察域

观察域是最大的一组观察点,可以通过计量过程为其聚合流信息。例如,如果路由器线卡由多个接口组成,则它可能是一个观察域,每个接口都是一个观察点。在它生成的 IPFIX 消息中,观察域包括 它的观察域 ID,它是每个导出进程唯一的。这样,收集进程可以从发送 IPFIX 消息的导出器识别特定的观察域。每个观察点都与一个观察域相关联。 建议每个 IPFIX 设备的观察域 ID 也是唯一的。

如果不让每个设备都有唯一的观察域ID,那么就会遇到如何协调序号的问题:

序列号

由导出过程从当前观察域发送到当前流中所有 IPFIX 数据记录的增量序列计数器模 2^32 每个 SCTP 流单独计算序列号,而 TCP 连接或 UDP 会话中的所有消息都被视为同一流的一部分。收集过程可以使用该值来确定是否遗漏了任何 IPFIX 数据记录。模板和选项模板记录不会增加序列号。

单个设备实际上可以有多个观察域 ID,但是尝试在多个设备上使用相同的观察域 ID 会带来跨多个设备协调序列 ID 的挑战。如果观察域仅存在于单个设备上,那么这不是问题。换句话说。一台导出 NetFlow 数据的设备将有一个或多个导出进程,与其他导出 NetFlow 数据的设备分开,每个设备都有一个或多个自己的导出进程,并且,正如 RFC 指出的那样:“观察域 ID,每个导出是唯一的过程。