AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Установка анализатора трафика на базе NetFlow на Gentoo. Установка webalizer для анализов логов apache.

Библиотека 1 сообщений -
#1

Установка анализатора трафика на базе 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. Еще раз повторюсь, в этой теме болтался первый раз.. поэтому возможно не идеально, но эти действия помогли найти проблему с утечкой трафика.