Исходный данные:
| (84.56.32.7)eth1 | внешний интерфейс |
| (192.168.50.3)eth0 | внутренний интерфейс |
Задача:
Надо посчитать входящий и исходящий по eth1 и входящий трафик по eth0( порт 3138, 110 и nat)+прикрутить web морду
Настраиваем ipcad:
capture-ports enable; buffers = 128k; interface eth1; interface eth0; aggregate 192.168.50.0/24 strip32; rsh enable at 127.0.0.1; rsh root@127.0.0.1 admin; rsh root@127.0.0.1 backup; rsh root@127.0.0.1; rsh 127.0.0.1 view-only; rsh ttl = 3; rsh timeout = 30; dumpfile = /var/log/ipcad/ipcad.dump; pidfile = /var/run/ipcad.pid; memory_limit = 80m;
Создадим базу допуститм spacedust
[root@spacedust ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1000 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database spacedust; Query OK, 1 row affected (0.03 sec)
mysql> show databases; +-----------+ | Database | +-----------+ | mysql | | spacedust | | test | +-----------+ 3 rows in set (0.00 sec)
mysql>
Теперь создадим таблицы для внешнего и внутреннего интерфейса
[root@spacedust ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1001 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use spacedust; Database changed mysql> create table eth1( id int(11) NOT NULL AUTO_increment,date DATE,ip VARCHAR(90) not null,output double(90,4) not null,input double(90,4) not null, primary key(id)); Query OK, 0 rows affected (0.06 sec)
mysql> create table eth0( id int(11) NOT NULL AUTO_increment,date DATE,ip VARCHAR(90) not null,sendmail double(90,2) not null,squid double(90,2) not null,nat double(90,2) not null, primary key(id)); Query OK, 0 rows affected (0.02 sec)
mysql> show tables; +---------------------+ | Tables_in_spacedust | +---------------------+ | eth0 | | eth1 +---------------------+ 2 rows in set (0.02 sec)
mysql>
Создаем в каталоге /var/www/html папку traf_inza в нее еще папку index
Считаем входящий и исходящий по eth1 при этом обрезаем под сеть провайдера
в силу того что она бесплатная, у меня она такая(84.56.).Создаем скрипт
traf_eth1 со следующим содержанием:
for i in $(cat /var/www/html/traf_inza/eth1); do
echo $i
/usr/bin/rsh localhost show ip accounting | grep -w $i |awk '{{if($2!~/84.56./ && $2!~/192.168./ && $8=="eth1"){s+=$4}} {if($1!~/84.56./ && $1!~/192.168./ && $8=="eth1"){s1+=$4}}} END {printf "%9.4f\n %9.4f\n ",((s/1024)/1024),((s1/1024)/1024)}'
done
Считаем входящий по eth0 (порты 110,3128,nat) при этом обрезаем весь
весь не нужный сетевой трафик, а так же трафик провайдера. Создаем скрипт traf_eth0 со следующим содержанием:
for i in $(cat /var/www/html/traf_inza/eth0); do
echo $i
/usr/bin/rsh localhost show ip accounting | grep -w $i |awk '{{if($1=="192.168.50.3" && $8=="eth0" && $5=="110"){s+=$4}} {if($1=="192.168.50.3" && $8=="eth0" && $5=="3128"){s1+=$4}} {if($1!~/192.168./ && $8=="eth0" && $2!~/(192.168.50.[3|255])$)/ && $1!~/84.56./){s2+=$4}}} END {printf "%9.4f\n %9.4f\n %9.4f\n ",((s/1024)/1024),((s1/1024)/1024),((s2/1024)/1024)}'
done
Поесню немного что значят эти порты
index_eth0.php - просмотр в реальном времени интерфейса eth0
<?php
exec("/var/www/html/traf_inza/traf_eth0",$traf_inza);
set_time_limit(330);
$j=0;
$sum1=0;
$sum2=0;
$sum3=0;
echo "<table border=1>\n";
echo "<tr><td><FONT SIZE=3 COLOR=green><b>IP</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>SENDMAIL[MB]</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>SQUID[MB]</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>NAT[MB]</front></b></td></tr>\n";
for($i=0;$i<(count($traf_inza)/4)-1;$i++)
{
if($traf_inza[$i+$j+1]>9)
{$color1=red;} else {$color1=black;}
if($traf_inza[$i+$j+2]>9)
{$color2=red;} else {$color2=black;}
if($traf_inza[$i+$j+3]>9)
{$color3=red;} else {$color3=black;}
$sum1+=$traf_inza[$i+$j+1];
$sum2+=$traf_inza[$i+$j+2];
$sum3+=$traf_inza[$i+$j+3];
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>%s</b></front></td>
</td><td><FONT SIZE=3 COLOR=$color1><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=$color2><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=$color3><b>%9.2f</b></font></td></tr>\n",
$traf_inza[$i+$j],$traf_inza[$i+$j+1],$traf_inza[$i+$j+2],$traf_inza[$i+$j+3]);
$j+=3;
}
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>SPACEDUST.RU</b></front></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.2f</b></font></td>
</tr>\n",$sum1,$sum2,$sum3);
echo "</table>\n";
?>
index_eth1.php - просмотр в реальном времени интерфейса eth1
<?php
exec("/var/www/html/traf_inza/traf_eth1",$traf_inza);
set_time_limit(330);
$j=0;
$sum1=0;
$sum2=0;
echo "<table border=1>\n";
echo "<tr><td><FONT SIZE=3 COLOR=green><b>IP</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>OUTPUT[MB]</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>INPUT[MB]</front></b></td></tr>\n";
for($i=0;$i<(count($traf_inza)/3)-1;$i++)
{
if($traf_inza[$i+$j+1]>280)
{$color1=red;} else {$color1=black;}
if($traf_inza[$i+$j+2]>280)
{$color2=red;} else {$color2=black;}
$sum1+=$traf_inza[$i+$j+1];
$sum2+=$traf_inza[$i+$j+2];
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>%s</b></front></td>
</td><td><FONT SIZE=3 COLOR=$color1><b>%9.4f</b></font></td>
</td><td><FONT SIZE=3 COLOR=$color2><b>%9.4f</b></font></td>
</tr>\n",$traf_inza[$i+$j],$traf_inza[$i+$j+1],$traf_inza[$i+$j+2]);
$j+=2;
}
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>SPACEDUST.RU</b></front></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.4f</b></font></td>
</td><FONT SIZE=3 COLOR=red><b>%9.4f</b></font></td>
</tr>\n",$sum1,$sum2);
echo "</table>\n";
?>
index_mysql.php - это скрипт который будет запускаться каждый день и сбрасывать статистику в базу spacedust(mysql) и обнуляет ее, время задает в cron, рекомендую поставить время 23:50
/var/www/html/traf_inza/index/index_mysql.php
<?php
exec("/var/www/html/traf_inza/traf_eth0",$traf_inza);
exec("/var/www/html/traf_inza/traf_eth1",$traf_inza1);
set_time_limit(330);
$j=0;
$sum1=0;
$sum2=0;
$sum3=0;
$day=date('d');
$month=date('m');
$year=date('y');
$date="20".$year."-".$month."-".$day;
$link = mysql_connect("localhost", "root", "") or die("no connect");
mysql_select_db("spacedust", $link) or die("no vibor");
for($i=0;$i<(count($traf_inza)/4)-1;$i++)
{
$traf_ip=trim($traf_inza[$i+$j]);
$traf_mail=trim($traf_inza[$i+$j+1]);
$traf_squid=trim($traf_inza[$i+$j+2]);
$traf_nat=trim($traf_inza[$i+$j+3]);
$sum1+=$traf_inza[$i+$j+1];
$sum2+=$traf_inza[$i+$j+2];
$sum3+=$traf_inza[$i+$j+3];
$query="INSERT INTO eth0 (date,ip,sendmail,squid,nat) VALUES ('$date','$traf_ip','$traf_mail','$traf_squid','$traf_nat')";
$result = mysql_query($query,$link);
$j+=3;
}
$query="INSERT INTO eth0 (date,ip,sendmail,squid,nat) VALUES ('$date','SPACEDUST','$sum1','$sum2','$sum3')";
$result = mysql_query($query,$link);
$j=0;
$sum1=0;
$sum2=0;
for($i=0;$i<(count($traf_inza1)/3)-1;$i++)
{
$traf_ip=trim($traf_inza1[$i+$j]);
$traf_out=trim($traf_inza1[$i+$j+1]);
$traf_in=trim($traf_inza1[$i+$j+2]);
$sum1+=$traf_inza1[$i+$j+1];
$sum2+=$traf_inza1[$i+$j+2];
$query="INSERT INTO eth1 (date,ip,output,input) VALUES ('$date','$traf_ip','$traf_out','$traf_in')";
$result = mysql_query($query,$link);
$j+=2;}
$query="INSERT INTO eth1 (date,ip,output,input) VALUES ('$date','SPACEDUST','$sum1','$sum2')";
$result = mysql_query($query,$link);
mysql_close($link);
exec("/usr/bin/rsh localhost clear ip accounting");
?>
index_mysql2.php - это скрипт который выдирает статистику из базы spacedust(mysql)
/var/www/html/traf_inza/index/index_mysql2.php
<?php
if(isset($_POST['month_begin']) && isset($_POST['year_begin']) && isset($_POST['day_begin']) && isset($_POST['year_end']) && isset($_POST['month_end']) && isset($_POST['day_end']))
{
$date_d1=$_POST['day_begin'];
$date_m1=$_POST['month_begin'];
$date_y1=$_POST['year_begin'];
$date_d2=$_POST['day_end'];
$date_m2=$_POST['month_end'];
$date_y2=$_POST['year_end'];
$date_begin=$date_y1."-".$date_m1."-".$date_d1;
$date_end=$date_y2."-".$date_m2."-".$date_d2;
echo "<HTML><TITLE> ipcad.spacedust.ru $date_begin - $date_end </TITLE></HTML>";
echo "<table border=1>\n";
echo "<tr><td><FONT SIZE=3 COLOR=green><b>IP</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>SENDMAIL[MB]</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>SQUID[MB]</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>NAT[MB]</front></b></td></tr>\n";
$link = mysql_connect("localhost", "root", "") or die("no connect");
mysql_select_db("spacedust", $link) or die("no vibor");
$ip_array=file("/var/www/html/traf_inza/eth0");
for($i=0;$i<count($ip_array);$i++)
{
$ip=trim($ip_array[$i]);
$query="select * from eth0 where ip='$ip' && date>='$date_begin' && date<='$date_end';";
$result = mysql_query($query,$link);
$sum_mail=0;
$sum_squid=0;
$sum_nat=0;
while ($traf=mysql_fetch_row($result))
{
$sum_mail+=$traf[3];
$sum_squid+=$traf[4];
$sum_nat+=$traf[5];
}
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>%s</b></front></td>
</td><td><FONT SIZE=3 COLOR=black><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=black><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=black><b>%9.2f</b></font></td></tr>\n",
$ip,$sum_mail,$sum_squid,$sum_nat);
}
$query="select * from eth0 where ip='SPACEDUST' && date>='$date_begin' && date<='$date_end';";
$result = mysql_query($query,$link);
$sum_mail=0;
$sum_squid=0;
$sum_nat=0;
while ($traf=mysql_fetch_row($result))
{
$sum_mail+=$traf[3];
$sum_squid+=$traf[4];
$sum_nat+=$traf[5];
}
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>SPACEDUST.RU</b></front></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.2f</b></font></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.2f</b></font></td></tr>\n",
$sum_mail,$sum_squid,$sum_nat);
echo "</table>";
echo "<table border=1>\n";
echo "<tr><td><FONT SIZE=3 COLOR=green><b>IP</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>OUTPUT[MB]</front></b></td>
<td><FONT SIZE=3 COLOR=green><b>INPUT[MB]</front></b></td></tr>\n";
$ip_array=file("/var/www/html/traf_inza/eth1");
for($i=0;$i<count($ip_array);$i++)
{
$ip=trim($ip_array[$i]);
$query="select * from eth1 where ip='$ip' && date>='$date_begin' && date<='$date_end';";
$result = mysql_query($query,$link);
$sum_out=0;
$sum_in=0;
while ($traf=mysql_fetch_row($result))
{
$sum_out+=$traf[3];
$sum_in+=$traf[4];
}
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>%s</b></front></td>
</td><td><FONT SIZE=3 COLOR=black><b>%9.4f</b></font></td>
</td><td><FONT SIZE=3 COLOR=black><b>%9.4f</b></font></td>
</tr>\n",$ip,$sum_out,$sum_in);
}
$query="select * from eth1 where ip='SPACEDUST' && date>='$date_begin' && date<='$date_end';";
$result = mysql_query($query,$link);
$sum_out=0;
$sum_in=0;
while ($traf=mysql_fetch_row($result))
{
$sum_out+=$traf[3];
$sum_in+=$traf[4];
}
printf("<tr><td><FONT SIZE=3 COLOR=blue><b>SPACEDUST.RU</b></front></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.4f</b></font></td>
</td><td><FONT SIZE=3 COLOR=red><b>%9.4f</b></font></td>
</tr>\n",$sum_out,$sum_in);
echo "</table>";
mysql_close($link);
}
?>
index.php - это наш головной фаил для web морды
/var/www/html/traf_inza/index/index.php
<HTML>
<TITLE> spacedust.trafice.ipcad.ru</TITLE>
<BODY>
<FORM method="POST" action="index_mysql2.php">
<SELECT name="day_begin">
<OPTION VALUE="01">01
<OPTION VALUE="02">02
<OPTION VALUE="03">03
<OPTION VALUE="04">04
<OPTION VALUE="05">05
<OPTION VALUE="06">06
<OPTION VALUE="07">07
<OPTION VALUE="08">08
<OPTION VALUE="09">09
<OPTION VALUE="10">10
<OPTION VALUE="11">11
<OPTION VALUE="12">12
<OPTION VALUE="13">13
<OPTION VALUE="14">14
<OPTION VALUE="15">15
<OPTION VALUE="16">16
<OPTION VALUE="17">17
<OPTION VALUE="18">18
<OPTION VALUE="19">19
<OPTION VALUE="20">20
<OPTION VALUE="21">21
<OPTION VALUE="22">22
<OPTION VALUE="23">23
<OPTION VALUE="24">24
<OPTION VALUE="25">25
<OPTION VALUE="26">26
<OPTION VALUE="27">27
<OPTION VALUE="28">28
<OPTION VALUE="29">29
<OPTION VALUE="30">30
<OPTION VALUE="31">31
</SELECT>
<SELECT name="month_begin">
<OPTION VALUE="01">January
<OPTION VALUE="02"> February
<OPTION VALUE="03">March
<OPTION VALUE="04">April
<OPTION VALUE="05"> May
<OPTION VALUE="06">June
<OPTION VALUE="07">July
<OPTION VALUE="08"> August
<OPTION VALUE="09 ">September
<OPTION VALUE="10">October
<OPTION VALUE="11"> November
<OPTION VALUE="11">December
</SELECT>
<SELECT name="year_begin">
<OPTION VALUE="2008">2008
<OPTION VALUE="2009">2009
<OPTION VALUE="2010">2010
</SELECT>
<SELECT name="day_end">
<OPTION VALUE="01">01
<OPTION VALUE="02">02
<OPTION VALUE="03">03
<OPTION VALUE="04">04
<OPTION VALUE="05">05
<OPTION VALUE="06">06
<OPTION VALUE="07">07
<OPTION VALUE="08">08
<OPTION VALUE="09">09
<OPTION VALUE="10">10
<OPTION VALUE="11">11
<OPTION VALUE="12">12
<OPTION VALUE="13">13
<OPTION VALUE="14">14
<OPTION VALUE="15">15
<OPTION VALUE="16">16
<OPTION VALUE="17">17
<OPTION VALUE="18">18
<OPTION VALUE="19">19
<OPTION VALUE="20">20
<OPTION VALUE="21">21
<OPTION VALUE="22">22
<OPTION VALUE="23">23
<OPTION VALUE="24">24
<OPTION VALUE="25">25
<OPTION VALUE="26">26
<OPTION VALUE="27">27
<OPTION VALUE="28">28
<OPTION VALUE="29">29
<OPTION VALUE="30">30
<OPTION VALUE="31">31
</SELECT>
<SELECT name="month_end">
<OPTION VALUE="01">January
<OPTION VALUE="02"> February
<OPTION VALUE="03">March
<OPTION VALUE="04">April
<OPTION VALUE="05"> May
<OPTION VALUE="06">June
<OPTION VALUE="07">July
<OPTION VALUE="08"> August
<OPTION VALUE="09 ">September
<OPTION VALUE="10">October
<OPTION VALUE="11"> November
<OPTION VALUE="11">December
</SELECT>
<SELECT name="year_end">
<OPTION VALUE="2008">2008
<OPTION VALUE="2009">2009
<OPTION VALUE="2010">2010
</SELECT>
<INPUT TYPE="submit" VALUE="OK">
</FORM>
<FORM method="POST" action="index_eth0.php">
<INPUT TYPE="submit" VALUE="internal interface [eth0]">
</FORM>
<FORM method="POST" action="index_eth1.php">
<INPUT TYPE="submit" VALUE="external interface [eth1]">
</FORM>
</BODY>
</HTML>
Настраиваем httpd
Создаем фаил traf_inza.conf в каталоге /etc/httpd/conf.d/ или где то у вас установлен apache
/etc/httpd/conf.d/traf_inza.conf
Alias /traf_inza /var/www/html/traf_inza/index
<Directory /var/www/html/traf_inza/index>
DirectoryIndex index.php
</Directory>
Ну и все набираем в браузере http://192.168.50.3/traf_inza/ и наслаждаемся:)