LINUX.ORG.RU

подсчет трафика, посоветуйте


0

0

Трафик по браузерам у меня через сквид завернут, считает все это дело лайтсквид. Отчетики вполне приличные, нравятся. Теперь вот беда чем оставшийся трафик посчитать, который по мимо сквида проходит. Почта у хостеров находится, пару банк клиентов и скайп. Все это через iptables на соответствующие порты прописано. Настроил nitraf, есть такая считалка. Да вот не впечатляет. Как-то скудненько у нее с отчетами. Пошарился в инете, а там только платные. Да и в основном для провайдеров.

Посоветуйте люди добрые какуюнидь грамотную считалку плиз. Нужно чтоб детализированно все считалось. Типа кто куда зачем по какому порту и во сколько.

ну а сменя пиво разумеется.


nitraf... Есть такая разработка местного программера :). Кажется, его (nitraf) ругали за что, что это ещё одна никому не нужная считалка трафика :). Так что видимо их целые кучи, этих считалок :)

NightFish
()
Ответ на: комментарий от NightFish

То что их куча это точно. Тьма просто. Замороченые все какието. Много лишнего. В основном на провайдеров расчитаны.

dyahan
() автор топика

с ipcad я такое делал, сейчас попробую найти тот скрипт

LowLevel
()

короче ipcad-a в убунте почему то нет, выкладываю так как есть, без проверки. сам ипкад надо запускать с ключами (уже не помню какими) чтоб вёл статистику по портам

бэкэнд

#!/usr/bin/php
<?
//      ipcad2mysql.php

//      тупо засовывает данные с ipcad в базу
//      этот файл нужно запускать cron-ом как можно чаще

$rsh="/usr/kerberos/bin/rsh";
$rsh_host="
127.0.0.1";
$rsh_user="root";
$mysql_host="127.0.0.1";
$mysql_user="root";
$mysql_passwd="";
$mysql_db="trafstat";

$logfile="/tmp/ipcad2mysql.log";

function logerr($s)
{
global $logfile;
$s="\n\n==============".date("d/m/Y H:i:s")."==============\n".$s;
$fid=fopen($logfile, "a+b"); 
flock($fid, LOCK_EX);
fwrite($fid, $s);
flock($fid, LOCK_UN);
fflush($fid);
fclose($fid);
};

$dbid=mysql_connect($mysql_host, $mysql_user, $mysql_passwd)
 or log(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>"); 
mysql_select_db($mysql_db) or log(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>");

$blnks="[[:blank:]]+"; $ip_ptrn="[[:digit:]\\.]+"; $dig="[[:digit:]]+"; 
$stat_ptrn="$blnks($ip_ptrn)$blnks($ip_ptrn)$blnks($dig)$blnks($dig)$blnks($dig
)$blnks($dig)$blnks($dig)";

exec("$rsh -l $rsh_user $rsh_host show ip accounting", $statarr);
exec("$rsh -l $rsh_user $rsh_host clear ip accounting;"); 
$cdate=mktime();

foreach($statarr as $v)
 {
 if(ereg($stat_ptrn, $v, $regs)) 
 $req="INSERT INTO `requests` VALUES (0, '$regs[1]', '$regs[2]', $regs[3], $regs[4], $regs[5], $regs[6], $regs[7], $cdate)"; 
 mysql_query($req, $dbid) or log(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>");
 };
?>
===============================================================================
= 


LowLevel
()
Ответ на: комментарий от LowLevel

серверная часть - фронтенд

#!/usr/bin/php

<?
$mysql_host="127.0.0.1";
$mysql_user="root";
$mysql_passwd=""; 
$mysql_db="trafstat";
$localnet_prefix="192.168.1";
$max_per_day=10*1024*1024;

$dbid=mysql_connect($mysql_host, $mysql_user, $mysql_passwd)
 or die(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>"); 
mysql_select_db($mysql_db) or die(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>");

if($show_all || $show_sign) 
 {
 $end_period=mktime(23, 59, 59, $mnthform, $dayform, date("Y")); 
 $start_period=$end_period-($prdform*24*3600);
 } else {
 $start_period=mktime()-3600*7*31;
 $end_period=mktime();
 };

$max=$max_per_day*($end_period-$start_period)/(24*3600);
$max_sign=floor($max/1024); // values less than that, do not shows 


// get IP list
$res=mysql_query("SELECT DISTINCT `dst` FROM `requests` WHERE `dst` LIKE '$localnet_prefix%' 
AND `date`>$start_period AND `date`<$end_period");
if($res) while($arr=mysql_fetch_assoc($res)) $ip_arr[]=$arr[dst]; 

// get external PORT list per IPs
foreach($ip_arr as $ip) 
 {
 // IN
 $res=mysql_query("SELECT DISTINCT `srcport` FROM `requests` WHERE `dst`='$ip' AND (`src` NOT LIKE '$localnet_prefix%' 
OR `srcport`=8118) AND `date`>$start_period AND `date`<$end_period");
 if($res) while($arr=mysql_fetch_assoc($res)) $port_arr[$ip][$arr[srcport]]=1;
 // OUT
 $res=mysql_query("SELECT DISTINCT `dstport` FROM `requests` WHERE `src`='$ip' AND (`dst` NOT LIKE '$localnet_prefix%' 
OR `dstport`=8118) AND `date`>$start_period AND `date`<$end_period");
 if($res) while($arr=mysql_fetch_assoc($res)) $port_arr[$ip][$arr[dstport]]=1;
 };

// add signification condition
 foreach($port_arr as $ip=>$v)
 foreach($v as $port=>$v1)
 {
 // IN
 $res=mysql_query("SELECT SUM(`size`) FROM `requests` WHERE `dst`='$ip' AND `srcport`=$port
AND `date`>$start_period AND `date`<$end_period") 
 or die(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>");
 $traffic[$ip][$port][in]=mysql_result($res, 0);
 // OUT
 $res=mysql_query("SELECT SUM(`size`) FROM `requests` WHERE `src`='$ip' AND `dstport`=$port 
AND `date`>$start_period AND `date`<$end_period")
 or die(mysql_errno().": ".mysql_error()." in line ".__LINE__." of ".__FILE__."<BR>");
 $traffic[$ip][$port][out]=mysql_result($res, 0); 
 };


// get human-redable port
function get_hr_port($port)
{
$port=$port." (".getservbyport($port, "tcp").")";
return($port);
};


// get human-redable size 
function get_hr_size($size)
{
if(!$size) return;
if($size<=(1024*1024)) $size=sprintf("%02.2f", ($size/1024))." KiB";
if($size>(1024*1024)) $size=sprintf("%02.3f", ($size/(1024*1024)))." MiB"; 
return($size);
};



// get nice traffic table
function traftable($tr_arr)
{
global $max, $max_sign, $show_sign;
$str.="<table bgcolor='#f9f9f9'>\n";
foreach($tr_arr as $ip=>$ports) 
 {
 $str.="<tr><td colspan=3 bgcolor='#88aaff' style='background-image:url(bluebar.png)' height=30px>$ip ".
 gethostbyaddr($ip)."</td></tr>\n";
 foreach($ports as $port=>$dir) 
 {
 $overflow=0;
 if($show_sign) if($dir[in]<$max_sign && $dir[out]<$max_sign) continue;
 if($dir[in]<=$max) $inpc=floor((1-$dir[in]/$max)*350); else {$inpc=0; $overflow=1;};
 if($dir[out]<=$max) $outpc=floor(($dir[out]/$max)*350)-500; else {$outpc=-150; $overflow=1;}; 
 $str.="<tr><td width=350px style='text-align:right; background-image:url(redbar.png); background-repeat:no-repeat; background-position: ${inpc}px 0'>".
 get_hr_size($dir[in])."</td><td style='text-align:center' bgcolor='".($overflow?"red":"#d0d0d0")."'><nobr>". 
 get_hr_port($port).
 "</nobr></td><td width=350px style='background-image:url(greenbar.png); background-repeat:no-repeat; background-position: ${outpc}px 0'>".
 get_hr_size($dir[out])."</td></tr>\n"; 
 };
 };
$str.="</table>\n";
return($str);
};

LowLevel
()
Ответ на: комментарий от LowLevel

function range_select()
{
for($i=1; $i<=31; $i++) $days.="<td class=btn width=20px onclick=\"getElementById('dayform').value=$i\">$i</td>\n"; 

for($i=1; $i<=12; $i++) $mnths.="<td class=btn onclick=\"getElementById('mnthform').value=$i\">".$i."</td>\n";

$str="
<form action='$SCRIPT_NAME'>
 <table>
<tr><td>
Day
</td><td>
 <table width=100%><tr>
 $days
 </tr></table>
</td><td>
<input type=text id='dayform' size=4 name=dayform value=".date("d")."> 
</td></tr>
<tr><td>
Month
</td><td>
 <table width=100%><tr>
 $mnths
 </tr></table>
</td><td>
<input type=text id='mnthform' size=4 name=mnthform value=".date("m")." value=7> 
</td></tr><tr><td>
Period
</td><td>
 <table width=100%><tr>
 <td class=btn onclick=\"getElementById('prdform').value=1\">1day</td> 
 <td class=btn onclick=\"getElementById('prdform').value=2\">2days</td>
 <td class=btn onclick=\"getElementById('prdform').value=3\">3days</td>
 <td class=btn onclick=\"getElementById('prdform').value=4\">4days</td> 
 <td class=btn onclick=\"getElementById('prdform').value=5\">5days</td>
 <td class=btn onclick=\"getElementById('prdform').value=6\">6days</td>
 <td class=btn onclick=\"getElementById('prdform').value=7\">1week</td> 
 <td class=btn onclick=\"getElementById('prdform').value=14\">2weeks</td>
 <td class=btn onclick=\"getElementById('prdform').value=21\">3weeks</td>
 <td class=btn onclick=\"getElementById('prdform').value=31\">1month</td> 
 <td class=btn onclick=\"getElementById('prdform').value=61\">2months</td>
 </tr></table>
</td><td>
<input type=text id='prdform' size=4 name=prdform value=7> 
</td></tr>
</table>
<input type=submit value='Show all' name=show_all width=100% class=btn>
<input type=submit value='Show significant' name=show_sign width=100% class=btn>
</form> 
";
return($str);
};



$traftable=traftable($traffic);
$range_select=range_select();
?>


<html>
<head>
<title>Traffic</title>
<style>
 body {
font-family: fixedsys, console8x16;
}

.btn {
background-color:orange;
border-style:solid;
border-color:red;
border-width:1px;
text-align:center;
}

</style>
</head> 
<body>
<?=$range_select;?>
Statistics for period: <?=date("H:i:s d.m.Y", $start_period+1);?> - <?=date("H:i:s d.m.Y", $end_period);?><br>
Max: <?=get_hr_size($max);?><br> 
Max Sign: <?=get_hr_size($max_sign);?><br>
<?=$traftable;?>
</body>
</html>







===============================================================================
=
шаблон базы - самоочевидно.

# version 
2.5.7
# http://www.phpmyadmin.net
#
# Хост: localhost
# Время создания: Сен 06 2006 г., 13:37
# Версия сервера: 3.23.58
# Версия PHP: 4.3.9
# 
# БД : `trafstat`

# 

# --------------------------------------------------------

#
# Структура таблицы `requests`
#

CREATE TABLE `requests` (
 `id` int(11) NOT NULL auto_increment,
 `src` varchar(15) NOT NULL default '', 
 `dst` varchar(15) NOT NULL default '',
 `packetsnum` int(11) NOT NULL default '0',
 `size` int(11) NOT NULL default '0',
 `srcport` int(11) NOT NULL default '0',
 `dstport` int(11) NOT NULL default '0', 
 `proto` tinyint(4) NOT NULL default '0',
 `date` int(11) NOT NULL default '0',
 PRIMARY KEY (`id`),
 KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=43035 ;

LowLevel
()
Ответ на: комментарий от LowLevel

если сумеешь привести это в юзабельное состояние, отпишись

LowLevel
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.