Система учета трафика связка ipcad&mysql&httpd&php


Исходный данные:

(84.56.32.7)eth1 внешний интерфейс
(192.168.50.3)eth0 внутренний интерфейс

Задача:

Надо посчитать входящий и исходящий по eth1 и входящий трафик по eth0( порт 3138, 110 и nat)+прикрутить web морду


Настраиваем ipcad:

ipcad.conf
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;


Настраиваем mysql

Создадим базу допуститм 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>

Теперь создадим таблицы для внешнего и внутреннего интерфейса

Таблицы eth0,eth1
[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>


Прикручиваем web - морду

Создаем в каталоге /var/www/html папку traf_inza в нее еще папку index

Считаем входящий и исходящий по eth1 при этом обрезаем под сеть провайдера в силу того что она бесплатная, у меня она такая(84.56.).Создаем скрипт traf_eth1 со следующим содержанием:

/var/www/html/traf_inza/traf_eth1; eth1 - фаил с моими внешними ip
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 со следующим содержанием:

/var/www/html/traf_inza/traf_eth0; eth0 - фаил с моими локальными ip
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

/var/www/html/traf_inza/index/index_eth0.php
<?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

/var/www/html/traf_inza/index/index_eth1.php
<?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/ и наслаждаемся:)