ДЕНИС КОЛИСНИЧЕНКО
Учет трафика с помощью программ
MRTG и LAN Billing
Программа MRTG (The Multi Router Traffic Grapher) предназначена для мониторинга загрузки канала за сутки, неделю, месяц и год. Программа MRTG умеет рисовать красивые картинки в формате PNG, которые отображают состояние канала за определенный период времени. Программа предоставляет очень удобные средства для подсчета трафика: подсчет для всей сети и для отдельного узла, генерирование отчетов и диаграмм в формате HTML и многое другое.
Пример использования вы можете увидеть на сайте http://www.stat.ee.ethz.ch/mrtg.
Для работы mrtg нам потребуется маршрутизатор, поддерживающий протокол SNMP. В этой статье будет рассмотрен пример, позволяющий обойтись без маршрутизатора и вообще не использовать протокол SNMP.
Программа MRTG будет периодически запускаться на узле MRTG, обновляя информацию о трафике. Пользователи локальной сети могут ознакомиться с этой информацией по протоколу HTTP. Естественно, на узле MRTG должен быть установлен веб-сервер.
Перед установкой программы убедитесь в наличии следующих библиотек:
Загрузить последнюю версию MRTG можно по адресу: http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/pub.
Если вы используете операционную систему RedHat версии 7 или выше, программа MRTG, скорее всего, будет уже у вас установлена. Мы не будем скачивать исходные тексты программы, а сразу воспользуемся уже собранным пакетом rpm. Установим mrtg командой:
rpm -ih mrtg*
После установки нужно подготовить программу к первому запуску, то есть указать, откуда получать сведения о трафике.
Программа MRTG состоит из трех частей:
- cfgmaker – утилита для создания конфигурационного файла;
- indexmaker – утилита для создания файла index.html – страницы краткого обзора, дающая вам общее представление о всех целях, которые вы контролируете. О целях мы поговорим немного позже;
- mrtg – сам mrtg.
Первый конфигурационный файл удобно создать с помощью программы cfgmaker, а потом добавить в него дополнительные параметры. Введите команду:
cfgmaker --global "WorkDir: /var/www/html/mrtg" --global "Options[_]: bits,growright" --output /var/www/html/mrtg/mrtg.cfg community@router
Теперь разберемся, что все это означает. Прежде всего, напомню, что означает наклонная черта: это просто перенос строки. Когда вы будете вводить команду, вместо наклонной черты используйте пробел как разделитель параметров.
Параметр WorkDir задает рабочий каталог. В этот каталог будут помещены html-файлы и рисунки – отчеты о трафике. Каталог /var/www/html/, как вы уже успели заметить, является корневым каталогом нашего веб-сервера, поэтому для просмотра статистики нужно ввести следующий URL в окне браузера: http://localhost/mrtg.
Кроме параметра WorkDir имеются также параметры HtmlDir и ImageDir. В эти каталоги будут помещены html-файлы и картинки. При определении этих параметров нужно учитывать, что параметр WorkDir имеет приоритет над параметрами HtmlDir и ImageDir и поэтому, если указан параметр WorkDir, mrtg поместит отчеты и картинки именно в этот каталог, а значения параметров HtmlDir и ImageDir будут проигнорированы.
Группа глобальных параметров Options управляет построением изображения. Параметр bits означает, что мы измеряем трафик в битах, поэтому все числа нужно умножить на 8. Второй параметр, growright, указывает направление оси времени. Позже мы рассмотрим все параметры подробнее.
Параметр output программы cfgmaker задает имя конфигурационного файла, который будет создан.
Нужно отметить, что параметры WorkDir и Options являются параметрами программы mrtg, а параметры global и output – параметрами программы cfgmaker.
Параметр community@router указывает имя сообщества SNMP-устройства. В нашем случае – это наш SNMP-маршрутизатор. Обычно используется имя сообщества public. Параметр community@router как раз и является целью, которую мы будем контролировать.
После выполнения этой команды будет сгенерирован такой файл mrtg.cfg.
WorkDir: /var/www/html/mrtg
Options[_]: bits,growright
Target[r1]: community@router
Имя цели (r1) пишется в квадратных скобках. Для разных целей можно задавать разные параметры, например:
Target[r1]: 1:community@router
Target[r2]: 2:community@router
MaxBytes[r1]: 1250000
MaxBytes[r2]: 2500000
Title[r1]: Traffic Analysis for first interface
PageTop[r1]:Stats for our interface #1
Title[r2]: Traffic Analysis for second interface
PageTop[r2]:Stats for our interface #2
Параметр MaxBytes определяет максимальное число байт для цели. Значения, превышающие MaxBytes, будут игнорироваться.
Параметр Title определяет заголовок страницы, которая будет содержать информацию о цели, а параметр PageTop – текст, который будет помещен в верхней части этой страницы.
Числа 1 и 2 перед именем сообщества – это номера интерфейсов во внутренней таблице SNMP-устройства. После имени (или IP-адреса) SNMP-устройства можно указать порт SNMP. По умолчанию используется стандартный порт 161.
В качестве цели может быть использована программа, которая выводит на стандартный вывод четыре строки:
- Количество принятых байт.
- Количество отправленных байт.
- Время работы объекта после включения.
- Имя объекта.
Программу нужно записать в обратных кавычках, например:
Target[r3]: `/usr/bin/program`
Очень полезными параметрами являются Refresh и Interval. Первый определяет частоту обновления страниц с отчетами в браузере, а второй – предполагаемый интервал запуска программы MRTG. По умолчанию значения обоих параметров равны 300 секундам. Опции perminute и perhour позволяют измерять трафик в единицах за минуту и час соответственно. Опция noinfo подавляет вывод информации об устройстве и времени его работы. Пример:
Options[_]: bits, perminute, noinfo
Я думаю, что теории вполне достаточно, тем более что вместе с MRTG поставляется отличная документация, которая доступна по адресу http://localhost/mrtg/. Теперь перейдем к практической настройке.
Скорее всего, у вас не будет SNMP-маршрутизатора, поскольку в небольших сетях маршрутизатором является сама Linux-машина, а выделение средств на приобретение аппаратного маршрутизатора в ближайшие несколько лет не предвидится. Да и намного интереснее считать трафик своего компьютера, а не какого-то маршрутизатора, которого вы даже и не видели.
Я предлагаю довольно простое решение, настройка которого не займет у вас много времени. Основывается оно вот на чем: как я уже отмечал, вместо цели можно указать программу, которая бы выводила информацию на стандартный вывод в таком формате:
Строка 1
Строка 2
Строка 3
Строка 4
Строка 1 – это входящие байты (принятые), Строка 2 – исходящие байты (отправленные), Строка 3 – время, на протяжении которого работает устройство, Строка 4 – имя цели. Где же взять эту программу? Написать самому! Не буду обременять вас лишними подробностями, которые не относятся к самой MRTG, а больше к программированию сценариев, поэтому рассмотрим готовый листинг программы count.
Листинг 1. Программа count
#!/bin/bash
# (c) 2002 Denis Kolisnichenko
# Usage: /usr/bin/count iface
/bin/grep "$1" /proc/net/dev | /bin/awk -F ":" "{ print $2 }" | /bin/awk "{ print $1 " " $9 }"
UPTIME=`/usr/bin/uptime | /bin/awk -F " " "{ print $3 }"`
echo $UPTIME
echo $1
Использовать программу нужно так:
/usr/bin/count интерфейс
Например:
count eth0
Запустив программу, вы должны увидеть примерно следующие строки:
2738410
1235960
2:57,
eth0
|
Во второй строке программы происходит следующее: находится нужная нам запись с именем интерфейса, который мы указали в первом параметре при вызове программы ($1). Затем интерпретатор awk выводит значения первого и девятого полей, содержащие количество принятых и переданных байт.
В третьей строке программы вычисляется время uptime.
Последние две строки выводят время uptime и название интерфейса. Предположим, что у вас имеется два интерфейса: локальный eth0 и выделенная линия (ppp0), идущая к провайдеру.
Теперь узел MRTG сам является маршрутизатором и самостоятельно считает свой трафик. Файл конфигурации mrtg будет выглядеть так, как это показано в листинге 2.
Листинг 2. Файл /var/www/html/mrtg/mrtg.cfg
Target[eth0]: `/usr/bin/count eth0`
WorkDir: /var/www/html/mrtg/ipc
Options[eth0]: nopercent,growright,noinfo,gauge
Title[eth0]: eth0 Traffic
PageTop[eth0]:eth0 Traffic
MaxBytes[eth0]: 99999999
kilo[eth0]: 1024
YLegend[eth0]: bytes
ShortLegend[eth0]: bytes
LegendO[eth0]: eth0 Traffic :
LegendI[eth0]: eth0 Traffic :
Legend1[eth0]: eth1 Traffic in bytes
Target[ppp0]: `/usr/bin/count ppp0`
WorkDir: /var/www/html/mrtg/ipc
Options[ppp0]: nopercent,growright,noinfo,gauge
Title[ppp0]: ppp0 Leased Line
PageTop[ppp0]:ppp0 Leased Line
MaxBytes[ppp0]: 99999999
kilo[ppp0]: 1024
YLegend[ppp0]: bytes
ShortLegend[ppp0]: bytes
LegendO[ppp0]: ppp0 Traffic :
LegendI[ppp0]: ppp0 Traffic :
Legend1[ppp0]: ppp0 Traffic in bytes
Из листинга 2 видно, что у вас имеются две цели, для каждой из них заданы свои параметры. Нужно учитывать, что имя интерфейса, которое вы передаете программе count, должно совпадать с названием цели (eth0 и ppp0). В качестве рабочего каталога я использовал /var/www/html/mrtg/ipc. От использования каталога /var/www/html/mrtg/ я отказался, поскольку в нем находится документация по mrtg. Параметры MaxBytes, Title и PageTop являются обязательными. При их отсутствии mrtg попросит вас исправить ошибки в конфигурационном файле. Теперь можете запустить программу mrtg командой:
mrtg /var/www/html/mrtg/mrtg.cfg
В каталоге /var/www/html/mrtg/ipc должны появиться первые файлы-отчеты. Имя файла отчета будет совпадать с именем цели. Первые два запуска mrtg будет «ругаться» на отсутствие предыдущих данных, но потом все будет работать как надо. Если третий запуск прошел гладко, то есть без сообщений об ошибках, можно добавить mrtg в расписание демона crond. Для этого добавьте в файл /etc/crontab одну из следующих строк (какая кому нравится):
5,10,15,20,25,30,35,40,45,50,55,59 * * * * root /usr/bin/mrtg /var/www/html/mrtg/mrtg.cfg
или
0-59/5 * * * * root /usr/bin/mrtg /var/www/html/mrtg/mrtg.cfg
После этого желательно перезапустить демон crond:
/etc/init.d/crond restart
Программу mrtg можно запускать в режиме демона (не через crond). Для этого установите значение параметра RunAsDaemon, равное yes. За более подробной информацией обратитесь к документации по mrtg.
Теперь самое время проверить, как работает mrtg. Запустите браузер и введите адрес http://localhost/mrtg/ipc/ppp0.html. В результате вы должны увидеть информацию о загрузке канала. Первые графики вы увидите примерно через час после первого запуска mrtg, в зависимости от настроек периода запуска mrtg.
Рисунок 1. Статистика для устройства ppp0
Если вы администратор довольно большой сети уровня предприятия, возможно, более удобным решением для вас станет использование программы LAN Billing, которая разработана компанией Network Solutions.
Система LAN Billing предназначена для сбора, преобразования и выдачи информации об IP-трафике. Программа будет полезной интернет-провайдерам, которые хотят вести учет трафика их клиентов, а также директору предприятия, желающего знать, кто из его сотрудников постарался до такой степени, что счет за Интернет увеличился в 2 раза в сравнении с предыдущим месяцем. Кроме того, начальник узнает не только объем переданной и принятой сотрудником информации, а также и узлы, которые сотрудник посещал. Вполне возможно, что сотрудник занимался нужным делом, а может случиться и такое, что подчиненный выкачивал какой-нибудь фильм размером в 800 Мб, и тогда... То, что будет с этим сотрудником, нас не касается, лучше ознакомимся с основными возможностями программы:
- Подсчет трафика по нескольким подсетям.
- Поддержка конфигурации сетей, в которых применяется маскирование (masquerade).
- Детализация данных о трафике с точностью до IP-адреса потребителя и IP-адреса удаленного ресурса, который посещал потребитель за любой промежуток времени.
- Сжатие статистики для минимизации объема хранимой информации и ускорения доступа к ней со стороны управляющего клиента.
- Два клиента для доступа к статистике: веб-клиент, написанный на PHP, и Windows.
- Построение графиков загрузки интернет-канала за отчетный период, а также график распределения нагрузки по сетям и адресам.
- Сбор статистики с NetFlow-совместимых устройств, например маршрутизаторов Cisco Systems.
- Поддержка виртуальных групп (возможность присвоения группе адресов или сетей учетной записи, под полномочиями которой пользователь может просматривать статистику только о трафике своей группы адресов).
- Поддержка контроля доступа для виртуальных групп, в частности прекращение обслуживания по истечении средств на счете клиента.
Из всего этого можно сделать вывод, что программа очень полезна. Настроить (читайте – создать самостоятельно) все это средствами Linux – задача вполне выполнимая и посильная для любого профессионала, но довольно неблагодарная. Слишком подробно программу рассматривать не буду, поскольку на сайте http://www.lanbilling.ru находится прекрасная документация по этой программе. В этой статье мы рассмотрим только установку и настройку системы LAN Billing, а об ее использовании вы сможете прочитать в документации по системе. Система LAN Billing состоит из трех основных компонентов:
- сетевого агента;
- сервера статистики;
- управляющего клиента.
Сетевой агент занимается подсчетом трафика, сервер статистики хранит таблицы, содержащие информацию о трафике, а управляющий агент управляет всем этим. Если быть предельно точным, то управляющий клиент не только управляет конфигурацией системы, а еще и создает отчеты об использованном трафике сети.
Сетевой агент может быть двух видов:
- Агент для сетевого адаптера Ethernet (для операционных систем Linux, FreeBSD, NetBSD).
- Сервер для аппаратного маршрутизатора или коммутатора Cisco, поддерживающего протокол NetFlow.
Существует несколько способов интеграции системы LAN Billing в вашу сеть. Вот четыре основных способа:
- Установка системы на Unix-маршрутизатор.
- Установка системы на Unix-маршрутизатор, выполняющий NAT/Masquerade.
- Система устанавливается в сегмент, в котором находится маршрутизатор, и информация о трафике доступна на сетевом уровне.
- Система устанавливается в сегмент, доступный по IP-протоколу (UDP) для NetFlow-совместимого устройства, осуществляющего маршрутизацию.
В первом случае мы выступаем владельцами IP-сети, то есть каждому компьютеру нашей сети назначен реальный IP-адрес. Это самый простой случай.
Второй случай подразумевает под собой наличие одного реального IP-адреса. Естественно, компьютер с настоящим IP-адресом – это маршрутизатор. Все остальные компьютеры получают доступ к Интернету через шлюз с настоящим IP-адресом. Шлюз выполняет NAT (сетевое преобразование адреса), при котором компьютеры нашей сети «думают», что они по-настоящему общаются с узлами Интернета, а последним кажется, что они общаются только с нашим шлюзом. То есть шлюз перезаписывает заголовки IP-пакетов, заменяя фиктивный IP-адрес любого узла нашей сети на свой собственный (реальный адрес) и отправляет пакет в Интернет. Когда пакет приходит обратно, он опять перезаписывает IP-адрес и отправляет его определенному компьютеру нашей сети.
В третьем случае интерфейс маршрутизатора и сервера с установленной системой LAN Billing объединены концентратором.
Мне более близок первый случай, но остановимся на втором, поскольку он более близок к реалии наших дней – не у каждого предприятия есть своя собственная IP-сеть. Программа LAN Billing поставляется в виде пакета RPM, поэтому проблем с ее установкой не возникает.
Параметры учета трафика находятся в файле /etc/billing.conf. При редактировании этого файла обратите внимание на то, что даже если какая-нибудь директива не используется, она должна присутствовать в файле и не быть закомментированной. Иначе произойдет ошибка при инициализации системы. Комментарии в этом файле начинаются со знака решетки #.
В дальнейшем будем предполагать, что реальный IP-адрес сервера 193.111.111.1, и что у нас один сегмент сети с фиктивными адресами – 192.168.0.1. Директива serverextip определяет внешний адрес сервера (реальный IP-адрес). Данную директиву нужно использовать, если вы используете NAT, в противном случае, оставьте эту директиву без изменения. Значение по умолчанию – 150.150.150.150.
serverextip=193.111.111.1
Директива writemode определяет, какой режим записи данных о трафике мы хотим использовать: db или file. В первом случае мы будем использовать для хранения статистики сервер MySQL, а во втором – данные будут сохраняться в файле. Второй случай нам не интересен, поскольку мы не сможем генерировать отчеты средствами системы LAN Billing, поэтому установите значение db.
writemode=db
Следующая группа директив определяет параметры сервера MySQL: его адрес, имя пользователя, пароль и базу данных.
serveraddress=192.168.0.1
mysqluser=sqluser
mysqlpassword=qwerty123456
mysqldatabase=nfbilling
Директива LogFile определяет месторасположение файла протокола работы системы. Файл, определенный в директиве LogFile будет использоваться, если вы определили режим учета file в директиве writemode.
logfile=/var/log/nfbilling/nfbilling.log
Директива сегмент описывает наш сегмент сети. В директиве указывается адрес и маска сети. Можно использовать несколько директив – в зависимости от количества сегментов, для которых мы хотим вести учет трафика. При указании маски сети нельзя использовать битовую нотацию (192.168.0.0/24).
segment=192.168.0.0 255.255.255.0
С помощью директивы actuality можно указать время, на протяжении которого база данных будет хранить информацию об адресе назначения и сервисах, с которыми соединялись наши пользователи. По умолчанию – 100 часов.
actuality=100
Директива minter определяет время, за которое нужно объединять статистику об однотипном трафике для последующего хранения. По умолчанию – 100 секунд.
minter=100
Период записи информации о трафике можно определить с помощью директивы flush. По умолчанию – 600 секунд.
flush=600
Директива fdelay определяет время в секундах после регистрации последнего пакета, когда поток считается завершенным и подлежащим записи в базу данных.
fdelay=60
Директива dumpfile задает имя файла, содержащего временную информацию о незавершенных потоках.
dumpfile=/var/log/nfbilling/nfbcd-dump
Директива device определяет интерфейс, на котором нужно считать трафик. Как правило, нужно считать трафик внешнего интерфейса. Например, если вы подключаетесь к Интернету через интерфейс ppp0 (выделенная линия), а к своей домашней сети через eth0, но вести нужно учет интерфейса ppp0.
devide=ppp0
Директива ignoremask указывает маску подсети, трафик которой мы будем игнорировать. Эта директива нужна, чтобы мы не считали локальный трафик. При учете пакетов на интерфейсе, подключенном к Интернету, нужно задать маску 255.255.255.255:
ignoremask=255.255.255.255
Директива ingnorenet определяет сеть, трафик которой должен быть проигнорирован в любом случае. Синтаксис ее такой же, как и синтаксис директивы segment. Можно использовать для нетарифицируемого трафика.
ignorenet=127.0.0.0 255.0.0.0
Директивы debug и debugfile относятся к отладке программы. Директивы headers и Disable пользователем (читайте – администратором) не используются. Директивы duser, dgroup используются для определения учетных записей пользователя и группы, под полномочиями которых выполняется сетевой агент Cisco. Директива dport определяет номер порта агента Cisco.
duser=nobody
dgroup=nobody
dport=7223
После правки файла конфигурации нужно перезапустить систему. Для этого выполните одну из команд:
killall –HUP nfbcd
killall –HUP nfbccd
Но более корректной будет команда:
/etc/rc.d/init.d/nfbilling.init restart
Обычно сетевой агент LAN Billing запускается автоматически, но вы можете запустить его вручную с помощью команды:
/etc/rc.d/init.d/nfbilling.init start
Остановить агента можно командой:
/etc/rc.d/init.d/nfbilling.init stop
Теперь можно просмотреть результат нашей работы. Управляющий клиент системы выполнен в виде веб-интерфейса. Для доступа к статистике вы можете использовать любой браузер. В поле ввода адреса браузера введите:
http://ваш_web_сервер/analyze.php
В случае если система установлена и функционирует корректно, вы получите доступ к консоли администратора. Более подробную информацию о программе, а также примеры ее применения вы можете посмотреть на сайте http://www.lanbilling.ru. Ваши вопросы и комментарии присылайте по адресу dhsilabs@mail.ru.