Timeweb
PostHeaderIcon

Подсчет трафика с помощью Cisco PIX

Для реализации используем Cisco PIX c PIXOS не меньше 6.2 и любой Unix/Linux
Данные передаваемые с PIX`а будут сохранятся в /var/log/pix.log посредством syslogd,
после чего будут обрабатываться скриптом pix_stat.pl.
Скрипт pix_stat.pl можно вызывать как из cron`а, так и через скрипт прогрузки - stat_loader.pl
В первом случае необходимо настроить вывод данных с файл статистики или на эл. почту,
во втором - предварительно поднять БД(например mysql), создать в ней базу, пользователя и т.д.


1. Создаем скрипт снятия статистики на unix-хосте:
# cat /usr/local/bin/pix_stat.pl
---
#!/usr/bin/perl

while (<>) {
next unless /%PIX-6-302014|%PIX-6-302016/;
my ($inip, $bytes) = m! to .*:([^/]*?)/\d+ duration.* bytes (\d+)!;
$traff{$inip} += $bytes;

}

foreach (sort { $traff{$b} <=> $traff{$a} } keys %traff) {
my ($B) = int $traff{$_};
next if $B == 0;
print "$B $_\n";
}
---
и прикручиваем его к сron`у(пропускаем если будем использовать прогрузку в БД)



2. На unix-хосте настраиваем прием логов с PIX`а:
# echo "local7.* /var/log/pix.log" >> /etc/syslogd.conf:

И настраиваем ротейт лога:
# cat /etc/logrotate.d/pix
/var/log/pix.log {
compress
weekly
rotate 8
create 0644 root root
}


3. Включаем логирование на PIX`е:
pix(config)# logging on
pix(config)# logging facility 23
pix(config)# logging trap 6
pix(config)# logging host inside 192.168.1.2


4. По желанию создаем скрипт прогрузки в БД:
# cat /usr/local/bin/stat_loader.pl
---
#!/usr/bin/perl

use POSIX qw(strftime);
use DBI qw(:sql_types);
use DBI;

my $mail_err = "root";

my $database = "stat";

my $date_prev = time() - 86400;
my $date = strftime "%Y-%m-%d", localtime($date_prev);
my $date_pix = strftime "%b %e", localtime($date_prev);


`egrep '^$date_pix' /var/log/pix.log | /usr/local/bin/pix_stat.pl > /var/stat/$date.recv`;

my $dbh = DBI->connect("DBI:mysql:$database", "mb", "mmm") or die $DBI::errstr;

my $sth = $dbh->prepare("select id,IP from clients;") or die $DBI::errstr;
$sth -> execute || die $DBI::errstr;

while( @row = $sth->fetchrow()) {
push(@data, @row);
}
$sth->finish;

while(@data) {
my $id = shift @data;
my $ip = shift @data;

open(RECV, "/var/stat/$date.recv");
my $recv = "";
while($line = <RECV>) {
if ($line =~ /$ip\b/) {
$recv = (split /\s+/, $line)[0];
}
}
close(RECV);


$sth = $dbh->do("insert into traffic values ('$id', '$date', '$recv')");
}

$dbh->disconnect;
---


И прописываем его в cron:
# crontab -l
0 0 * * * /usr/local/bin/stat_loader.pl


Для работы скрипта понадобится созданная ранее база:
mysql> create database stat;

mysql> use stat;

mysql> create table clients (
id int(3) not null auto_increment, primary key (id),
Client varchar(20) not null unique,
Name varchar(20) not null,
IP varchar(18) not null unique,
MAC varchar(18) not null unique);

mysql> create table traffic (
id int(3) not null,
Date date not null,
RECV int(20));

mysql> grant select,insert,update,delete on stat.* to stat@localhost identified by '********';