Метки времени NetFlow
Каков наилучший способ определения абсолютного времени для потоков в пакете данных NetFlow? Похоже, что только относительная информация о времени включена в потоки (SysUpTime в начале и в конце потока).
Для Netflow v5 и v9 его можно рассчитать через поля Unix Seconds и SysUptime в заголовке пакета: UnixSeconds - SysUptime + FlowStartSysUptime. Но поле UnixSeconds имеет точность только одну секунду.
В IPFIX (v10) заголовок содержит только системное время, когда был создан пакет, но не время работы системы.
1 ответ
Некоторые экспортеры IPFIX избегают этой проблемы, используя более новые поля абсолютной отметки времени, такие как flowStartSeconds(150), flowEndSeconds(151). Существуют варианты с точностью до миллисекунды, с точностью до микросекунды и так далее. См.: http://www.iana.org/assignments/ipfix/ipfix.xhtml
(Также обратите внимание, что абсолютная временная метка в заголовке IPFIX должна быть близка к тому моменту, когда пакет был фактически завершен и отправлен, так что вы, по крайней мере, попытались смоделировать смещение часов между экспортером и вашим сборщиком: https://tools.ietf.org/html/rfc7011)
Но, как вы указали, проблема возникает, когда экспортер IPFIX отправляет устаревшие поля flowEndSysUpTime(21) и flowStartSysUpTime(22). Это было нормально для NetFlow v1-9, потому что метка времени заголовка была также выражена в sysUpTimeSeconds, но с IPFIX она оставляет вас в затруднительном положении.
Одно простое решение состоит в том, чтобы предположить, что потоки всегда очищаются быстро, рассчитать их продолжительность и выстроить их в соответствие с ТЕПЕРЬ:
duration = flowEndSysUpTime - flowStartSysUpTime
start = (NOW - duration)
end = NOW
Другой подход состоит в том, чтобы предположить, что по крайней мере некоторые потоки сбрасываются быстро, и поддерживать оценку для каждого времени загрузки устройства, используя числа flowEndSysUpTime:
boot-time = MIN(NOW - flowEndSysUpTime)
start = boot-time + flowStartSysUpTime
end = boot-time + flowEndSysUpTime
но тогда вы должны быть осторожны, чтобы обнаружить пошаговое изменение вашей оценки времени загрузки, если устройство действительно перезагружается. И это изменение шага может составить ~30 секунд, если оно было дважды перезагружено в быстрой последовательности. Есть о чем подумать - но поскольку эти унаследованные поля имеют точность только до 1 секунды, неясно, что быть умным стоит усилий.