Исходный данные:
(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.confAlias /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/ и наслаждаемся:)