Считалка трафика (из log-файла ipfm)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Считалка трафика

Сообщение newsrc »

На многих своих firewall'ах использую считалку трафика ipfm.
Раньше пользовался скриптом Frank Garcia trafcount56-bc (ipfmhostsummary). У него есть свои недостатки.
В рамках написания своего биллинга накатал php-скрипт для суммирования трафика хостов из log-файла ipfm.
Надеюсь кому и пригодиться.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:

Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Считалка трафика

Сообщение Ленивая Бестолочь »

Может быть перенести в "Проекты нашего форума"?
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:

pelmen
Сообщения: 1268
ОС: debian

Re: Считалка трафика

Сообщение pelmen »

а, кстати, как "правильно" (Ъ) считать трафик, если он идет просто через iptables? ulog? а дальше как? (debian)
Спасибо сказали:

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Считалка трафика

Сообщение newsrc »

Ленивая Бестолочь писал(а):
09.03.2009 23:02
Может быть перенести в "Проекты нашего форума"?

Возможно и туда перенести. Вопрос к модераторам.

pelmen писал(а):
10.03.2009 00:24
а, кстати, как "правильно" (Ъ) считать трафик, если он идет просто через iptables? ulog? а дальше как? (debian)

Что значит "правильно"?
Я знаю, что ULOG пишет либо в txt либо в MySQL, а какую уж оттуда информацию выдёргивать - это уж дело каждого.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:

Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Считалка трафика

Сообщение Ленивая Бестолочь »

перенес.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:

pelmen
Сообщения: 1268
ОС: debian

Re: Считалка трафика

Сообщение pelmen »

newsrc писал(а):
10.03.2009 10:11
Что значит "правильно"?
Я знаю, что ULOG пишет либо в txt либо в MySQL, а какую уж оттуда информацию выдёргивать - это уж дело каждого.
Насколько мне известно, в основном все пишут сами "морду" для вывода mysql в этом случае, не так?
Правильно - я имею ввиду не через одно место.
Например, когда считают трафик через анализ логов сквида, то говорят, что это не правильный подход. А как тогда правильно считать?
Спасибо сказали:

Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: Считалка трафика

Сообщение Goodvin »

pelmen писал(а):
10.03.2009 12:50
Например, когда считают трафик через анализ логов сквида, то говорят, что это не правильный подход. А как тогда правильно считать?
Это зависит от того, ЧТО именно Вы хотите посчитать.
Если только HTTP-трафик и все у Вас ходят "в интернет" через прокси SQUID - то тогда и считайте сквид.
Но при этом электронная почта, запросы DNS и много всего другого пройдет мимо "считалки".

Определитесь чего хотите, сформулируйте задачу - а только потом можно будет говорить, что и где считает правильно, а где нет.
Спасибо сказали:

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Считалка трафика

Сообщение newsrc »

Goodvin, поддерживаю.
Но если хотите считать форвард трафик через ваш роутер, то конечно нужно браться за netfilter (только он знает сколько через ядро прошло), именно ULOG и выводит эту инфу.

В ближайшее время займусь написанием web-морды к нему.... хотя, вероятно, такие вещи уже есть....
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:

pelmen
Сообщения: 1268
ОС: debian

Re: Считалка трафика

Сообщение pelmen »

newsrc писал(а):
10.03.2009 13:32
В ближайшее время займусь написанием web-морды к нему.... хотя, вероятно, такие вещи уже есть....
Вот об этом я и говорю. Сквид я привел к примеру. Я именно о форварде говорю. ulog + вэбморда, которую почему-то все пишут сами. А нет чтоли нормального решения? Искал в дебиане - не нашел. Хоть веб, хоть не веб. Хочу иметь нормальное представление о скаченном трафике через iptables. Просто ulog в mysql сохраняет, а как потом выцепить нормально инфу? Неужели только "самому писать морду" ? Или брать чью-то морду и переделывать.
Но тут встал вопрос, может быть есть какое-то "правильное" решение, не через ulog считать, а как-то по-другому, но раз Вы говорите, что ulog, то тогда вопрос: как нормально информацию из mysql брать.
Спасибо сказали:

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Считалка трафика

Сообщение newsrc »

pelmen писал(а):
10.03.2009 17:31
Но тут встал вопрос, может быть есть какое-то "правильное" решение, не через ulog считать, а как-то по-другому, но раз Вы говорите, что ulog, то тогда вопрос: как нормально информацию из mysql брать.

Определение "правильное решение" - это достаточно субъективно.
Я вот до сих пор трафик считаю ipfw (он не может по портам считать - это парой основной его недостаток). А с другой стороны на многих роутераз использую старое железо, конфигурация очень скромная, поэтому поднимать связку LAMP возможности нет.

А информацию брать из MySQL - либо самому писать запросы и выводить в WEB, либо: вот наткнулся на эту статейку по ULOG
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:

Аватара пользователя
sspphheerraa
Сообщения: 1375
ОС: Gentoo

Re: Считалка трафика

Сообщение sspphheerraa »

Мне больше понравилась статья Sergo (используется только iptables и bash)
Sspphheerraa
Спасибо сказали:

Аватара пользователя
AgentKey
Сообщения: 2
ОС: ASPLInux

Re: Считалка трафика

Сообщение AgentKey »

А есть что-нибудь, чтобы считала весь трафик, который проходит через сервер?
Спасибо сказали:

Аватара пользователя
ZloyAdmin
Сообщения: 27
ОС: CentOS, Fedora, Gentoo

Re: Считалка трафика

Сообщение ZloyAdmin »

Давно пользуюсь ulogd, все в принципе нормально, но один минус: на каждый пакет создается отдельная запись в БД. Приходится периодически суммировать данные SQL запросами.
В принципе, внутреннюю агрегацию по потокам умеет ulogd 2.x, но он еще не stable. Кто-нибудь его пробовал, стОит ли вообще им пользоваться?

Также, неплохо работает снятие данных со счетчиков iptables. С подсчетом справляется даже первый пень. Могу поделиться кодом.
Спасибо сказали:

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Считалка трафика

Сообщение newsrc »

AgentKey писал(а):
27.03.2009 09:14
А есть что-нибудь, чтобы считала весь трафик, который проходит через сервер?

Здесь разницы нет, что считать трафик на интерфейсе роутера или на сервере, только в первом случае это форвард, а во втором что вам удобнее: входящий трафик или исходящий..... Так что можно использовать всё тот же мой любимый ipfm.

ZloyAdmin писал(а):
27.03.2009 13:27
Также, неплохо работает снятие данных со счетчиков iptables. С подсчетом справляется даже первый пень. Могу поделиться кодом.

Конечно поделитесь.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:

Аватара пользователя
ZloyAdmin
Сообщения: 27
ОС: CentOS, Fedora, Gentoo

Re: Считалка трафика

Сообщение ZloyAdmin »

Вот, как-то так...

Код:

#!/usr/bin/perl use DBI; use DBD::Pg; #-------------------------------------------------------------- # settings $pg_host="localhost"; $pg_db="traffic"; $pg_user="billing"; $pg_pass="password"; #-------------------------------------------------------------- sub load_chain { my ($chain, $type) = @_; #temporary array for traffic # $logins[i][0] - ip addr # $logins[i][1] - traf in # $logins[i][2] - traf out my @logins = (); #get list of IP for accounting $query = "SELECT ip FROM logins WHERE ip_type=$type"; $sth = $dbh->prepare($query); $rv = $sth->execute(); if (!defined $rv) { print "Error in query '$query' : " . $dbh->errstr . "\n"; exit(0); } $i = 0; while (@array = $sth->fetchrow_array()) { $logins[$i][0] = $array[0]; $logins[$i][1] = 0; $logins[$i][2] = 0; $i++; } $sth->finish(); #call iptables to get counters open(CMD,"/sbin/iptables -L $chain -v -n -x -Z |") or die("Can not execute iptables!"); while ($line = <CMD>) { ($dummy,$pkts,$bytes,$target,$prot,$opt,$ifin,$ifout,$src,$dst) = split /\s+/, $line; if ($target eq "ACCEPT") { #check format of src if ($src =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/) { #all ok, address with mask } elsif ($src =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) { #address without mask $src .= "/32"; } else { #invalid addr next; } #check format of dst if ($dst =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/) { #all ok, address with mask } elsif ($dst =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) { #address without mask $dst .= "/32"; } else { #invalid addr next; } # put traffic to array for ($i=0;$i<=$#logins;$i++) { if ($dst eq $logins[$i][0]) { $logins[$i][1] = $bytes; last; } elsif ($src eq $logins[$i][0]) { $logins[$i][2] = $bytes; last; } } } } close CMD; #insert data into database for ($i=0;$i<=$#logins;$i++) { if (($logins[$i][1] > 0) or ($logins[$i][2] > 0)) { $query = "INSERT INTO traffic (datetime,ip,traf_in,traf_out) VALUES ('$datetime','$logins[$i][0]',$logins[$i][1],$logins[$i][2])"; $rv = $dbh->do($query); if (!defined $rv) { print "Error in query '$query' : " . $dbh->errstr . "\n"; } } } } #-------------------------------------------------------------- #Connect to database server $dbh = DBI->connect("dbi:Pg:dbname=$pg_db;host=$pg_host","$pg_user","$pg_pass", {PrintError => 0}); if ($DBI::err != 0) { print $DBI::errstr . "\n"; exit($DBI::err); } #Save current date and time ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; $datetime = sprintf("%04d-%02d-%02d %02d:%02d:%02d",($year+1900),($mon+1),$mday,$hour,$min,$sec); #Load user's traffic load_chain("FORWARD",1); #Load channel's traffic #load_chain("OPENVPN",2); $dbh->disconnect();


В цепочке создаются правила типа:
[0:0] -A FORWARD -s 10.10.130.1 -j ACCEPT
[0:0] -A FORWARD -d 10.10.130.1 -j ACCEPT
[0:0] -A FORWARD -s 10.10.130.2 -j ACCEPT
[0:0] -A FORWARD -d 10.10.130.2 -j ACCEPT
Спасибо сказали:

Аватара пользователя
ZloyAdmin
Сообщения: 27
ОС: CentOS, Fedora, Gentoo

Re: Считалка трафика

Сообщение ZloyAdmin »

Ах да, ipfm - тоже вещь классная. Когда я работал у провайдера, на нем был основан биллинг. Обсчитывался канал шириной 12 мегабит (около 600 гигов трафа в месяц). И все это крутилось на третьем пне вместе с перловым скриптом для разбора логов и постгресной базой.

мой вариант считалки, каждое утро шлет мне на мыло отчет о трафе, потребленном с начала месяца (используется для контроля биллинга провайдера, который иногда косячит). В свое время наступил на подводный камень, когда один IP адрес съедал более 2 гигов в день, пришлось приводить все числа к типу float.

Код:

#!/opt/php/bin/php <? error_reporting(~E_NOTICE & ~E_STRICT); $logdir="/mnt/sniffer/ipfm/rtk"; $pattern='/^'.date("Y").'\-'.date("m").'\-/'; $mas=array(); $d=dir($logdir); while (false !== ($entry = $d->read())) { if (preg_match($pattern,$entry)) { $filename=$logdir."/".$entry; if (is_file($filename)) { $lines=file($filename,FILE_IGNORE_NEW_LINES); foreach($lines as $line) { if (!trim($line)) continue; if (strpos($line,"#") !== false) continue; $parts = preg_split('/\s+/',$line); if (count($parts) == 4) { $mas[$parts[0]]['in'] += (float)$parts[1]; $mas[$parts[0]]['out'] += (float)$parts[2]; $mas[$parts[0]]['total'] += (float)$parts[3]; } } } } } $d->close(); ksort($mas); echo "IP traffic from ".date("Y-m")."-01 to ".date("Y-m-d")."\n\n"; echo "IP address\t\tBytes in\t\tBytes out\t\tBytes total\n"; foreach($mas as $key=>$value) { printf("%-15s\t\t%-15s\t\t%-15s\t\t%-15s\n",$key,$value['in'],$value['out'],$value['total']); $total['in']+=$value['in']; $total['out']+=$value['out']; $total['total']+=$value['total']; } echo "================\n"; printf("%-15s\t\t%-15s\t\t%-15s\t\t%-15s\n","Total:",$total['in'],$total['out'],$total['total']); ?>
Спасибо сказали:

neolive
Сообщения: 132
ОС: Debian 4.0 etch GNU/Linux

Re: Считалка трафика

Сообщение neolive »

Что за ipfm? Может имеется ввиду ipfw?
Спасибо сказали:

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Считалка трафика

Сообщение newsrc »

neolive писал(а):
05.04.2009 16:31
Что за ipfm? Может имеется ввиду ipfw?

Нет здесь ошибки.
IP Flow Meter is a bandwidth analysis tool, that measures how much
bandwidth specified hosts use on their Internet link. It needs
libpcap to work.

ZloyAdmin, с float тоже столкнулся..... и спасибо за скрипт.
Если кому интересно, то выложу web-показывалку для ipfm. Раскладывает трафик по каждому хосту вплоть до часа суток... любой "шипко умный" директор поймет, кто и в какое время в Интернете сидел.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали: