Считалка трафика (из log-файла ipfm)
Модератор: Модераторы разделов
Считалка трафика
На многих своих firewall'ах использую считалку трафика ipfm.
Раньше пользовался скриптом Frank Garcia trafcount56-bc (ipfmhostsummary). У него есть свои недостатки.
В рамках написания своего биллинга накатал php-скрипт для суммирования трафика хостов из log-файла ipfm.
Надеюсь кому и пригодиться.
Раньше пользовался скриптом Frank Garcia trafcount56-bc (ipfmhostsummary). У него есть свои недостатки.
В рамках написания своего биллинга накатал php-скрипт для суммирования трафика хостов из log-файла ipfm.
Надеюсь кому и пригодиться.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
- Ленивая Бестолочь
- Бывший модератор
- Сообщения: 2760
- ОС: Debian; gentoo
Re: Считалка трафика
Может быть перенести в "Проекты нашего форума"?
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Re: Считалка трафика
а, кстати, как "правильно" (Ъ) считать трафик, если он идет просто через iptables? ulog? а дальше как? (debian)
Re: Считалка трафика
Возможно и туда перенести. Вопрос к модераторам.
Что значит "правильно"?
Я знаю, что ULOG пишет либо в txt либо в MySQL, а какую уж оттуда информацию выдёргивать - это уж дело каждого.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
- Ленивая Бестолочь
- Бывший модератор
- Сообщения: 2760
- ОС: Debian; gentoo
Re: Считалка трафика
перенес.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Re: Считалка трафика
Насколько мне известно, в основном все пишут сами "морду" для вывода mysql в этом случае, не так?
Правильно - я имею ввиду не через одно место.
Например, когда считают трафик через анализ логов сквида, то говорят, что это не правильный подход. А как тогда правильно считать?
Re: Считалка трафика
Это зависит от того, ЧТО именно Вы хотите посчитать.
Если только HTTP-трафик и все у Вас ходят "в интернет" через прокси SQUID - то тогда и считайте сквид.
Но при этом электронная почта, запросы DNS и много всего другого пройдет мимо "считалки".
Определитесь чего хотите, сформулируйте задачу - а только потом можно будет говорить, что и где считает правильно, а где нет.
Re: Считалка трафика
Goodvin, поддерживаю.
Но если хотите считать форвард трафик через ваш роутер, то конечно нужно браться за netfilter (только он знает сколько через ядро прошло), именно ULOG и выводит эту инфу.
В ближайшее время займусь написанием web-морды к нему.... хотя, вероятно, такие вещи уже есть....
Но если хотите считать форвард трафик через ваш роутер, то конечно нужно браться за netfilter (только он знает сколько через ядро прошло), именно ULOG и выводит эту инфу.
В ближайшее время займусь написанием web-морды к нему.... хотя, вероятно, такие вещи уже есть....
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Re: Считалка трафика
Вот об этом я и говорю. Сквид я привел к примеру. Я именно о форварде говорю. ulog + вэбморда, которую почему-то все пишут сами. А нет чтоли нормального решения? Искал в дебиане - не нашел. Хоть веб, хоть не веб. Хочу иметь нормальное представление о скаченном трафике через iptables. Просто ulog в mysql сохраняет, а как потом выцепить нормально инфу? Неужели только "самому писать морду" ? Или брать чью-то морду и переделывать.
Но тут встал вопрос, может быть есть какое-то "правильное" решение, не через ulog считать, а как-то по-другому, но раз Вы говорите, что ulog, то тогда вопрос: как нормально информацию из mysql брать.
Re: Считалка трафика
Определение "правильное решение" - это достаточно субъективно.
Я вот до сих пор трафик считаю ipfw (он не может по портам считать - это парой основной его недостаток). А с другой стороны на многих роутераз использую старое железо, конфигурация очень скромная, поэтому поднимать связку LAMP возможности нет.
А информацию брать из MySQL - либо самому писать запросы и выводить в WEB, либо: вот наткнулся на эту статейку по ULOG
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
- sspphheerraa
- Сообщения: 1375
- ОС: Gentoo
Re: Считалка трафика
Мне больше понравилась статья Sergo (используется только iptables и bash)
Sspphheerraa
Re: Считалка трафика
А есть что-нибудь, чтобы считала весь трафик, который проходит через сервер?
Re: Считалка трафика
Давно пользуюсь ulogd, все в принципе нормально, но один минус: на каждый пакет создается отдельная запись в БД. Приходится периодически суммировать данные SQL запросами.
В принципе, внутреннюю агрегацию по потокам умеет ulogd 2.x, но он еще не stable. Кто-нибудь его пробовал, стОит ли вообще им пользоваться?
Также, неплохо работает снятие данных со счетчиков iptables. С подсчетом справляется даже первый пень. Могу поделиться кодом.
В принципе, внутреннюю агрегацию по потокам умеет ulogd 2.x, но он еще не stable. Кто-нибудь его пробовал, стОит ли вообще им пользоваться?
Также, неплохо работает снятие данных со счетчиков iptables. С подсчетом справляется даже первый пень. Могу поделиться кодом.
Re: Считалка трафика
Здесь разницы нет, что считать трафик на интерфейсе роутера или на сервере, только в первом случае это форвард, а во втором что вам удобнее: входящий трафик или исходящий..... Так что можно использовать всё тот же мой любимый ipfm.
Конечно поделитесь.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Re: Считалка трафика
Вот, как-то так...
В цепочке создаются правила типа:
[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
Код:
#!/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
Re: Считалка трафика
Ах да, ipfm - тоже вещь классная. Когда я работал у провайдера, на нем был основан биллинг. Обсчитывался канал шириной 12 мегабит (около 600 гигов трафа в месяц). И все это крутилось на третьем пне вместе с перловым скриптом для разбора логов и постгресной базой.
мой вариант считалки, каждое утро шлет мне на мыло отчет о трафе, потребленном с начала месяца (используется для контроля биллинга провайдера, который иногда косячит). В свое время наступил на подводный камень, когда один IP адрес съедал более 2 гигов в день, пришлось приводить все числа к типу float.
мой вариант считалки, каждое утро шлет мне на мыло отчет о трафе, потребленном с начала месяца (используется для контроля биллинга провайдера, который иногда косячит). В свое время наступил на подводный камень, когда один 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']);
?>
Re: Считалка трафика
Что за ipfm? Может имеется ввиду ipfw?
Re: Считалка трафика
Нет здесь ошибки.
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. Раскладывает трафик по каждому хосту вплоть до часа суток... любой "шипко умный" директор поймет, кто и в какое время в Интернете сидел.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.