Система учета трафика на основе net-acct

Рано или поздно перед каждым администратором встает вопрос о построении своей системы учета трафика, будь то небольшая локальная сеть или средних размеров ISP. Данный документ описывает, как сделать это с помощью пакета net-acct

[Ушаков Андрей (andrew@sumteh.ru)]

Система учета трафика на основе net-acct

Рано или поздно перед каждым администратором встает вопрос о построении своей системы учета трафика, будь то небольшая локальная сеть или средних размеров ISP.

Систем, направленных на эту задачу, существует немало и порой сложно с чего-то начать. Для того чтобы можно было что-то выбрать, необходимо сформулировать требования к системе, которую мы хотели бы использовать.

Итак, какой же она должна быть?

Во-первых, система должна выдавать подробный отчет по трафику, время, source и destination адреса, порты, сетевой интерфейс.

Во-вторых, весьма желательно, чтобы система могла работать с базой данных, например с MySQL. В этом случае мы избавляемся от необходимости "низкоуровневой" обработки данных и самостоятельного занесения этих данных в базу, т.к. делать это рано или поздно все равно придется.

Ну и в-третьих, это важно для многих пользователей интернета в регионах, система должна каким-либо образом разделять тип трафика на бесплатный (free), пиринговый (peer), и общий (world).

Всем этим требованиям удовлетворяет система net-acct-mysql. Скачать архив можно с сайта http://exorsus.net/projects/net-acct/, причем я настоятельно рекомендую качать не самую последнююверсию, а версию netacct-mysql-0.73, т.к. все последующие версии были упрощены и не включают в себя некоторых полезных опций.

Net-acct необходимо сконфигурировать с опцией "--with-mysql" с указанием пути к mysql, например

   ./configure --with-mysql=/usr/local/mysql

После компиляции и установки программы (make && make install) необходимо создать базу данных для net-acct с помощью дампа, который присутствует в архиве:

    mysql -u root -p < netacct.sql.
После чего не забываем добавить пользователя в MySQL и предоставить ему права на базу netacct.
mysql>grant all privileges on netacct.* to netacct identyfied by 'netacct';
mysql>flush privileges;
Далее необходимо сконфигурировать поограмму. Для этого в нашем расопряжении имеются два файла конфигурации в каталоге /usr/local/etc:
  • naccttab - главный файл конфигурации,
  • nacctpeering - файл, содержащий список сетей, которые следует считать пиринговыми.
Рассмотрим файл naccttab.

В самом начале идет секция конфигурации доступа к базе данных:

database mysql
Первая строка описывает, в каком виде будет записываться информация о трафике, в нашем случае это запись в mysql, возможен также вариант file, при котором запись будет идти в текстовый файл /var/log/net-acct. Далее следуют параметры доступа к базе данных, название которых говорят сами за себя.
mysql_user netacct
#пользователь в MySQL
mysql_password netacct
#пароль пользователя для базы
mysql_host localhost
#хост
mysql_database netacct
#имя базы данных
mysql_table accounting
#имя таблицы
Далее идет опция, указывающая pid файл процесса демона net-acct:
pidfile  /var/run/nacctd.pid
Далее описываются сетевые параметры для работы net-acct.

Мы рассмотрим следующую схему сети, для которой мы будем конфигурировать учет трафика: Небольшая локальная сеть с внутренними адресами вида 10.0.0.XXX подключена к интернет через nat на Linux машине с двумя интерфейсами eth0 и eth1, eth0 смотрит в интернет, eth1 - в локальную сеть.

Итак, рассмотрим необходимые для такой схемы параметры (описание идет после каждой опции)

flush 60
Задает период (в секундах), с которым данные записываются в базу.
fdelay 60
Задает время (в секундах), в течении которого после завершения сетевой активности данные о трафике могут быть записаны в базу.
dumpfile /var/log/net-acct-dump
Задает имя файла дампа статистики.
notdev eth0
Если машина имеет два интерфейса, то с помощью опции notdev мы указываем интерфейс, который следует исключить из диапазона отслеживаемых программой, дабы избежать дублирования записей о трафике, прошедшем через оба интерфейса. В нашем случае этим интерфейсом является eth0
device eth0
Данная опция задает тот интерфейс, который будет переводится в promiscuous режим.
iflimit eth0
Эта опция в том случае, когда машина имеет несколько интерфейсов и только на одном из них неоходим учет трафика.
ignorenet 127.0.0.0 255.0.0.0
Эта опция позволяет исключить из подсчета трафик идущий черех loopback интерфейс.
debug 2
debugfile /tmp/nacctd.debug
Опции для отладочной информации.
headers lo	14	12
headers eth	14	12
Задает, с пакетами каких интерфейсов следует работать, в нашем случае lo и eth.

Многие захотят отключить опцию первой строки, т.е. headers lo, но практика показывает, что данное действие приводит к нерабочему состоянию программы, так что делать это не рекомендуется. Цифры после каждого из параметров указывают следующее: в первом столбце - количество байт, после которых начинают идти данные в пакете, во втором - количество байт, приходящихся на поле типа пакета.

И последнии опции, которые будут в нашем конфиге:

hostlimit 10.0.0.2
hostlimit 10.0.0.3
hostlimit 10.0.0.4
Указывают на то, для каких адресов в подсети следует считать трафик. Служит своего рода фильтром и позволяет исключать некоторые адреса из учета.

Если нет необходимости указывать адреса явно, можно указать адрес только той машины, на которой стоит net-acct, в этом случае будет считаться весь трафик пришедший на интфрфейс eth1.

C первым конфигом мы разобрались. Далее идет файл nacctpeering, в котором, как было сказано выше, содержится список пиринговых сетей. Достаточно просто написать каждую подсеть или адрес в новой строке, например:

195.58.1.134
194.226.148.0/24
213.140.111.224/255.255.255.224
Ну вот, с конфигами закончили, теперь можно запускать систему, для этого необходимо ввести команду /usr/local/sbin/nacctd.Если не было допущено ошибок в конфиге, то через некоторое время в базеужепоявлятся первые записи и весь трафик будет под конролем.

Первый этап работы закончен, далее возникает необходимость просмотра информации о трафике. Для этого можно написать скрипт, например на PHP или PERL, а можно обращатся к базе напрямую. В обоих случаях необходимо сформулировать запросы к базе. Далее я приведу несколько запросов, которыме могут быть наиболее часто востребованы для получения информации о трафике. Эти же запросы можно будет использовать и в скриптах.

Для удобства введем несколько символических перемнных:

  • $IP - адрес для которого будем просматривать статистику;
  • $monthday - день месяца, за который просматриваем статику (целое число от 1 до 31);
  • $month - месяц, за который просматриваем статистику (целое число от 1 до 12);
  • $peer - тип трафика, принимает значения 0 или 1 (если src адреса соответсвуют пиринговым адресам).
Просматриваем суммарную статистику для адреса $IP за день $monthday месяца $month с типом трафика $peer:
  select SUM(data_size)/1024/1024 from accounting where dst_ip = '$IP'
  and DAYOFMONTH(data) = $monthday and MONTH(data) = $month and peer = $peer;
Просматриваем суммарную статистику для адреса $IP за месяц $month с типом трафика $peer:
  select SUM(data_size)/1024/1024 from accounting where dst_ip = '$IP'
  and MONTH(data) = $month and peer = $peer;
Просматриваем суммарную статисику по всем дням для адреса $IP за месяц $month с типом трафика $peer:
  select SUM(data_size)/1024/1024, data from accounting where dst_ip = '$IP' and MONTH(data) =
  $monthand peer = $peer group by data;
Просмотр подробной статистки за весь день $monthday месяца $month с выводом адресов, с которых шел трафик, времени и типа трафика:
  select time, data_size/1024/1024, src_ip, peer from accounting where dst_ip = '$IP'
  and DAYOFMONTH(data) = $monthday and MONTH(data) = $month;
Ну вот, на этом этапе система достигла рабочего состояния. Далее остается только более тонакая настройка и отладка, в случае допущения каких-либо ошибок.

Оригинал статьи расположен по адресу: http://www.opennet.ru/base/net/net_acct.txt.html.

[ опубликовано 28/11/2003 ]

Ушаков Андрей (andrew@sumteh.ru) - Система учета трафика на основе net-acct   Версия для печати