1

确定 NetFlow 数据包中流的绝对时间的最佳方法是什么?看起来流程中仅包含相对时间信息(流程开始和结束时的 SysUpTime)。

对于 Netflow v5 和 v9,可以通过数据包头中的 Unix Seconds 和 SysUptime 字段来计算它:UnixSeconds - SysUptime + FlowStartSysUptime。但是 UnixSeconds 字段只有一秒的精度..

在 IPFIX (v10) 中,标头仅包含创建数据包时的系统时间,而不包含系统正常运行时间。

4

1 回答 1

1

一些 IPFIX 导出器通过使用更新的绝对时间戳字段(例如 flowStartSeconds(150)、flowEndSeconds(151))来避免此问题。有毫秒精度、微秒精度等的变体。见: http ://www.iana.org/assignments/ipfix/ipfix.xhtml

(另外,请注意,IPFIX 标头中的绝对时间戳应该接近数据包实际完成和发送的时间,因此您至少可以对导出器和收集器之间的时钟偏移进行建模: https:// www.rfc-editor.org/rfc/rfc7011#page-14

但正如您所指出的,当 IPFIX 导出器发送遗留字段 flowEndSysUpTime(21) 和 flowStartSysUpTime(22) 时会出现问题。这对 NetFlow v1-9 来说没问题,因为标头时间戳也用 sysUpTimeSeconds 表示,但使用 IPFIX 会让您陷入困境。

一个简单的解决方案是假设流总是被及时刷新,计算它们的持续时间,并将它们与 NOW 对齐:

duration = flowEndSysUpTime - flowStartSysUpTime
start = (NOW - duration)
end = NOW

另一种方法是假设至少有一些流被迅速刷新,并使用 flowEndSysUpTime 数字维护每个设备启动时间的估计:

boot-time = MIN(NOW - flowEndSysUpTime)
start = boot-time + flowStartSysUpTime
end = boot-time + flowEndSysUpTime

但是,如果设备实际重新启动,您必须小心检测启动时间估计值的阶跃变化。如果连续快速重新启动两次,则该步骤更改可能只有约 30 秒。需要考虑的事情——但由于这些遗留字段只能精确到 1 秒,因此聪明是否值得麻烦尚不清楚。

于 2017-01-25T23:33:27.560 回答