Краткая заметка о том как снять с Mikrotik статистику по netflow и передать ее UTM4. Чем не устроил штатный netup_netflow? Во первых - несколько избыточная для меня информация, мне не нужна детализация по портам и в следствии чего чрезмерно раздутая база, во вторых - большая нагрузка на mysql, и в третьих, при перезагрузке mysql, netup_netflow просто падал. В итоге пришел к варианту использования штатного flow-tools. Загрузка процессора (Intel(R) Xeon(R) CPU E3110 @ 3.00GHz) снизилась втрое, размер таблицы traffic почти в пять раз. Настраиваем Mikrotik:
Где 10.0.0.2:3002 - адрес и порт машины куда мы будем отправлять статистику, interfaces=all - интерфейсы с которых мы будем снимать статистику, в данном случае со всех. Собственно это все настройки которые необходимы для Mikrotik Переходим к Debian: Используется последняя стабильная ветка Debian 5.0 "Lenny" Устанавливаем flow-tools
Настраиваем
где /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
Проверяем:
либо
Переходим к скрипту Сразу оговорюсь идея и сам скрипт не мои. Я его подсмотрел на http://www.netup.ru/phpbb/viewtopic.php?p=54340 автор ratelcom , надеюсь автор не обидится. Я внес только незначительные изменения
#!/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;
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии