Debian, Mikrotik, flow-tools и UTM4

Краткая заметка о том как снять с Mikrotik статистику по netflow и передать ее UTM4. Чем не устроил штатный netup_netflow? Во первых - несколько избыточная для меня информация, мне не нужна детализация по портам и в следствии чего чрезмерно раздутая база, во вторых - большая нагрузка на mysql, и в третьих, при перезагрузке mysql, netup_netflow просто падал. В итоге пришел к варианту использования штатного flow-tools. Загрузка процессора (Intel(R) Xeon(R) CPU E3110 @ 3.00GHz) снизилась втрое, размер таблицы traffic почти в пять раз. Настраиваем Mikrotik:

[admin@MikroTik] > /ip traffic-flow export /ip traffic-flow set active-flow-timeout=15m cache-entries=4k enabled=yes inactive-flow-timeout=5s interfaces=all /ip traffic-flow target add address=10.0.0.2:3002 disabled=no v9-template-refresh=20 v9-template-timeout=30m version=5

Где 10.0.0.2:3002 - адрес и порт машины куда мы будем отправлять статистику, interfaces=all - интерфейсы с которых мы будем снимать статистику, в данном случае со всех. Собственно это все настройки которые необходимы для Mikrotik Переходим к Debian: Используется последняя стабильная ветка Debian 5.0 "Lenny" Устанавливаем flow-tools

aptitude install flow-tools

Настраиваем

# vi /etc/flow-tools/flow-capture.conf -w /var/flow/route -R /usr/scripts/utm/netflow.pl -n 287 -N 3 0/10.0.0.1/3002

где /var/flow/route - рабочая директория куда будут складываться данные передаваемые Mikrotik; -R /usr/scripts/utm/netflow.pl - скрипт который будет стартовать после ротации данных; -n 287 - количество ротаций в сутки (в данном случае каждые 5 минут будет создаваться новый файл в /var/flow/route; -N 3 - порядок расположения файлов, 3 соответствует виду - YYYY/YYYY-MM/YYYY-MM-DD/flow-file; 0/10.0.0.1/3002 - собственный адрес (0 - все адреса) /адрес с которого получаем информацию/порт Рестартуем flow-capture

# /etc/init.d/flow-capture restart

Проверяем:

# netstat -pln|grep flow udp 0 0 0.0.0.0:3002 0.0.0.0:* 21950/flow-capture

либо

#lsof -i|grep flow flow-capt 21950 root 1u IPv4 22578545 UDP *:3002

Переходим к скрипту Сразу оговорюсь идея и сам скрипт не мои. Я его подсмотрел на http://www.netup.ru/phpbb/viewtopic.php?p=54340 автор ratelcom , надеюсь автор не обидится. Я внес только незначительные изменения

# vi /usr/scripts/utm/netflow.pl
#!/usr/bin/perl
use DBI;
require DBD::mysql;

$dbuser="login";
$dbpass="password";
$database="UTM";
$dbh=DBI->connect("DBI:mysql:$database","$dbuser","$dbpass") || die "Error\n";
$sth= $dbh->prepare("SELECT id,ip FROM users"); 
$sth->execute(); 
while (my $idip = $sth->fetchrow_hashref()) { 
$id = $idip->{'id'}; 
$ip = $idip->{'ip'}; 
@list=split(/\s+/,$ip); 
foreach $arg (@list) { 
$hash{ $arg } = $id; 
} 
}; 

$sth->finish(); 
my $command = "flow-cat $ARGV[0] | flow-stat -f10 | grep -v '#' 2>/dev/null |"; 
open IN, $command; 
foreach (<IN>){ 
@list=split(/\s+/,$_); 
if (($hash{@list[0]} > 0)||($hash{@list[1]} > 0)){
$dbh->do("INSERT INTO traffic_netflow (srcaddr,dstaddr, uid, dPkts, dOctets) VALUES (inet_aton('@list[0]'), 
inet_aton('@list[1]'),'$uid','@list[4]','@list[3]')"); 
}; 
} 
close IN;