Вчера впервые решал задачу определения точного времени когда жил поток, то есть точное время, когда появился первый пакет в потоке и прошел последний пакет. Такая точность нужна мне так как я использую netflow не для биллинга, а для анализа потенциальных инцидентов в ИБ.
Раньше не нужна была бы такая точность, однако сейчас у меня есть не статичные IP которые выдаются из пула для удаленных подключений по VPN. Так как пользователей ожидается много, то есть вероятность, что будет в течении короткого времени использоваться один и тот же IP различными пользователями.
Итак, как это делается.
Экспортируем потоки в ASCII следующей командой
/usr/local/bin/flow-export -f2 -m0x3831E5 < Flows_File
0x0000000000000001 UNIX_SECS
0x0000000000000004 SYSUPTIME
0x0000000000001000 SRCADDR
0x0000000000002000 DSTADDR
0x0000000000000080 FIRST
0x0000000000000100 LAST
0x0000000000080000 SRCPORT
0x0000000000100000 DSTPORT
0x0000000000200000 PROT
0x0000000000000020 DPKTS
0x0000000000000040 DOCTETS
UNIX_SECS - Время когда поток был экспортирован - в секундах
SYSUPTIME - UpTime экспортирующей системы на время когда поток был экспортирован. Тут тысячные секунды
FIRST - UpTime экспортирующей системы на время когда поток был создан (получен первый пакет). Тут тысячные секунды
LAST - UpTime экспортирующей системы на время когда был получен последний пакет потока. Тут тысячные секунды.
Есть однозначная привязка UNIX_SECS и SYSUPTIME
Поэтому формула для Unix_Time когда получен первый пакет потока такая.
Unix_Time_Flow_Created = UNIX_SECS + (FIRST - SYSUPTIME)/1000
Для последнего пакета потока - такая.
Unix_Time_Flow_Died = UNIX_SECS + (LAST - SYSUPTIME)/1000
Точность времени для данных порядка одной секунды, так как приходится округлять.
Ну, и в общем, офтопик:
-Бабуля, сколько вешать граммов?
-Милок, а к чему такая точность?
-Бабуля, ЭТО ГЕРОИН....