Установка анализатора трафика на базе NetFlow на Gentoo. Установка webalizer для анализов логов apache.
Недавно столкнулся с проблемой большого расхода трафика.. Нужно было сделать анализ и решить проблему.
В этом вопросе был не бум бум.. Поэтому почитав парочку дней информацию, покопавшись, вышел на результат..
Может кому будет полезно..
Дано: Сервер Gentoo, установленно mysql, apache, php.
Скриншоты веб интефрейса (1ой версии, без группировки по портам)
http://www.imgup.ru/image-6tvx171412516.html
http://www.imgup.ru/images_small/6twx25111120.jpg
http://www.imgup.ru/image-6txx51519194.html
Установка анализатора трафика на базе NetFlow на Gentoo. Установка webalizer для анализов логов apache.
1. Установка сенсора.
Сенсор - демон, который слушает сеть и фиксирует данные сеанса. Сенсор закреплен на интерфейсе и по умолчанию переводит его в promiscuous mode, соответственно для сбора всего проходящего через интерфейс. Сенсор "преобразует" сеансы передачи в так называемые flows-ы (от англ. нити) которые в дальнейшем собираются на коллекторе.
Ставим сенсор fprobe, который базируется на libpcap для низкоуровневого захвата пакетов.
| Код: |
| emerge -av fprobe |
2. Установка коллектора
Коллектор NetFlow предназначен для сбора данных, предоставляемых сенсором и сохранения их на диск для дальнейшего хранения и обработки.
В качестве NetFlow-коллектора использовался flow-capture, входящий в состав пакета flow-tools. Для дальнейшей работы с базами данных нужно собрать flow-tools с поддержкой последней.
| Код: |
| USE='mysql' emerge -av flow-tools |
3. Дополнительные пакеты.
Ставим дополнительно libcap, он необходим для сбора информации.
| Код: |
| emerge -av libcap |
4. Создание базы данных для дальнейшего хранения статистических данных.
Генерируем пароль при помощи pwgen для нового пользователя БД, которого будем создавать через несколько минут. Если pwgen не стоит, ставим (emerge -av pwgen)
| Код: |
| pwgen |
Заходим в БД под пользователем root.
| Код: |
| mysql -u root -p |
(вводим пароль пользователя БД root)
Пишем в консоле mysql SQL запрос, для создания БД.
| Код: |
| create database netflows; |
Выбираем базу данных для дальнейших операций.
| Код: |
| use netflows; |
Дальше запрос на добавление таблицы в БД. В моем случае два сет. интерфейса, поэтому в таблице указываю через знак «_» название сет. интерфейса. Создаем столько таблиц, сколько нужно анализировать сетевых интерфейсов. В моем случае компьютер на который ставим это adsl-router, у которого 2 сет. интерфейса, 2 ppoe соединения (2 ppp интерфейса) и 1 vpn соединение (1 tap интерфейс). Поэтому в моем случае создается 5 таблиц.
| Код: |
| CREATE TABLE `raw_eth0` ( `unix_secs` int(11) unsigned NOT NULL default '0', `doctets` int(11) unsigned NOT NULL default '0', `srcaddr` varchar(45) NOT NULL default '0', `dstaddr` varchar(45) NOT NULL default '0', `srcport` smallint(5) unsigned NOT NULL default '0', `dstport` smallint(5) unsigned NOT NULL default '0' ) TYPE=MyISAM; CREATE TABLE `raw_eth1` ( `unix_secs` int(11) unsigned NOT NULL default '0', `doctets` int(11) unsigned NOT NULL default '0', `srcaddr` varchar(45) NOT NULL default '0', `dstaddr` varchar(45) NOT NULL default '0', `srcport` smallint(5) unsigned NOT NULL default '0', `dstport` smallint(5) unsigned NOT NULL default '0' ) TYPE=MyISAM; CREATE TABLE `raw_ppp0` ( `unix_secs` int(11) unsigned NOT NULL default '0', `doctets` int(11) unsigned NOT NULL default '0', `srcaddr` varchar(45) NOT NULL default '0', `dstaddr` varchar(45) NOT NULL default '0', `srcport` smallint(5) unsigned NOT NULL default '0', `dstport` smallint(5) unsigned NOT NULL default '0' ) TYPE=MyISAM; CREATE TABLE `raw_ppp1` ( `unix_secs` int(11) unsigned NOT NULL default '0', `doctets` int(11) unsigned NOT NULL default '0', `srcaddr` varchar(45) NOT NULL default '0', `dstaddr` varchar(45) NOT NULL default '0', `srcport` smallint(5) unsigned NOT NULL default '0', `dstport` smallint(5) unsigned NOT NULL default '0' ) TYPE=MyISAM; CREATE TABLE `raw_tap0` ( `unix_secs` int(11) unsigned NOT NULL default '0', `doctets` int(11) unsigned NOT NULL default '0', `srcaddr` varchar(45) NOT NULL default '0', `dstaddr` varchar(45) NOT NULL default '0', `srcport` smallint(5) unsigned NOT NULL default '0', `dstport` smallint(5) unsigned NOT NULL default '0' ) TYPE=MyISAM; |
Добавляем пользователя в БД для работы анализатора (Здесь usr_netflow пользователь БД, localhost – хост, FWn5yf4K2GuP6u3v – пароль к БД).
| Код: |
| GRANT ALL PRIVILEGES ON netflows.* TO 'usr_netflow'@'localhost' IDENTIFIED BY 'FWn5yf4K2GuP6u3v' WITH GRANT OPTION; |
Делаем refresh настройкам привилегий в MySQL.
| Код: |
| FLUSH PRIVILEGES; |
Выходим из консоли mysql.
| Код: |
| exit |
5. Подготовка к запуску.
Создаем ротационный скрипт (в одну строчку), назовем его rotate.sh_интерфейсдлякоторогонаписанскрипт. Скрипт нужен для того, чтобы информацию по запросу от flow-capture сохранять в БД. Скрипт кладем в папку /root/.scripts/netflow/. И опять же создаем столько скриптов, скольких интерфейсов хотим анализировать трафик. В моем случае 5 файлов. Каждый из них отличается таблицей в которую писать.
| Код: |
| mkdir -p /root/.scripts/netflow/ nano -w /root/.scripts/netflow/rotate_eth0.sh |
Добавляем в файл след. строки:
| Код: |
| #!/bin/sh /usr/bin/flow-export -f3 -mUNIX_SECS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT -u "usr_netflow:FWn5yf4K2GuP6u3v:localhost:3306:netflows:raw_eth0" < $1 |
Следующий файл:
| Код: |
| nano -w /root/.scripts/netflow/rotate_eth1.sh |
Добавляем в файл след. строки:
| Код: |
| #!/bin/sh /usr/bin/flow-export -f3 -mUNIX_SECS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT -u "usr_netflow:FWn5yf4K2GuP6u3v:localhost:3306:netflows:raw_eth1" < $1 |
Следующий файл:
| Код: |
| nano -w /root/.scripts/netflow/rotate_ppp0.sh |
Добавляем в файл след. строки:
| Код: |
| #!/bin/sh /usr/bin/flow-export -f3 -mUNIX_SECS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT -u "usr_netflow:FWn5yf4K2GuP6u3v:localhost:3306:netflows:raw_ppp0" < $1 |
Следующий файл:
| Код: |
| nano -w /root/.scripts/netflow/rotate_ppp1.sh |
Добавляем в файл след. строки:
| Код: |
| #!/bin/sh /usr/bin/flow-export -f3 -mUNIX_SECS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT -u "usr_netflow:FWn5yf4K2GuP6u3v:localhost:3306:netflows:raw_ppp1" < $1 |
Следующий файл:
| Код: |
| nano -w /root/.scripts/netflow/rotate_tap0.sh |
Добавляем в файл след. строки:
| Код: |
| #!/bin/sh /usr/bin/flow-export -f3 -mUNIX_SECS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT -u "usr_netflow:FWn5yf4K2GuP6u3v:localhost:3306:netflows:raw_tap0" < $1 |
Делаем файлы исполняемыми.
| Код: |
| chmod +x /root/.scripts/netflow/rotate_*.sh |
Создаем директории для сохранения flows. Создаем внутри категории основной подкатегории для сет. интерфейсов.
| Код: |
| mkdir /var/flows mkdir /var/flows/eth0 mkdir /var/flows/eth1 mkdir /var/flows/ppp0 mkdir /var/flows/ppp1 mkdir /var/flows/tap0 |
Меняем права доступа.
| Код: |
| chmod 777 -R /var/flows/ |
6. Запуск системы учета трафика.
Создаем init.d скрипт запуска:
| Код: |
| nano -w /etc/init.d/netflows |
В моем случае компьютер на который ставим это adsl-router, у которого 2 сет. интерфейса, 2 ppoe соединения (2 ppp интерфейса) и 1 vpn соединение (1 tap интерфейс). Поэтому у кого меньше интерфейсов, соответственно удаляем лишнее строчки из файла…
| Код: |
| #!/sbin/runscript depend() { need net mysql use mysql after mysql } start() { ebegin "Start Fprobe - Netflow Sensor" echo "--- eth0 +" /usr/sbin/fprobe -i eth0 127.0.0.1:8815 sleep 2 echo "--- eth1 +" /usr/sbin/fprobe -i eth1 127.0.0.1:8816 sleep 2 echo "--- ppp0 +" /usr/sbin/fprobe -i ppp0 127.0.0.1:8817 sleep 2 echo "--- ppp1 +" /usr/sbin/fprobe -i ppp1 127.0.0.1:8818 sleep 2 echo "--- tap0 +" /usr/sbin/fprobe -i tap0 127.0.0.1:8819 sleep 2 eend $? "Failed start Fprobe - Netflow Sensor" sleep 1 ebegin "Start Flow-Capture - Netflow Collector" echo "--- eth0 +" /usr/bin/flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_eth0.sh -n 287 -N 3 -w /var/flows/eth0/ -S 10 0/0/8815 sleep 2 echo "--- eth1 +" /usr/bin/flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_eth1.sh -n 287 -N 3 -w /var/flows/eth1/ -S 10 0/0/8816 sleep 2 echo "--- ppp0 +" /usr/bin/flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_ppp0.sh -n 287 -N 3 -w /var/flows/ppp0/ -S 10 0/0/8817 sleep 2 echo "--- ppp1 +" /usr/bin/flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_ppp1.sh -n 287 -N 3 -w /var/flows/ppp1/ -S 10 0/0/8818 sleep 2 echo "--- tap0 +" /usr/bin/flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_tap0.sh -n 287 -N 3 -w /var/flows/tap0/ -S 10 0/0/8819 sleep 2 eend $? "Failed start Flow-Capture - Netflow Collector" } stop() { ebegin "Stop Fprobe - Netflow Sensor" killall fprobe > /dev/null 2>&1 sleep 2 eend $? "Failed stop Fprobe - Netflow Sensor" sleep 1 ebegin "Stop Flow-Capture - Netflow Collector" killall flow-capture > /dev/null 2>&1 sleep 2 eend $? "Failed stop Flow-Capture - Netflow Collector" } |
Запускаем и добавляем в автозагрузку.
| Код: |
| /etc/init.d/netflows start rc-update add netflows default |
Проверяем, если все корректно, то получим что то на подобие этого:
| Код: |
| pstree -au | grep fprobe |-fprobe -i eth0 127.0.0.1:8815 | |-{fprobe} | |-{fprobe} | |-{fprobe} | `-{fprobe} |-fprobe -i eth1 127.0.0.1:8816 | |-{fprobe} | |-{fprobe} | |-{fprobe} | `-{fprobe} |-fprobe -i ppp0 127.0.0.1:8817 | |-{fprobe} | |-{fprobe} | |-{fprobe} | `-{fprobe} |-fprobe -i ppp1 127.0.0.1:8818 | |-{fprobe} | |-{fprobe} | |-{fprobe} | `-{fprobe} |-fprobe -i tap0 127.0.0.1:8819 | |-{fprobe} | |-{fprobe} | |-{fprobe} | `-{fprobe} | |-grep --colour=auto fprobe pstree -au | grep flow-capture |-flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_eth0.sh -n 287 -N 3 -w /var/flows/eth0/ -S 100/0 |-flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_eth1.sh -n 287 -N 3 -w /var/flows/eth1/ -S 100/0 |-flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_ppp0.sh -n 287 -N 3 -w /var/flows/ppp0/ -S 100/0 |-flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_ppp1.sh -n 287 -N 3 -w /var/flows/ppp1/ -S 100/0 |-flow-capture -p /var/run/flow-capture.pid -R /root/.scripts/netflow/rotate_tap0.sh -n 287 -N 3 -w /var/flows/tap0/ -S 100/0 | |-grep --colour=auto flow-capture |
Через 10 минут после старта в БД в таблице должны появится данные. Если конечно трафик по интерфейсам был.
7. Подключение веб-интерфейса для анализа трафика.
Можно воспользоваться программой - http://phpal.sourceforge.net/allanbilling
А можно той, что я написал (т.к. в первой долго не получалось разобраться).
Выкладываю здесь.
Дальше буду рассматривать второй вариант.
На сервере распаковываем архив в папку, где лежат веб-ресурсы.
У меня это /var/www/mydomain.by/htdocs/aqua_lanflow/html/.
В настройках виртуальных хостов моего домена, в apache, добавляю сайт:
| Код: |
| ServerName aqua_lanflow.mydomain.by ServerAdmin admin@mydomain.by DocumentRoot "/var/www/mydomain.by/htdocs/aqua_lanflow/html/" Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all |
Перезапускаем апач.
| Код: |
| /etc/init.d/apache2 restart |
Редактируем настройки скрипта веб-интерфейса.
Для начала index.php переименовываем в index_названиеинтерфейса.php (тут уж извиняюсь за неудобство, не предусмотрел.. может позже руки дойдут).
| Код: |
| cd /var/www/mydomain.by/htdocs/aqua_lanflow/html/ mv index.php index_eth0.php |
Редактируем файл.
| Код: |
| nano -w index_eth0.php |
Изменяем параметры подключения к БД, а так же название таблицы на raw_eth0. Так же меняю ип адрес сетевого интерфейса на свой ип (если он статический, иначе тогда оставляю как есть).. прописываю порты/протоколы, по которым хотелось отдельно видеть информацию (по-умолчанию прописаны 80, 22, 21, 25, 465, 5060, 1194).
После этого делаю копию файла для eth1 там меняю те же параметры, так и для интерфейсов tap0, ppp0, ppp1.
8. Установка анализатора логов apache - webalizer.
Если нету флага Linguas в /etc/make.conf то добавляем его:
| Код: |
| echo "LINGUAS='en'" >> /etc/make.conf |
Ставим пакет.
| Код: |
| emerge -av webalizer |
Дальше заходим в настройки и указываем путь к файлам логов, к файлам, куда выкладывать статистику.
| Код: |
| nano -w /etc/webalizer.conf |
Редактируем опции:
| Код: |
| LogFile /var/log/apache2/access_log OutputDir /var/www/mydomain.by/htdocs/aqua_lanflow/html/stats/ |
Cоздадим папку.
| Код: |
| mkdir /var/www/mydomain.by/htdocs/aqua_lanflow/html/stats/ chmod 777 /var/www/mydomain.by/htdocs/aqua_lanflow/html/stats/ |
После этого добавляем в cron файл, который будет запускать webalizer каждый день и после чего будет складываться статистика в /var/www/mydomain.by/htdocs/aqua_lanflow/html/stats/.
| Код: |
| nano -w /etc/cron.daily/webalizer.cron |
Добавляем строчки:
| Код: |
| #! /bin/sh /usr/bin/webalizer |
Изменяем права доступа на файл, делаем исполняемым.
| Код: |
| chmod +x /etc/cron.daily/webalizer.cron |
Делаем первый запуск вручную, и немного ждем.. пока обработается информация.
| Код: |
| /etc/cron.daily/webalizer.cron |
9. Проверка трудов.
В браузере набираем наш адрес aqua_lanflow.mydomain.by после чего видим файлы интерфейса.. можем выбрать файл интерфейса выбрать тип отчета и ввести дату.. После чего увидим отчет по трафику через наш интерфейс.
Либо можно выбрать папку stats, тогда увидим отчет по вебсерверу.
10. Использовалась информация.
http://lug.ivanovo.ru/f/topic_show.pl?tid=529
http://googlesplog.blogspot.com/2008/12/ ... entoo.html
P.s. Еще раз повторюсь, в этой теме болтался первый раз.. поэтому возможно не идеально, но эти действия помогли найти проблему с утечкой трафика.