Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #122, ФЕВРАЛЬ 2009 г.

Байт к байту. Обзор популярных систем учета трафика под *nix

Ульяна Смелая (core@synack.ru), Андрей Матвеев (andrushock@real.xakep.ru)




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

Удобный NiTraf

Многие провайдеры используют Net-Acct (exorsus.net/projects/net-acct) - весьма простой в настройке и работе коллектор транзитного трафика с богатыми возможностями. Оригинальная версия сохраняет собранную информацию в текстовый файл, но есть и форк netacct-mysql (netacct-mysql.sf.net), позволяющий записывать данные в базу MySQL или PostgreSQL. Постепенно эти проекты обросли многочисленными анализаторами журналов (например, Sawmill - www.sawmill.net/formats/net_acct.html) и интерфейсами. Одной из самых популярных «надстроек» стал NiTraf (nitalaut.sarkor.uz), способный подсчитывать трафик за выбранный период по IP-адресам. Он также поддерживает квоты и задание алиасов и отображает детальную статистику по портам и протоколам. Информация сохраняется в MySQL и затем выводится через веб-интерфейс.

Для работы программы потребуется собственно Net-Acct, серверы MySQL и Apache2. В Ubuntu/Debian их установка выглядит так:

$ sudo aptitude install net-acct mysql-server \
python-mysqldb apache2 apache2-utils

Подготавливаем MySQL-сервер:

$ mysql -uroot -ppassword
> CREATE DATABASE trafdata;
> USE trafdata;
> GRANT ALL ON trafdata.* TO traf@localhost IDENTIFIED BY 'trafadmin';
> QUIT;

В скриптах NiTraf жестко зашит путь /opt/trafdata/raw, куда Net-Acct должен сохранять информацию. Создаем этот каталог:

$ sudo mkdir -p /opt/trafdata/raw

Переходим к Net-Acct. Все настройки производятся в единственном файле /etc/naccttab:

$ sudo nano /etc/naccttab

# Сюда пишем логи, дамп и отладочную информацию
file /opt/trafdata/raw/net-acct.log
dumpfile /opt/trafdata/raw/dump
debugfile /opt/trafdata/raw/net-acct.debug
# Трафик, проходящий через данный сетевой интерфейс, не учитываем
notdev eth1
# Установка устройства в режим приема всех пакетов
#device eth0
# Снимать данные только с этого устройства
#iflimit eth0
# Игнорировать внутрисетевой трафик
ignoremask 255.255.255.0
# Игнорировать loopback сеть (аналогично можно указать и другие сети)
ignorenet 127.0.0.0 255.0.0.0
# Отключаем подсчет пакетов (обязательный параметр)
disable 7

Перезапускаем демон:

$ sudo /etc/init.d/net-acct restart

Распаковываем архив с NiTraf и перемещаем каталоги на свое место:

$ tar xzvf nitraf-20070320.tar.gz
$ sudo mv -v ./nitraf/nitraf /etc
$ sudo mv -v ./nitraf/traf /var/www

В файле /etc/nitraf/mysql/create_mysql_tables.py необходимо указать адресное пространство локальной сети: «LAN='192.168.1.'». После чего запускаем скрипт:

$ sudo /etc/nitraf/mysql/create_mysql_tables.py

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

$ cd /etc/nitraf
$ sudo ./rawtraf.py
$ sudo ./settings/checkquota.py

Если ошибок нет, добавь в /etc/crontab два задания:

*/10 * * * * root cd /etc/nitraf; ./rawtraf.py
*/5 * * * * root cd /etc/nitraf/settings; ./checkquota.py

Процесс учета трафика начался, переходим к настройке веб-интерфейса. Создаем файл сайта traf такого содержания:

$ sudo nano /etc/apache2/sites-available/traf

<Directory "/var/www/traf/">
Options Indexes MultiViews FollowSymLinks ExecCGI
AllowOverride All
AddDefaultCharset CP1251
</Directory>

Активируем новый сайт:

$ sudo a2ensite traf

Чтобы веб-интерфейс функционировал, в конфиге Apache должны быть прописаны две директивы:

AddHandler cgi-script .cgi
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so

Или включены необходимые модули:

$ sudo a2enmod mime
$ sudo a2enmod cgi

Перезапускаем веб-сервер:

$ sudo /etc/init.d/apache2 force-reload

Все готово, система работает. Доступ к каталогу охраняет файл .htaccess, поэтому задаем пароль:

$ sudo htpasswd -c /var/www/traf/.htaccess username

Его и используем для входа. Если защита не нужна, просто удаляем .htaccess. Теперь набираем в браузере ссылку http://localhost/traf и смотрим собранную статистику.

Подсчет с ULOG

В Linux все пакеты проходят через Netfilter, который обладает самой достоверной информацией о количестве переданных и принятых данных. В 2000 году программист Harald Welte написал патч к ядру - ULOG (Userspace Logging, www.netfilter.org/projects/ulogd), снимающий данные с Netfilter в пространстве пользователя. В наше время несколько проектов обеспечивают сбор данных с ULOG - ulogd, ulog-acctd, specter и выдачу пользователю информации в удобной форме - scanulog, Webfwlog и Nulog2.

Демон ulogd обладает большей функциональностью, поэтому на нем и остановимся. По умолчанию он сохраняет данные в файл текстового формата, но имеются штатные плагины для записи в базу данных MySQL/PostgreSQL. В репозитарии Ubuntu есть несколько пакетов, относящихся к ulogd. Достаточно инсталлировать следующие:

$ sudo aptitude install ulogd ulogd-mysql

По умолчанию устанавливается стабильная версия 1.23, хотя на сайте уже доступна ulogd-2.0.0beta2, у которой несколько больше встроенных модулей. Конфигурационный файл находится в /etc/ulogd.conf. Параметров в нем немного:

$ sudo nano /etc/ulogd.conf

[global]
# Файл журнала и уровень журналирования
logfile="/var/log/ulog/ulogd.log"
loglevel=5
# Плагины вывода
# Текстовый формат
plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
# Для вывода в базу MySQL
#plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
[LOGEMU]
# Параметры вывода (в данном случае - текстовый)
file="/var/log/ulog/syslogemu.log"
# Подключение к MySQL
[MYSQL]
table="ulog"
pass="pass"
user="user"
db="ulogd"
host="localhost"

Теперь нужно указать iptables, чтобы он использовал ULOG. В правилах все строки вида:

iptables -A FORWARD $FILTER -j LOG --log-prefix "FORWARD"

заменяем на:

iptables -A FORWARD $FILTER -j ULOG --ulog-prefix "FORWARD"

Напомним, что при помощи iptables можно считать не весь трафик, а только по определенным портам, узлам, направлениям.
При самостоятельной сборке ядра не забудь включить опции:

$ grep -i ulog /usr/src/linux/.config
CONFIG_BRIDGE_EBT_ULOG=m
CONFIG_IP_NF_TARGET_ULOG=m

Перезапускаем ulogd и смотрим, что записывается в журнал:

$ sudo /etc/init.d/ulogd restart
$ tail -f /var/log/ulog/syslogemu.log

Если все в порядке, в конфиге снимаем комментарий со строк, отвечающих за работу с MySQL, создаем саму базу и учетную запись для работы с ней:

$ mysql -uroot -ppassword
> CREATE DATABASE ulogd;
> GRANT ALL PRIVILEGES ON ulogd.* TO 'user'@'localhost' IDENTIFIED BY 'pass';

В каталоге /usr/share/doc/ulogd-mysql находится файл-заготовка mysql.table для создания таблиц:

$ cat /usr/share/doc/ulogd-mysql/mysql.table | mysql -uuser -ppass ulogd

Перезапускаем ulogd:

$ sudo /etc/init.d/ulogd restart

Для контроля смотрим изменение счетчиков в базе данных (select count(*) from ulog;). Стоит заметить, что ulogd скрупулезен в подсчете трафика, поэтому база данных очень быстро разрастается в размерах. Главные минусы этого решения - работа только в Linux и подсчет только по IP, а не учетным данным. Но если пользователь работает за одним компьютером, это не имеет значения: даже если он захочет сменить айпишник, ни что не помешает нам контролировать МАС-адрес.

Универсал IPCad

Программа IPCad (Cisco IP accounting simulator, lionet.info/ipcad) относится к универсальным средствам, так как позволяет вести подсчет трафика, используя несколько механизмов - BPF (Berkeley packet filter), libpcap и ULOG. Поэтому его можно использовать не только в Linux, но и в *BSD, MacOS X/Darwin или Solaris.
В репозитарии Ubuntu нужного пакета нет, но IPCad легко собирается. Для этого понадобятся библиотеки libpcap, заголовочные файлы ядра и собственно компилятор:

$ sudo apt-get install libpcap-dev build-essential linux-libc-dev

Далее – стандартно:

$ tar xzvf ipcad-3.7.3.tar.gz
$ cd ipcad-3.7.3
$ ./configure
$ make
$ sudo make install

Конфигурационный файл ipcad.conf вместе с файлами примеров находится в /usr/local/etc. Все параметры трогать не будем, разберем только основные:

$ sudo nano /usr/local/etc/ipcad.conf

# Интерфейсы, с которых будем собирать статистику (все PPP и eth0)
interface ppp*;
interface eth0;
# Отдельно считаем каждый адрес сети 192.168.1.0
aggregate 192.168.1.0/24 strip 32;
# Остальные агрегировать по первым 24 битам
aggregate 0.0.0.0/0 strip 24;
# Поднимаем rsh (используется для просмотра статистики)
rsh enable at 127.0.0.1;
# Для удобства можно использовать свою учетную запись
rsh root@127.0.0.1 admin;
# Пользователю "user" доступ запрещен
rsh user@127.0.0.1 deny;
# Остальные могут просматривать статистику
rsh 127.0.0.1 view-only;
# Файл для сбора статистики
dumpfile = /var/log/ipcad/ipcad.dump;

Демон ipcad не умеет самостоятельно создавать файл, в который записывается информация. Сделать это придется вручную, установив соответствующие права доступа:

$ sudo mkdir -m 700 /var/log/ipcad
$ sudo touch /var/log/ipcad/ipcad.dump
$ sudo chmod 600 /var/log/ipcad/ipcad.dump

Стартуем (в некоторых дистрибутивах потребуется указать полный путь к исполняемому файлу):

$ sudo ipcad –rds

В процессе запуска на консоль будут выведены текущие установки, внимательно их просмотри. Значение ключей таково:

  • r – при запуске импортируем данные из dumpfile;
  • d – запускаем процесс в виде демона (при первом запуске его можно не использовать);
  • s – по завершению работы сохранить статистику в dumpfile.

Позаботиться об автоматическом запуске IPCad при загрузке системы надо самостоятельно. Для этого добавляем указанную выше команду в скрипт /etc/init.d/rc.local (или подобный – в разных дистрах название может отличаться). Для просмотра статистики подключись к серверу rsh, который мы запустили из ipcad.conf:

$ rsh localhost show ip accounting

В ответ получим информацию обо всем трафике. Для отбора нужных данных можно воспользоваться такими утилитами, как grep и awk. Например, чтобы получить суммарный трафик для компьютеров внутренней сети, задействуй следующую конструкцию:

$ rsh $HOST show ip accounting | grep -E '192\.168\.1\.'$1'([^0-9]|$)' | awk '{s+=$4} END {print(s/1024)}'

Здесь открывается огромный простор для творчества. При желании можно строить графики, используя RRDtool (читай статью «Универсальный наблюдатель» в X_11_2008). Количество принятых и отправленных данных по конкретному интерфейсу смотрим так:

$ rsh localhost show interface eth0

Полезно периодически сохранять в файл текущую статистику:

$ rsh localhost dump > /var/log/ipcad/ipcad.`date`

Сброс статистики осуществляется при помощи «clear ip accounting». Для корректной остановки ipcad используй команду «rsh localhost shutdown».

Консольный монитор трафика vnStat

Иногда необходима простая утилита, позволяющая учитывать трафик, который проходит через сетевой интерфейс, и отображать загрузку в разные периоды времени. Чтобы не настраивать сложные решения, часть админов предпочитает использовать проверенные временем программы мониторинга (вроде tcpdump, netwatch, ethereal). Кто-то пишет свои правила для iptables или другого фильтра пакетов, но есть и более удобные варианты. Среди них – консольный монитор трафика vnStat (humdi.net/vnstat), очень простой в работе и практически не требующий настройки. Доступен в репозитариях большинства дистрибутивов Linux, также работает в FreeBSD и Darwin/MacOS X. Процедура установки тривиальна:

$ sudo aptitude install vnstat

Все параметры, поддерживаемые программой, можно узнать, запустив vnstat с ключом '--longhelp'. Но для начала создадим базу данных интерфейса, трафик которого будем считать. Для этого используем ключ '-u/--update':

$ sudo vnstat -u -i ppp0
Unable to read database "/var/lib/vnstat/ppp0".
-> A new database has been created.
$ sudo vnstat -u -i eth0

Как видно из вывода, базы данных создаются в каталоге /var/lib/vnstat. Теперь, чтобы просмотреть статистику по всем интерфейсам, вводим «vnstat» без дополнительных ключей – получим таблицу, в которой будет указано количество переданных/принятых килобайт и их сумма. Значение estimated показывает среднюю вероятную загрузку с учетом предыдущих значений, вычисленных за время работы. Поначалу тут будет пусто, но постепенно vnstat включится «в предсказание».
Обновление баз производится при помощи скрипта cron, устанавливаемого вместе с пакетом, а два скрипта в /etc/network останавливают и запускают учет при остановке и подъеме сетевого интерфейса.

Используя ключ '-i', можно указать на вывод только данных по конкретному интерфейсу. При помощи других ключей доступны отчеты: '-h' – по часам, '-d' – по дням, '-w' – АО неделям и '-m' – по месяцам. Параметр '--dumpdb' позволяет вывести данные из базы. Это можно использовать при создании собственных запросов. Для обнуления базы и остановки подсчета используй соответственно параметры '-r/--reset' и '--disable'.

$ sudo vnstat -i eth0 -u -r --disable

Еще один параметр '--live' позволит контролировать количество переданных/принятых данных в реальном времени. Утилита может быть настроена при помощи конфигурационных файлов /etc/vnstat.conf или $HOME/.vnstatrc. По умолчанию используются встроенные установки, которые можно просмотреть, указав ключ '--showconfig', и задействовать затем при формировании своего конфига:

$ sudo sh -c "vnstat --showconfig > /etc/vnstat.conf"

Для удобства вывода информации предлагается CGI-скрипт собственной разработки - vnstati, который можно скачать на сайте проекта. Другой проект (www.sqweek.com/sqweek/index.php?p=1) предлагает PHP фронт-энд.

Чистый спирт

Нельзя обойти вниманием программу с довольно интересным названием cnupm (pdp-11.org.ru/~form/cnupm), которая умеет считать IP/IPv6-трафик на сетевом интерфейсе при помощи библиотеки pcap. Работает в *BSD, Linux, QNX, Solaris и, возможно, в других ОС, поддерживающих pcap. Процесс установки очень прост и описан в README на русском языке. Состоит из двух утилит: коллектора cnupm и утилиты для вывода статистики cnupmstat. Из особенностей можно выделить возможность отбора трафика при помощи tcpdump-подобных выражений, нетребовательность к системным ресурсам, работу в chroot с правами непривилегированного пользователя, отсутствие конфигурационного файла. В общем случае строка запуска может выглядеть так:

$ sudo /usr/local/sbin/cnupm -N -f inet -k -q -p -D -i eth0

Для просмотра статистики запускаем «cnupmstat eth0».
По адресу stb.nixdev.org доступен веб-интерфейс к спирту - stb (simple traffic billing).

INFO

  • Ulogd – расширение для iptables, которое позволяет организовать хранение информации о событиях, фиксируемых с помощью iptables по действию ULOG, в БД MySQL/PostgreSQL.
  • В Ubuntu для настройки правил iptables используется UFW (/etc/ufw), который по умолчанию не активен.
  • О системе биллинга для Asterisk читай в статье «Звездные счета», опубликованной в февральском номере ][ за 2008 год.
  • Система учета трафика NeTAMS описана в статье «Идеальный контролер», опубликованной в сентябрьском номере ][ за 2007 год.

WWW

Содержание