URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID6
Нить номер: 18806
[ Назад ]

Исходное сообщение
"netflow 5.0 unix_secs, sys_uptime, first,last"

Отправлено deadka , 05-Май-09 15:24 
Доброго времени суток!
Не могу понять, как вычленять время из пакетов протокола Netflow версии 5.0.

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

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

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

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 тут совсем не при делах :(.

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


Содержание

Сообщения в этом обсуждении
"netflow 5.0 unix_secs, sys_uptime, first,last"
Отправлено sm00th1980 , 05-Май-09 20:56 
я не понимаю к чему такая сложность то...всё по моему гораздо проще можно сделать.

flow-print -f 5 < flow_bla_bla > flow.txt

и flow.txt уже скармливаем perl скрипту и первые 2 колонки содержат дату + время.
Будьте внимательны они не содержат ГОД. только месяц+день.


"netflow 5.0 unix_secs, sys_uptime, first,last"
Отправлено sm00th1980 , 05-Май-09 20:56 
>я не понимаю к чему такая сложность то...всё по моему гораздо проще
>можно сделать.
>
>flow-print -f 5 < flow_bla_bla > flow.txt
>
>и flow.txt уже скармливаем perl скрипту и первые 2 колонки содержат дату
>+ время.
>Будьте внимательны они не содержат ГОД. только месяц+день.

я лично беру год из localtime


"netflow 5.0 unix_secs, sys_uptime, first,last"
Отправлено sm00th1980 , 05-Май-09 21:00 
#!/usr/bin/perl
#version 0.1
#Extract from flow

use IO::File;
use Time::localtime;
use Time::Local;

$tm=localtime();
$year = $tm->year+1900;

$dir            = "/dir_with_flow_files/";
$file_out       = "./uplink.txt";

opendir(DIR, $dir) or die "can't opendir $dir: $!";
while (defined($file = readdir(DIR))) {

    if(substr($file,0,6) eq 'ft-v05'){
        @files = (@files,$file);
#       print file, "\n";
    }
}
closedir(DIR);

open(FILE, ">$file_out");

foreach $file (@files) {
#Read flow-data from file
$raw_data=`/usr/local/bin/flow-print -f 5 < $dir$file`;
#Read flow-data from file

chomp($raw_data);
@string=split(/\n/,$raw_data);
$length_array = @string;

for ($i = 2; $i<$length_array; $i++){

( $start_time,$end_time, $src_if, $src_ip, $src_port,
    $dst_if, $dst_ip, $dst_port, $_, $_, $packets, $size) = split(/\s+/,$string[$i]);

$day    =  substr($start_time,2,2);
$month  =  substr($start_time,0,2);

($hour, $min, $sec) = split(":",substr($start_time,5,8));

$dt = join('-', $year, $month, $day);

($hour, $min, $sec) = split(":",substr($start_time,5,8));
$tm = join(':', $hour, $min, $sec);

print FILE $str,"\n";

} #for
} #foreach

close(FILE);


"netflow 5.0 unix_secs, sys_uptime, first,last"
Отправлено sm00th1980 , 05-Май-09 21:01 
+ можно ещё flow-nprint прикрутить для фильтрации по определённым признакам - если у вас поток уж больно большой

"netflow 5.0 unix_secs, sys_uptime, first,last"
Отправлено deadka , 06-Май-09 12:16 
>+ можно ещё flow-nprint прикрутить для фильтрации по определённым признакам - если
>у вас поток уж больно большой

Спасибо, уже разобрался.


"netflow 5.0 unix_secs, sys_uptime, first,last"
Отправлено zloyadmin , 05-Апр-13 12:33 
date -d @1365105615