16.07.2021       Выпуск 395 (12.07.2021 - 18.07.2021)       Статьи

NFStats — анализ netflow данных для ISP «на коленке»

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

Читать>>




Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

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

Как и при анализе Ddos атак (link) проект использует в своей основе набор утилит flow-tools для сбора Netflow данных с сетевого оборудования. NFStats позволяет просматривать статистику в разрезе BGP автономных систем, IP-адресов, интерфейсов через web-интерфейс, что весьма полезно при балансировке трафика и общего понимания какой трафик проходит через/в/из вашу/ей AS. По описанию можно заметить сходство с Ntopng, однако NFStats предоставляет несколько иную статистику, более подходящую ISP.

Проект написан на python3 с использованием фреймворка django. Для отображения статистики используются google charts. Проект на Github

Оглавление:

  1. Подготавливаем

  2. Устанавливаем

  3. Настраиваем

  4. Используем

Подготавливаем

Чтобы развернуть NFStats, как ранее было сказано, для начала нужно установить пакет утилит flow-tools. Во FreeBSD он доступен как пакет и из портов. В прошлой статье (link) я немного останавливался на описании и настройке flow-tools во FreeBSD и на оборудовании.

Для GNU/Linux его можно собрать только из исходников. Поэтому здесь можно разобрать это подробнее на примере Ubuntu.

Установка Flow-tools в Ubuntu
  1. Устанавливаем зависимости

    sudo apt install build-essential tcpd zlib1g-dev
  2. Качаем 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
  3. Устанавливаем

    tar -xf flow-tools-0.68.5.1.tar.bz2 
    cd flow-tools-0.68.5.1
    ./configure 
    make install clean
  4. Создаем пользователя

    adduser --system --no-create-home --shell /usr/sbin/nologin --group flow-toolsools
  5. Папка для данных netflow

    mkdir /var/flows
    chown -R flow-tools:flow-tools /var/flows
  6. Далее нужно создать сервис 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
  7. Перегружаем и включаем сервис

    sudo systemctl daemon-reload
    sudo systemctl start flow-capture
    sudo systemctl enable flow-capture

Кроме FreeBSD или GNU/Linux со flow-tools нам понадобятся:

  • Python 3.6 или выше (Для GNU/Linux также нужен пакет соответственно python3.6-venv или выше для виртуального окружения)

  • СУБД

  • 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-адреса


Стоит отметить основной недостаток этого проекта, он вытекает из недостатка flow-tools - отсутствие поддержки netflow 9й версии. Что влечет за собой отсутствие поддержки 32 битных номеров AS. Все "длинные" ASN будут отображаться как AS23456. Что весьма прискорбно. Поэтому в будущем планы на написание собственного netflow коллектора.

Как видите, я постарался как можно подробнее описать процесс установки и использования (что было в моих силах). Кое-какую документацию я положил и в репозиторий на Github.

Но я конечно готов ответить на вопросы, если такие возникнут.

На этом все, удачного использования!






Разместим вашу рекламу

Пиши: mail@pythondigest.ru

Нашли опечатку?

Выделите фрагмент и отправьте нажатием Ctrl+Enter.

Система Orphus