Обзор популярных систем учета трафика под *nix
Ульяна Смелая (core@synack.ru), Андрей Матвеев (andrushock@real.xakep.ru)
Рано или поздно любому админу придется столкнуться с проблемой учета трафика. Подобрать оптимальный вариант среди великого многообразия свободного ПО не так уж и просто. Попробуем разобраться с особенностями настройки популярных решений для сбора, хранения и представления пользовательской статистики.
Содержание:
- Удобный NiTraf
- Подсчет с ULOG
- Универсал IPCad
- Консольный монитор трафика vnStat
- Врезка: Чистый спирт
- Боковые выносы
Многие провайдеры используют — весьма простой в настройке и использовании коллектор транзитного трафика с богатыми возможностями. Оригинальная версия сохраняет собранную информацию в текстовый файл, но есть и форк , позволяющий записывать данные в базу MySQL или PostgreSQL. Постепенно эти проекты обросли многочисленными анализаторами журналов (например, ) и интерфейсами. Одной из самых популярных «надстроек» является , способный подсчитывать трафик по 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 и смотрим собранную статистику.
Не секрет, что в Linux все пакеты проходят через Netfilter, который обладает самой достоверной информацией о количестве переданных и принятых данных. В 2000 году программист Harald Welte написал патч к ядру — (Userspace Logging), снимающий данные с 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 (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 или другого фильтра пакетов, но есть и более удобные варианты. Среди них консольный монитор трафика , очень простой в работе и практически не требующий настройки. Доступен в репозитариях большинства дистрибутивов 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, который можно скачать на сайте проекта. Другой проект () предлагает PHP фронт-энд.
Нельзя обойти вниманием программу с довольно интересным названием , которая умеет считать 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 (simple traffic billing).
INFO
-
Ulogd – расширение для iptables, которое позволяет организовать хранение информации о событиях, фиксируемых с помощью iptables по действию ULOG, в БД MySQL/PostgreSQL.
-
В Ubuntu для настройки правил iptables используется UFW (/etc/ufw), который по умолчанию не активен.
-
О системе биллинга для Asterisk читай в статье «Звездные счета», опубликованной в февральском номере ][ за 2008 год.
-
Система учета трафика NeTAMS описана в статье "Идеальный контролер", опубликованной в сентябрьском номере ][ за 2007 год.
WWW
- Сайт проекта vnStat — .
- Сайт проекта Net-Acct — .
Статья опубликована в февральском номере журнала «Xakep» за 2009 год.




