Приветствую! Продолжая рубрику "на коленке" (написал два года назад одну статью и уже рубрика), наконец у меня появилось время рассказать еще об одном проекте (а заодно и привести его в порядок), который используется у нас на сети небольшого транзитного провайдера для сбора и анализа статистики сетевого трафика .

Как и при анализе Ddos атак (link) проект использует в своей основе набор утилит flow-tools для сбора Netflow данных с сетевого оборудования. NFStats позволяет просматривать статистику в разрезе BGP автономных систем, IP-адресов, интерфейсов через web-интерфейс, что весьма полезно при балансировке трафика и общего понимания какой трафик проходит через/в/из вашу/ей AS. По описанию можно заметить сходство с Ntopng, однако NFStats предоставляет несколько иную статистику, более подходящую ISP.
Проект написан на python3 с использованием фреймворка django. Для отображения статистики используются google charts. Проект на Github
Оглавление:
Подготавливаем
Чтобы развернуть NFStats, как ранее было сказано, для начала нужно установить пакет утилит flow-tools. Во FreeBSD он доступен как пакет и из портов. В прошлой статье (link) я немного останавливался на описании и настройке flow-tools во FreeBSD и на оборудовании.
Для GNU/Linux его можно собрать только из исходников. Поэтому здесь можно разобрать это подробнее на примере Ubuntu.
Установка Flow-tools в Ubuntu
Устанавливаем зависимости
sudo apt install build-essential tcpd zlib1g-dev
Качаем flow-tools
mkdir ~/src wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/flow-tools/flow-tools-0.68.5.1.tar.bz2
Устанавливаем
tar -xf flow-tools-0.68.5.1.tar.bz2 cd flow-tools-0.68.5.1 ./configure make install clean
Создаем пользователя
adduser --system --no-create-home --shell /usr/sbin/nologin --group flow-toolsools
Папка для данных netflow
mkdir /var/flows chown -R flow-tools:flow-tools /var/flows
Далее нужно создать сервис flow-tools в systemd. Информацию по поводу флагов можно почитать в мануале flow-capture. Важно здесь -n 1439, что заставляет flow-capture создавать каждую минуту новый файл с данными.
# cat /etc/systemd/system/flow-capture.service [Unit] Description=flow-capture [Service] ExecStart=/usr/local/flow-tools/bin/flow-capture -z0 -n1439 -N3 -E10G -e0 -S1 -w /var/flows -D -p - 10.0.0.1/10.0.0.10/99919991 User=flow-tools Group=flow-tools Restart=on-failure [Install] WantedBy=multi-user.target
Перегружаем и включаем сервис
sudo systemctl daemon-reload sudo systemctl start flow-capture sudo systemctl enable flow-capture
Кроме FreeBSD или GNU/Linux со flow-tools нам понадобятся:
SNMP клиент и настроенный протокол snmpv2c на сетевом оборудовании
Python 3.6 или выше (Для GNU/Linux также нужен пакет соответственно python3.6-venv или выше для виртуального окружения)
СУБД
PostgreSQL 9.6 или выше
MySQL 5.7 или выше
Oracle Database Server 12.2 или выше. Version 6.0 or higher of the cx_Oracle Python driver is required.
WSGI сервер (Apache с mod-wsgi-py3, Nginx с uwsgi, Gunicorn и т.п)
Перейдем непосредственно к установке приложения
Загружаем проект и подготавливаем виртуальное окружение.
cd /var/www
git clone https://github.com/owenear/nfstats.git
cd nfstats python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Далее, в активированном виртуальном окружении! необходимо установить адаптер для используемой вами СУБД. Например для Postgres:
pip install psycopg2-binary
Создаем БД
postgres=# create database nfstats_db;
postgres=# create user nfstats_dbuser with encrypted password 'nfstatsdbpass';
postgres=# grant all ON DATABASE nfstats_db to nfstats_dbuser;
Создаем файл настроек для Django
cd /var/www/nfstats/nfstats/nfstats
cp settings.py.sample settings.py
Вносим в него необходимые изменения
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'nfstats_db',
'USER' : 'nfstats_dbuser',
'PASSWORD' : 'nfstatsdbpass',
'HOST' : 'localhost',
'PORT' : '5432',
}
}
ALLOWED_HOSTS = [ 'nfstats.example.com' ]
TIME_ZONE = 'Europe/Moscow'
Далее необходимо провернуть небольшой финт ушами для инициализации БД.
Сначала комментируем в URL диспетчере Django /var/www/nfstats/nfstats/nfstats/urls.py подключение url'ов приложения
urlpatterns = [
path('admin/', admin.site.urls),
# path('', include('mainapp.urls')),
]
Затем запускаем миграцию БД (Также в активированном виртуальном окружении)
cd /var/www/nfstats/nfstats
python manage.py migrate
И снова подключаем url в /var/www/nfstats/nfstats/nfstats/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('mainapp.urls')),
]
Создаем файл /var/log/nfstats.log
с правами на чтение для пользователя под которым будет запущено web приложение (например www-data для Apache). Соответственно он должен иметь также права на чтение для папки /var/www/nfstats
Проверяем также, чтобы к/var/www/nfstats/nfstats/flow-tools
доступ на чтение имел пользователь flow-tools.
Добавляем проект в настройки web-сервера. Пример для Apapche:
<VirtualHost *:80>
ServerName nfstats.example.com
DocumentRoot /var/www/nfstats
Alias /static/ /var/www/nfstats/nfstats/static/
WSGIScriptAlias / /var/www/nfstats/nfstats/nfstats/wsgi.py
WSGIDaemonProcess nfstats.example.com python-home=/var/www/nfstats/venv python-path=/var/www/nfstats/nfstats
WSGIProcessGroup nfstats.example.com
</VirtualHost>
Cкрипт/var/www/nfstats/nfstats/bin/interface_speed.py
необходимо добавить в CRON на ежеминутное исполнение
*/1 * * * * /var/www/nfstats/venv/bin/python /var/www/nfstats/nfstats/bin/interface_speed.py
Данный скрипт записывает скорости интерфейсов, на которых настроен съем статистики netflow (так называемый sampling) в базу данных. Эти значения используется для пересчета данных собранных flow-tools, что позволяет отображать правдивые данные относительно скорости даже при условии, что семплинг на оборудовании настроен не один к одному, а к примеру 1:2000 (то есть анализируется один из 2000 пакетов). Так, к примеру, советует Juniper для 10G интерфейсов. Это позволяет экономить ресурсы оборудования и место на диске.
На этом разворачивание приложения закончено.
Можно переходить к nfstats.example.com
При первом открытии вас перенаправит на страницу настроек, где нужно будет добавить сетевое оборудование на котором настроен netflow с указанием где лежат данные, собранные flow-tools.

На вкладке "System" можно отредактировать настройки связанные с SNMP, директориями, логированием. History - количество дней, которые будут храниться данные о скоростях (зависит от настроек flow-capture и объема собираемых данных)

Далее, на вкладке "Interfaces" необходимо пополнить базу интерфейсов с оборудования. Жмем на "Read SNMP" и добавляем необходимые интерфейсы (обычно все). Тут надо отметить, что в списке появятся только те интерфейсы, на которых настроен "description" на оборудовании

Отмечаем среди них те, на которых включен sampling (т.е. те, с которых снимается netflow). Обычно это будут Uplink интерфейсы, т.е будут собираться данные о трафике, который поступает и который уходит из нашей автономной системы.

Ну, и наконец использование
Переходим на nfstats.example.com. На вкладке "Common Stats" отображается статистика по автономным системам. Так называемые pie-charts интерактивны, при нажатии на номер AS отобразится ее имя в базе Ripe. Direction меняет направление трафика. Input - входящий в интерфейс трафик, Output - соответственно исходящий.

"BGP AS" - показывает распределение трафика по интерфейсам для конкретной source и/или destination AS.

"Interface" отображает похожее распределение только для определенного интерфейса. Здесь можно выбрать или ввести snmpid только тех интерфейсов, для которых НЕ! включен сэмплинг.

И "IP" - топ статистика по ip-адресам с возможностью различной фильтрации. При клике на отдельный "bar" также выводится информация о названии сети и кнопка "show traffic", которая позволяет просмотреть подробный вывод netflow данных для выбранного ip-адреса


Как видите, я постарался как можно подробнее описать процесс установки и использования (что было в моих силах). Кое-какую документацию я положил и в репозиторий на Github.
Но я конечно готов ответить на вопросы, если такие возникнут.
UPD: Добавлена поддержка коллектора из пакета NFDUMP. А с ним и поддержка netflow-v9 и ipfix.