Подсчет исходящего\входящего траффика

zip111

Новичок
Подсчет исходящего\входящего траффика

Возможен ли подсчет трафика средствами РНР?

Если да - то как?
 

alpine

Новичок
zip111
Возможен.
Я считаю примерно так:
PHP:
#!/usr/local/php/bin/php
<?php
/**
 * Демон для сбора статистики трафика через файревол, запускать "stat.php &"
 */
// Пример массива для логирования трафика
$accountIP = array(
  'rumata' => '192.168.0.100',
    'alpine' => '192.168.0.200'
);
// Входящий трафик
$in_face    = 'ppp0';

// Исходящий трафик
$out_face   = 'eth0';

// Частота сброса статистики (в секундах)
$sleep = 60*5;

$cmd    = '/usr/sbin/iptables -L FORWARD -v -x -Z FORWARD';
// $cmd     = '/usr/sbin/iptables -L FORWARD -v -x';
$log_file = '/var/log/squid/sql2.log';

// Отключаем сообщения об ошибках
error_reporting(0);
// Выставляем время выполнения скрита
set_time_limit(0);

function array2sql($arr)
{
  $date = date('Y-m-d');
  $time = date('H:i:s');
  $sql = null;

    foreach ($arr as $user => $data) {
      extract($data);
    // Если пустое знаечение то присваиваем ноль
      $in  = (null == $in)  ? 0 : $in;
      $out = (null == $out) ? 0 : $out;

      $sql .= "INSERT INTO nat VALUES('$date','$time',$in,$out,'FIREWALL','$user','$IP');\n";
    }

  return $sql;
}

do {

    $output = null;
    $arr = array();

  // Исполняем команду в консоли
  $str  = exec($cmd, $output);
  $last = sizeof($output) - 1;

  // Удаляем служебные и не используемые строки
    unset($output[0], $output[1]);

  // Генерируем запросы к базе данных
  //          pkts      bytes target     prot opt in     out     source               destination
  // Формат строки: 37053 18595499 ACCEPT     all  --  eth0   ppp0    192.168.0.100        anywhere
  //

  foreach ($output as $row) {
      $stat = sscanf($row, '%d %d %s %s %s %s %s %s %s', $pkts, $bytes, $target, $prot, $opt, $in, $out, $source, $destination);

      if (0 == $bytes) { // Проверяем байты, если "0" то не логируем
        continue;
      }
        // Учитываем направление трафика
    if ($out_face == $in) {
          $dir = 'out';
          $IP = $source;
    } else {
      $dir = 'in';
      $IP = $destination;
    }

    $user = array_search($IP, $accountIP);
    // Записываем в массив
        $arr[$user][$dir] = $bytes;

        if (empty($arr[$user]['IP'])) {
          $arr[$user]['IP'] = $IP;
        }
  }

  // Записываем в файл
  $fp = fopen($log_file, 'a');
  fputs($fp, array2sql($arr));
  fclose($fp);

  // Выcтавляем задержку
    sleep($sleep);

} while (1);

?>
-~{}~ 13.11.04 21:23:

Правила цепочки форвард
~>iptables -L FORWARD

Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- 192.168.0.100 anywhere
ACCEPT all -- 192.168.0.200 anywhere
ACCEPT all -- anywhere 192.168.0.100
ACCEPT all -- anywhere 192.168.0.200
 

#!/Perlik

Guest
Если это делать на фре то просто парсиш ipfw (see man ipfw).
 

SA739

Cogito, ergo sum
кошмар, кошмар, кошмар.....
ACCEPT all -- 192.168.0.100 anywhere
ACCEPT all -- 192.168.0.200 anywhere
а какже трафик генерируемй хостом непосрдественно к маршрутизатору?

Если это делать на фре то просто парсиш ipfw (see man ipfw)
конечно-же, для того, чтобы посчитать траффик стоит поставить freebsd вместо линукса, тем более, что 6 ноября вышел стейбл 5 ветки.... (:)

и вообще, подсчет траффика интересен в первую очередь администратору, а не девеолперу.. так вот госопода администраторы, существует УЙМА пакетов заточенных на подсчет траффика, так на вскидку:
net-acct
ipacct
ipcad
netams
-j ULOG в iptables
iptraf
еще?

ЗЫ. извините за потокание офтопику..
 

#!/Perlik

Guest
SA739
Я говорил это как вариант для Фри а не сносить линукс. ты привел хорошие пакеты :) еще хорошо снимать трафик по логам squid :)
 

Lucky

Новичок
Originally posted by #!/Perlik
SA739
Я говорил это как вариант для Фри а не сносить линукс. ты привел хорошие пакеты :) еще хорошо снимать трафик по логам squid :)
увы, не весь
 
Сверху