Доброго времени суток!
Не могу понять, как вычленять время из пакетов протокола 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 тут совсем не при делах :(.
Подскажите в чем я не прав, кто знает, плиз.
я не понимаю к чему такая сложность то...всё по моему гораздо проще можно сделать.flow-print -f 5 < flow_bla_bla > flow.txt
и flow.txt уже скармливаем perl скрипту и первые 2 колонки содержат дату + время.
Будьте внимательны они не содержат ГОД. только месяц+день.
>я не понимаю к чему такая сложность то...всё по моему гораздо проще
>можно сделать.
>
>flow-print -f 5 < flow_bla_bla > flow.txt
>
>и flow.txt уже скармливаем perl скрипту и первые 2 колонки содержат дату
>+ время.
>Будьте внимательны они не содержат ГОД. только месяц+день.я лично беру год из localtime
#!/usr/bin/perl
#version 0.1
#Extract from flowuse 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 filechomp($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
} #foreachclose(FILE);
+ можно ещё flow-nprint прикрутить для фильтрации по определённым признакам - если у вас поток уж больно большой
>+ можно ещё flow-nprint прикрутить для фильтрации по определённым признакам - если
>у вас поток уж больно большойСпасибо, уже разобрался.
date -d @1365105615