LINUX.ORG.RU
ФорумAdmin

netflow 5.0 unix_secs, sys_uptime, first,last


0

0

Доброго времени суток!

Не могу понять, как вычленять время из пакетов протокола Netflow версии 5.0.

Маршрутизатор Cisco 4507R, находится в новосибирске (GMT+6). Экспортирует flow-поток на одну из рабочих станций. Моя задача - вычленять оттуда некоторые пакеты, точнее данные с них. По-большому счету все понятно, кроме времени. Есть в протоколе следующие поля:

(Далее воспользовался информацией с http://www.securitylab.ru/forum/forum21/topic46779/messages/?PAGEN_1=2 )

/**********************************************************/

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

Точность времени для данных порядка одной секунды, так как приходится округлять

/********************************************************/

Попробовал реализовать.

Что в итоге получаю:

Сегодня 05.05.09, местное время примерно 18.14. Время на экспортирующем маршрутизаторе указано верно.

Получаю пакет.

unix_secs (8-11) = 1241522062

sys_uptime (4-7) = 1228598392

first (24-27) = 1228430416

last (28-31) = 1228450356

Использую формулу, получаю

Unix_Time_Flow_Created = 1245816861

Для последнего пакета потока - такая.

Unix_Time_Flow_Died = 1245816881

преобразуем

select FROM_UNIXTIME(1241522062) as UNIXSECS,FROM_UNIXTIME(1245816861) as Unix_Time_Flow_Created

получаем результат:

UNIXSECS Unix_Time_Flow_Created '2009-05-05 18:14:22', '2009-06-24 11:14:21'

UnixSecs похож на правду, а вот Unix_Time_Flow_Created - ни в какие ворота - даже если прибавить шесть часов (GMT+6) то 24 июня 2009 тут совсем не при делах :(.

Подскажите в чем я не прав, кто знает, плиз.


mysql> select from_unixtime(1241522062 - 1228598392/1000 + 1228430416/1000);
+---------------------------------------------------------------+
| from_unixtime(1241522062 - 1228598392/1000 + 1228430416/1000) |
+---------------------------------------------------------------+
| 2009-05-05 15:11:34                                           | 
+---------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> select from_unixtime(1241522062 - 1228598392/1000 + 1228450356/1000);
+---------------------------------------------------------------+
| from_unixtime(1241522062 - 1228598392/1000 + 1228450356/1000) |
+---------------------------------------------------------------+
| 2009-05-05 15:11:54                                           | 
+---------------------------------------------------------------+
1 row in set (0.00 sec)

а мя все пучком, кстати вы unix_nsecs не учитываете, алгоритм лучше брать из рабочих решений , например из состава flow-tools

struct fttime ftltime(u_int32 sys, u_int32 secs, u_int32 nsecs, u_int32 t)
{ 

  u_int32 sys_s, sys_m;
  struct fttime ftt;

  /* sysUpTime is in milliseconds, convert to seconds/milliseconds */
  sys_s = sys / 1000;
  sys_m = sys % 1000;

  /* unix seconds/nanoseconds to seconds/milliseconds */
  ftt.secs = secs;
  ftt.msecs = nsecs / 1000000L;

  /* subtract sysUpTime from unix seconds */
  ftt.secs -= sys_s;

  /* borrow a second? */
  if (sys_m > ftt.msecs) {
    -- ftt.secs;
    ftt.msecs += 1000;
  }
  ftt.msecs -= sys_m;

  /* add offset which is in milliseconds */
  ftt.secs += t / 1000;
  ftt.msecs += t % 1000;

  /* fix if milliseconds >= 1000 */
  if (ftt.msecs >= 1000) {
    ftt.msecs -= 1000;
    ftt.secs += 1;
  }

  return ftt;

} /* ftltime */

hizel ★★★★★
()
Ответ на: комментарий от hizel

Hizel, спасибо за ответ.

Вы, получается, пользуетесь формулой Unix_Time_Flow_Created = UNIX_SECS - (SYSUPTIME-FIRST)/1000 Unix_Time_Flow_Died = UNIX_SECS - (SYSUPTIME-LAST) /1000

вместо той, которой пользовался я

Unix_Time_Flow_Created = UNIX_SECS + (FIRST - SYSUPTIME)/1000 Unix_Time_Flow_Died = UNIX_SECS + (LAST - SYSUPTIME)/1000

Результат гораздо больше похож на правду, есть такое :-).

Не могли бы вы описать, почему вы отнимаете (SYSUPTIME-FIRST)/1000 и (SYSUPTIME-LAST)/1000 от UNIX_SECS, а не прибавляете к ним. Не могу понять :(.

deadka
() автор топика
Ответ на: комментарий от deadka

что то я запутался %-)
вроде у мя формула такая-же как у вам

Flow_Start = UNIX_SECS - SYSUPTIME/1000 + FIRST/1000 = UNIX_SECS + (FIRST - SYSUPTIME)/1000

hizel ★★★★★
()
Ответ на: комментарий от hizel

mysql> set @sys_uptime = 1228598392;
Query OK, 0 rows affected (0.00 sec)

mysql> set @unix_secs = 1241522062;
Query OK, 0 rows affected (0.00 sec)

mysql> set @first = 1228430416;
Query OK, 0 rows affected (0.00 sec)

mysql> set @last = 1228450356;
Query OK, 0 rows affected (0.00 sec)

mysql> select FROM_UNIXTIME(@unix_secs - @sys_uptime/1000 + @first/1000);
+------------------------------------------------------------+
| FROM_UNIXTIME(@unix_secs - @sys_uptime/1000 + @first/1000) |
+------------------------------------------------------------+
| 2009-05-05 15:11:34                                        | 
+------------------------------------------------------------+
1 row in set (0.02 sec)

mysql> select FROM_UNIXTIME(@unix_secs + (@first - @sys_uptime)/1000);
+---------------------------------------------------------+
| FROM_UNIXTIME(@unix_secs + (@first - @sys_uptime)/1000) |
+---------------------------------------------------------+
| 2009-05-05 15:11:34                                     | 
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select @unix_secs + (@first - @sys_uptime)/1000;
+------------------------------------------+
| @unix_secs + (@first - @sys_uptime)/1000 |
+------------------------------------------+
|                          1241521894.0240 | 
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select FROM_UNIXTIME(@unix_secs + (@last - @sys_uptime)/1000);
+--------------------------------------------------------+
| FROM_UNIXTIME(@unix_secs + (@last - @sys_uptime)/1000) |
+--------------------------------------------------------+
| 2009-05-05 15:11:54                                    | 
+--------------------------------------------------------+
1 row in set (0.00 sec)

hizel ★★★★★
()
Ответ на: комментарий от hizel

Да, hizel, все верно, у меня просто был глюк - ведь sys_uptime больше чем first и last, а я поместил их в беззнаковые переменные - вот и получил вместо отрицательного числа большое положительное, отсюда и скачок на июнь произошел :(. Так что формулы идентичны. Спасибо вам большое!

deadka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.