Ключевые слова:traffic, iptables, linux, statistic, (найти похожие документы)
From: Docmaster <docmaster@land.ru.>
Newsgroups: email
Date: Mon, 2 Feb 2006 14:31:37 +0000 (UTC)
Subject: Средство для контроля интернет трафика на Perl+MySQL+IPTables
IPTables это фильтр пакетов для ядер 2.4, 2,6.
Пример использование iptables для контроля трафика:
iptables -N trafin
iptables -I input -e eth0 -s ! 123.123.123.0/24 -p all -j trafin
iptables -A trafin -d 123.123.123.123
Или если используется цепочка FORWARD для трансляции пакета на другую машину.
iptables -N trafin
iptables -A FRORWARD -j trafin
iptables -A trafin -d исходящий адрес
В Perl можно использовать внешний вызов команды iptables, получать
результат и обрабатывать через регулярные выражения, а можно
использовать модуль IPTables-IPv4, написанный Derrik Paters
(dpates@dsdk12net), который выложен на CPAN.
Модуль позволяет работать с netfilter на уровне ядра системы и
предоставляет удобный ООП интерфейс.
Метод работы заключается в том, чтобы через определенный интервал
времени опрашивать ядро, для получения информации о правилах в цепочке.
Для хранения данных можно использовать файлы или использовать СУБД MySQL.
Программа
#!/usr/bin/perl
use IPTables::IPv4;
use DBI;
$table=IPTables::IPv4::init('filter'); # подключение модуля к таблице filter.
$dbh=DBI->connect('DBI:mysql:billing',undef,undef'); #подключение к базе billing
$chainname='trafin'; #имя цепочки
@rules=$table->list_rules($chainname);
$i=0;
# получаем массив ссылок на состояние всех правил в цепочке Для хранения
# данных создана таблица с полями: ID,IP,TRAF,SUM, где поле TRAF
# используется для отсчета оставшегося трафика, а SUM для суммирования
# скаченного трафика. Обработка массива @rules
foreach $lin (@rules){
$per=$$lin{"destination"}; # получения исходящего адреса
$jump=$$lin{"jump"}
$sql="SELECT ID,IP,TRAF,SUM FROM traffik WHERE IP='$per'";
# проверка на наличие ip в таблице
$sth=$dbh->prepare($sql); #подготовка запроса
$sth->execute; #выполнение запроса
($id,$ip,$traf,$sum)=$sth->fetchrow_array;# получения данных
if($id ne "") # проверка на отсутсвия ip в таблице
{ # ip в таблице найден
$traf-=$$lin{"bcnt"};#вычитаем трафик
$traf=0 if $traf<=0 ;
$sum+=$$lin{"bcnt"}; #сумируем весь трафик
$sql="UPDATE traffik SET TRAF=$traf, SUM=$sum WHERE ID=$id";# забиваем таблицу
if(($traf<=0)&&($$lin{"jump"} ne "DROP"))# Блокировка таблици при окончании трафика
{
$$lin{"jump"}="DROP"; # -j DROP
$$lin{"pcnt"}=0; #обнуление счетчика пакетов
$$lin{"bcnt"}=0; #обнуление счетчика байтов
$table->replace_entry($chainname, $lin, $i)or die"Невозможно DROP'нуть правило :$!\n";
#изменение правила
}elsif(($traf>0)&&($$lin{"jump"}eq "DROP")){
$table->replace_entry($chainname, {destination=>$$lin{"destination"},jump=>'ACCEPT'}, $i);
# открываем доступ, если он был закрыт
};
$dbh->do($sql);#Выполнения запроса
} else { #нет ip в таблице
#удаляем из netfilter правило с этим ip
$table->delete_num_entry('billing',$i)or die "Невозможно удалить правило из цепочки chainname :$!\n";
$i--;
};
$i++;
};
$table->zero_entries($chainname); # Обнуление счетчиков байтов
$success = $table->commit(); # Завершаем работу с netfilter
$dbh->disconnect(); # Завершаем работу с MySQL.
На основе этого трафика создается программа по контроля трафика, которая
расположена, там же выложена документация по модулю IPTables-IPv4
[[http://docmaster.land.ru]]
IPTables::IPv4 не показывает source и destination адреса :( Кто нибудь сталкивался?
вот содержимое хэша rules ( в user-defined цепочке )
<pre>
Hash
pcnt=<число>
jump=ACCEPT
bcnt=<число>
End.
</pre>
И все! А где source адресс? В правилах он есть!