Одна из забот сисадмина это учет сетевого траффика, который проходит через шлюз локальной сети. Рано или поздно любой администратор сталкивается с этой проблемой. Программы биллинга стоят довольно дорого и поэтому для небольших сетей эти затраты не оправданы. Ну что ж выходить из ситуации нужно. Все что нам нужно это:
1. Расширенные свойства ядра Linux по управлению сетевым траффиком.
2. В качестве маршрутизатора используется компьютерс с Linux
3. Для обработки результатов будем использовать скриптовые языки типа Perl или специализированные программы и базы данных.
Простой учет траффика
Итак, система учета траффика строится с использованием трех вещей:
1. Специально созданных правил на маршрутизаторе.
2. Программы снятия статистики.
3. Программы отображения статистики.
Начнем с описания структуры базы данных MySQL
Наша база будент называтся traf, а таблица - traffic.
CREATE TABLE traffic (
id int(11) NOT NULL auto_increment,
date datetime NOT NULL,
ip varchar(20) NOT NULL default '',
in int(11) NOT NULL default '0',
out int(11) NOT NULL default '0',
KEY id(id)
) TYPE=MyISAM;
id - индекс записи в базе данных;
date - дата и время сохраняемой записи;
ip - IP-адрес к которому относится информация;
in - содержит информацию по входящему траффику;
out - содержит информацию по исходящему траффику;
Далее сконфигурируем наш брандмауэр, который будет позволять учитывать траффик. Вынесем это в отдельный скрипт
traffic.conf
# Рабочие места
WS1="192.168.0.1"
WS2="192.168.0.2"
wsX="192.168.0.X"
# Сеть организации
ORG="192.168.2.0/24"
# Полный список адресов
ALLNETS="$WS1 $WS2 $WSX $ORG"
Далее рассмотрим правила учета для iptables которые находятся в файле rc.traffic. После отладки этого файла его можно
добавить в rc.local
#!/bin/bash
# Подключаем конфигурационный файл
. /etc/traffic.conf
# Функция для создания правила учета
addrule(){
/sbin/iptables -N ACCT_IN_$1
/sbin/iptables -F ACCT_IN_$1
/sbin/iptables -A INPUT -j ACCT_IN_$1
/sbin/iptables -A ACCT_IN_$1 -s $2
/sbin/iptables -N ACCT_OUT_$1
/sbin/iptables -F ACCT_OUT_$1
/sbin/iptables -A OUTPUT -j ACCT_OUT_$1
/sbin/iptables -A ACCT_OUT_$1 -d $2
/sbin/iptables -A FORWARD -j ACCT_IN_$1
/sbin/iptables -A FORWARD -j ACCT_OUT_$1
{
# СОздаем правило для учета траффика
for NET in$ALLNETS; do
# Для всех сетей в списке $ALLNET создать правила учета траффика
addrule $NET $NET
done
Далее тестируем наши правила Выполним приведенный скрипт и после этого выполним iptables -L и убедимся в правильности его работы.
После этого нужно написать программу, которая будет снимать статистику и сохранять ее в базе данных. Это будет простейшая
программа, которую необходимо добавить в crontab и вызывать с периодичностью скаже минут эдак 10.
#!/usr/bin/perl
# Функция занимающаяся сбором и внесением данных в БД
sun account{
$name=$_[0];
$IP_IN=0;
$IP_OUT=0;
$mysqlcommand="/usr/bin/mysql -h localhost traf -e";
$ipstuff=`/sbin/iptables -L -Z ACCT_IN_$name -v -x`;
@IPTBMASS=split(/ /,$ipstuff);
chomp $IPTBMASS[2];
$string=$IPTBMASS[2];
$string=s/s{1,}/ /g;
@INFOMASS=split(/ /,$string);
$IP_IN=$INFOMASS[2];
$ipstuff=`/sbin/iptables -L -Z ACCT_OUT_$name -v -x`;
@IPTBMASS=split(/ /,$ipstuff);
$string=$IPTBMASS[2];
$string=~ s/s{1,}/ /g;
@INFOMASS2=split(/ /,$string);
$IP_OUT=$INFOMASS2[2];
($min, $hours, $day, $mounth, $year) = (localtime) [1,2,3,4,5];
$time=$hours.":".$min.":00";
$mounth=$mount+1;
$year=$year+1900;
$date=$year."-".$month."-".$day;
$sql="insert into traffic values ('','".$date."
".$time."','".$name."','".$IP_IN."','"$IP_OUT."');";
'$mysqlcommand "$sql";
}
$config='./lconfreader.sh';
Для работы последней команды скрипта нужно написать еще один скрипт lconfreader.sh
# #!/bin/bash
# . ./lbiling.conf
# echo $ALLNETS
chomp $config;
@NETMASS=split(/ /,$config);
foreach $nets(@NETMASS)
{
# Для каждого элемента списка выполнить функцию account
account $nets;
}
Простейшая система учета сетевого траффика готова. Остальное все в ваших руках, хотите дописывайте модули визуализации,
генераторы отчетов или используйте стандартные программы. В любом случае удачи в нашем нелегком труде :)
|