#!/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);
?>