The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Пример простой системы учета трафика (freebsd ipfw traffic)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: freebsd, ipfw, traffic,  (найти похожие документы)
From: Вадим Федоров <fedorov@vadim.org.ua> Newsgroups: fido7.ru.unix Date: Mon, 4 Dec 2000 13:01:37 +0000 (UTC) Subject: Пример простой системы учета трафика Оригинал: http://www.vadim.org.ua//index.php?cmd=article3 У многих начинающих системных администраторов часто стоит вопрос, а как организовать систему учета трафика? С подобными вопросами вы сталкнетесь на многих форумах в интернете. В рамках данной статьи мы рассмотрим простую систему учета трафика, которая должна будет обладать следующими характеристика: * Учет всего трафика проходящего через маршрутизатор работающий под ОС Linux; * Возможностью быстрого изменения конфигурации без внесения изменений в код; * Данные о трафике должны храниться в базе данных, в нашем случае мы в качестве сервера баз данных будем использовать MySQL. В рассматриваемом примере будем считать, что все IP адреса в нашей сети реальные. Начнем с создания конфигурационного файла, назовем его billing.conf. Пусть он имеет следующий вид: <******* billing.conf **************> # Формируем список IP адресов машин или сетей, для которых мы будем считать # трафик # Рабочее место WS1="192.168.0.1" # Ceть нашего клиента NET="192.168.1.0/24" # Объединим объединим все сети и адреса в один список. ALLNETS="$WS1 $NET" <**********************************> В принципе формировать списки для каждого адреса или сети нет необходимости, т.к. рассматриваемая система использует только список ALLNETS, однако они могут понадобиться в случае если вам нужно будет обрабатывать статистику о каждом пользователе. Данный конфигурационный файл является единой для всей нашей системы, состоящей как минимум из трех программ: * Программы формирования правил учета для firewall, с использованием iptables; * Программы снятия статистики; * Программы отображения статистики; Рассмотрим программу формирования правил учета для firewall, названную в нашем случае rc.firewall, которую нужно будет добавить в один из файлов, который будет выполняться при загрузке системы. Для начала немного теории, в ядрах Linux серии 2.4.X используется firewall NetFilter интерфейсом к которому является программа iptables. В NetFilter cущестуют несколько цепочек: INPUT - все входящии пакеты, адресованные маршрутизатору, OUTPUT - все исходящии из маршрутизатора пакеты, FORWARD - все пересланные маршрутизатором пакеты во внешнюю сеть. <******* rc.firewall **************> #!/bin/bash # Подключаем конфигурационный файл . /etc/lbiling.conf IPTABLES="/sbin/iptables" # Задаем путь к программе iptables ################################### # Учет трафика ################################### # Функция для создания правила учета addrule(){ $IPTABLES -N ACCT_IN_$1 # Создаем правило для учета входяшего трафика $IPTABLES -N ACCT_OUT_$1 # Создаем правило для учета изходяшего трафика $IPTABLES -F ACCT_IN_$1 # Обнулим полученные цепочки $IPTABLES -F ACCT_OUT_$1 $IPTABLES -A INPUT -j ACCT_IN_$1 # Включим учет по цепочкам $IPTABLES -A FORWARD -j ACCT_IN_$1 $IPTABLES -A FORWARD -j ACCT_OUT_$1 $IPTABLES -A OUTPUT -j ACCT_OUT_$1 $IPTABLES -A ACCT_IN_$1 -s $2 # Считать входящим трафик у которого источник # адрес $2 $IPTABLES -A ACCT_OUT_$1 -d $2 # Считать исходящим трафик у которого получатель # адрес $2 } # Создаем правила для учета трафика for NET in $ALLNETS; do # Для всех сетей в списке $ALLNET создать правила учета трафика addrule $NET $NET done <**********************************> После выполниния нашей программы rc.firewall, набрав в консоле: # iptables -L Вы должны будете увидеть нечто подобное: Chain INPUT (policy ACCEPT) target prot opt source destination ACCT_IN_192.168.0.1 all -- anywhere anywhere ACCT_IN_192.168.1.0/24 all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination ACCT_IN_192.168.0.1 all -- anywhere anywhere ACCT_OUT_192.168.0.1 all -- anywhere anywhere ACCT_IN_192.168.1.0/24 all -- anywhere anywhere ACCT_OUT_192.168.1.0/24 all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCT_OUT_192.168.0.1 all -- anywhere anywhere ACCT_OUT_192.168.1.0/24 all -- anywhere anywhere Chain ACCT_IN_192.168.0.1 (2 references) target prot opt source destination all -- 192.168.0.1 anywhere Chain ACCT_IN_192.168.1.0/24 (2 references) target prot opt source destination all -- 192.168.1.0/24 anywhere Chain ACCT_OUT_192.168.0.1 (2 references) target prot opt source destination all -- anywhere 192.168.0.1 Chain ACCT_OUT_192.168.1.0/24 (2 references) target prot opt source destination all -- anywhere 192.168.1.0/24 Создадим базу данных в MySQL с названием trafficbd, для этого необходимо будет выполнить следующий SQL запрос (как это сделать не входит в рамки нашей статьи, обратитесь к документации MySQL): <********* База данных trafficbd.sql *****> CREATE DATABASE IF NOT EXISTS trafficbd; use trafficbd; # # Структура таблицы `traffic` # CREATE TABLE traffic ( id int(11) NOT NULL auto_increment, date datetime NOT NULL default '0000-00-00 00:00:00', ip varchar(20) NOT NULL default '', inb int(11) NOT NULL default '0', outb int(11) NOT NULL default '0', KEY id (id) ) TYPE=MyISAM; <**********************************> Итак, подведем итоги, мы создали базу данных, написали правила учета трафика, теперь нам надо паписать программу, которая бы снимала полученную статистику, заносила е╦ в базуданных и после этого обнуляла бы счетчики. Ниже привиден пример такой программы, е╦ можно прописать в CRON и вызывать с некоторым периодом. <**********************************> #!/usr/bin/perl # Функция занимающаяся сбором и внесением данных в БД. sub account{ $name=$_[0]; # Имя правила $IP_IN=0; # Инициализация счетчиков $IP_OUT=0; # Командная строка MySQL для внесения данных в таблицу. $mysqlcommand="/usr/bin/mysql -hlocalhost trafficbd -e"; # Снимем данные со счетчика входящего трафика и обнулим $ipstuff=`/sbin/iptables -L -Z ACCT_IN_$name -v -x`; # Выделим из вывода предыдущей команды значение счетчика @IPTBMASS=split(/\n/,$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(/\n/,$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=$mounth+1; $year=$year+1900; $date=$year."-".$mounth."-".$day; # Формируем SQL запрос $sql="insert into traffic values('','".$date." ".$time."','".$name."','".$IP_IN."','".$IP_OUT."');"; # Выполняем его `$mysqlcommand "$sql"`; } # На этом функция account заканчивается:) # Основая программа $config=`./lconfreader.sh`; # Прочитаем конфигурационный файл. # Ниже приводится текст скрипта lconfreader.sh: # #!/bin/bash # . ./lbiling.conf # Включить конфигурационный файл # echo $ALLNETS # Вывести в stdout список всех сетей, покоторым ведется учет . # chomp $config; @NETMASS=split(/ /,$config); foreach $nets(@NETMASS) { # Для каждого элемента списка, выполнить функцию account account $nets; } <**********************************> Вот собственно и вся биллинговая система:) © Vadim Fedorov <fedorov@vadim.org.ua> 2003

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, vadik likholetov (?), 15:14, 09/12/2003 [ответить]  
  • +/
    замечу, что ключевые слова freebsd, ipfw, traffic
    к содержанию статьи отношения не имеют.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру