Збираємо статистику за допомогою NetFlow

  1. Кілька слів про NetFlow
  2. Встановлюємо сенсор на Linux
  3. колектор
  4. налаштовуємо NFSen

Будь-системний адміністратор рано чи пізно стикається з необхідністю збору статистики по витрачанню трафіку, використовуючи яку, він завжди зможе відповісти на питання начальства: хто, на які адреси, коли і скільки. Для вирішення цього завдання сьогодні створено безліч рішень і технологій, найбільш популярним з них є NetFlow.

Кілька слів про NetFlow

Мережевий протокол NetFlow спочатку розроблявся Cisco (goo.gl/vM2l7) для технології комутації пакетів в пристроях цієї корпорації, але сьогодні використовується, в основному, для обліку трафіку. Його специфікації відкриті, тому з часом NetFlow став стандартом і застосовується не тільки в Cisco, а й рішеннях інших фірм (на кшталт Juniper і Enterasys) і ОС.
На сьогодні відомо кілька версій. Протокол NetFlow v1, створений в 1990 році, використовувався в маршрутизаторах для комутації пакетів, коли перший пакет потоку створював запис в таблиці маршрутизації (по суті кеш), яка потім застосовувалася до всього потоку. Приблизно така ж технологія сьогодні задіюється і в Netfilter. Останньою на сьогодні є дев'ята версія протоколу, що вийшла в жовтні 2004 року і описана в RFC 3954. На основі v9 з декількома розширеннями був створений протокол IPFIX (IP Flow Information Export, RFC 3917), який в кулуарах називають NetFlow v10. При цьому v2-4 є внутрішньою реалізацією Cisco, що не отримала великого поширення. Тому після першої версії відразу з'явилася найбільш популярна v5, можливостей якої досить для більшості завдань в IPv4 мережах. Мережевий трафік аналізується на рівні сеансів, запис (flow record) створюється для кожної транзакції TCP / IP. У v5 зберігаються дані про версії протоколу, інтерфейси, часу початку і закінчення з'єднання, IP і портах джерела і призначення, кількості байт і пакетів, TOS і TCP прапори. Дев'ята версія розуміє заголовки IPv6, мітки потоків MPLS, адреса шлюзу BGP і додаткові поля. Наприклад, в Cisco ASA NetFlow використовується для динамічного відстеження потоків. Щоб виявити різні події, як раз і задіюються спеціальні поля v9 (Netflow Security Event Loging, NSEL), які потім зіставляються з шаблонами.
Для збору і подальшого аналізу інформації про трафік по протоколу NetFlow потрібна наявність наступних компонентів:

  • Сенсор - збирає статистику по всіх сеансів (потокам трафіку, flows) і відправляє колектора. Сенсори встановлюються на всіх маршрутизаторах або інших пристроях, статистику з яких необхідно зібрати. Залежно від налаштувань, інформація скидається після того, як сенсор визначив, що потік закінчився, або періодично в міру накопичення даних.
  • Колектор - збирає дані, одержувані від сенсорів по UDP або SCTP (Stream Control Transmission Protocol), і забезпечує їх зберігання, формат зберігання залежить від реалізації. Колектор зазвичай приймає дані про трафік на 2055 порту, але в деяких реалізаціях це може бути 9555, 9995 або будь-який інший визначений адміністратором;
  • Аналізатор - аналізує зібрані колектором дані і виводить їх у вигляді звітів (таблиці і графіки).

Можна встановити комплексне рішення, коли розробник пропонує всі три компоненти, або зібрати свій варіант - сенсор + колектор + аналізатор. В останньому випадку слід враховувати сумісність форматів колектор - аналізатор, хоча деякі проекти пропонують свої конвертери з одного формату в інший.
У перевантажених мережах можлива втрата UDP пакетів, а UDP не інформує про необхідність повтору, це може спотворити статистику, особливо з огляду на, що сенсор не зберігає скинуті дані. Ця проблема особливо актуальна для v8 і v9, де в один пакет може бути об'єднана інформація про кількох потоках. У цьому випадку деякі реалізації дозволяють використовувати SCTP. Хоча цей протокол теж неідеальний, так як вимагає взаємодії між колектором NetFlow і кожним сенсором NetFlow. У разі якщо колектор обслуговує велику кількість сенсорів, можуть бути затримки і, знову ж таки, втрати. Також використання UDP краще, коли сенсор зав'язаний на кілька колекторів, адже UDP дуже просто реплицировать. Для цих цілей можна використовувати програму на кшталт samplicator (code.google.com/p/samplicator), що відправляє копії UDP на кілька адрес. Крім цього, ретранслювати отримані дані можуть і деякі колектори. До речі, за номерами пакетів колектор може визначити, що інформація пропущена, і враховувати це у своїх розрахунках.
Протокол TCP, в силу своєї специфіки, не підходить для передачі такого обсягу даних, так як будуть виникати затримки через встановлення зв'язку і збору всіх пакетів (буде потрібно також виділити деякий буфер, що також спричинить витрати).
У деяких маршрутизаторах, що працюють на високонавантажених магістралях, використовується спрощена реалізація Sampled NetFlow, коли вважаються не всі пакети, а деякі, через певний проміжок (в різних реалізаціях свій алгоритм). Неважко здогадатися, що Sampled NetFlow показує не точну, а приблизну статистику, хоча для деяких завдань цього цілком достатньо.

Встановлюємо сенсор на Linux

Підтримка сенсорів NetFlow сьогодні реалізована в багатьох апаратних маршрутизаторах, прошивках DD-WRT і ОС. Наприклад, в анонсованому недавно VMware vSphere 5 з'явилася підтримка Netflow v5, що надає можливість переглядати трафік між віртуальними машинами на одному або різних хостах. Відстежуючи потік трафіку додатків всередині віртуальної машини, адмін може контролювати продуктивність мережі і цільове використання трафіку. Для Cisco активація NetFlow для передачі на колектор 192.10.0.2:9001 дуже проста:

router (config) # interface fastethernet 0/0 router (config) # ip route-cache flow router (config) # ip flow-export version 5 origin-as router (config) # ip flow-export 192.10.0.2 9001 router (config ) # ip flow-cache timeout active 5

Ось далеко не всі варіанти NetFlow-сенсорів, за допомогою яких можна збирати статистику в різних ОС:

  • fprobe (fprobe.sourceforge.net) - працює в Linux, базується на libpcap, є форк fprobe-ulog, який використовує libipulog;
  • ipt-netflow - працює в Linuх і складається з двох модулів: ядра і iptables;
  • Softflowd (code.google.com/p/softflowd) - працює в Linux / FreeBSD, підтримує NetFlow v1 / v5 / v9 /;
  • Pfflowd (mindrot.org/projects/pfflowd) - працює в OpenBSD;
  • nProbe (ntop.org/products/nprobe) - розширювана сенсор / колектор під Linux, FreeBSD і Windows, що підтримує NetFlow v5 / v9 / IPFIX;
  • ipcad (lionet.info/ipcad) - сенсор для Linux, FreeBSD, OpenBSD, Mac OS X / Darwin і Solaris, що підтримує raw BPF-пристрої, PCAP, iptables ULOG & IPQ;
  • fSonar (softpiua.com/ru/products/softpi/fsonar.html) - сенсор для Windows, що підтримує NetFlow v5 / v9;
  • ndsad (ndsad.sf.net) - сенсор, який підтримує NetFlow v5 для Windows (winpcap), Linux (libpcap), Mac OS X і FreeBSD;
  • PRTG Network Monitor (paessler.com/netflow_monitoring) - пропрієтарних «все в одному» рішення для моніторингу Windows від XP і вище (10 сенсорів безкоштовно).

Якщо в мережі вже є працюючий маршрутизатор, який видає NetFlow, цю частину статті можна пропустити. Ми ж припустимо, що у нас налаштований роутер на Ubuntu / Debian, і ми хочемо збирати статистику.
Якщо в мережі вже є працюючий маршрутизатор, який видає NetFlow, цю частину статті можна пропустити

$ Sudo apt-get install fprobe

В процесі установки пакета будуть задані питання щодо інтерфейсу для збору статистики і хоста колектора (потрібно вказати IP-адресу та номер порту). Після чого стартує демон з вказаних настройок. В подальшому всі параметри можна змінити у файлі / etc / default / fprobe:

$ Sudo nano / etc / default / fprobe # Якщо все інтерфейси, тоді пишемо "any" INTERFACE = "eth0" FLOW_COLLECTOR = "192.10.0.2:9001" # Додаткові аргументи; так '-f' дозволяє вказати специфічні умови вибірки трафіку; найбільш популярним є відбір тільки IP-пакетів, тобто '-Fip' OTHER_ARGS = "- fip"

Аргументів у fprobe дуже багато, в високонавантажених мережах можливо потрібно коректування пріоритету (установкою r більше 0), буфера ядра для захоплення пакетів (B і q), затримки між відправленнями (t)
Аргументів у fprobe дуже багато, в високонавантажених мережах можливо потрібно коректування пріоритету (установкою r більше 0), буфера ядра для захоплення пакетів (B і q), затримки між відправленнями (t). Тепер за допомогою tcpdump можна переглянути надіслані на віддалену систему пакети.

$ Sudo tcpdump -n udp port 9001

Для зручності можна використовувати фільтр для вилову тільки NetFlow «-T cnfp«
Для зручності можна використовувати фільтр для вилову тільки NetFlow «-T cnfp«. Також просто налаштовується і Softflowd. Все, інформація пішла, але поки «в нікуди», саме час почати її збирати.

колектор

Вибір зв'язки колектор + аналізатор справа відповідальна і залежить від необхідності в подальшій обробці даних і їх візуалізації. Найвідомішим колектором є пакет flow-tools, що розробляється Марком Фуллмером і містить масу корисних інструментів, за допомогою яких можна обробляти зібрану інформацію. Разом з flow-tools можна використовувати кілька аналізаторів - Perl-скрипт flowscan (caida.org/tools/utilities/flowscan), що обробляє отримані flow-capture (колектор NetFlow з пакета flow-tools) дані і зберігає результат в базі даних RRD. Для візуалізації flowscan може використовувати додаткові модулі звітів: CUFlow, CampusIP, SubNetIO. Це дуже цікавий варіант, але мені більше подобається nfdump (nfdump.sf.net), що підтримує NetFlow v1 / v5 / v7 / v9 і IPFIX (поки бета), для перегляду зібраної інформації якого використовують фронтенд NfSen (Netflow Sensor, nfsen.sf. net). Причому доступна і NSEL версія nfdump, що підтримує додаткові записи Cisco ASA.
Сам nfdump є пакет з декількох утиліт: nfcapd (демон, який читає потік і зберігає інформацію в файл), nfdump (зчитує дані з файлу і виводить статистику), nfprofile (зчитує дані з файлу і застосовує до них фільтри, інформацію зберігає в інший файл для подальшого використання), nfreplay (зчитує дані з файлу і відправляє по мережі на віддалену систему / колектор), nfclean.pl (видалення старих даних), ft2nfdump (конвертер даних flow-tools в формат nfdump).
За замовчуванням демон nfcapd кожні 5 хвилин створює файл з новим ім'ям (включає мітку часу, щоб не повторюватися), який потім аналізується nfdump. Потрібний пакет є в репозитарії, тому установка nfdump в Ubuntu / Debian дуже проста.

$ Sudo apt-get install nfdump

Роботу nfcapd і nfdump в більшості випадків налаштовують через NfSen. Саме тому всі демони пакета nfdump за замовчуванням не стартують, у чому легко переконатися, заглянувши в / etc / default / nfdump:

$ Cat / etc / default / nfdump # nfcapd is controlled by nfsen nfcapd_start = no

Але для початку переконався, що все працює. Запускаємо демон для збору nfcapd статистики, в якості параметра вказуємо каталог для зберігання файлів і UDP порт:

$ Sudo nfcapd -w -D -l / var / cache / nfdump / router1 -p 9001

Якщо адрес кілька, а потрібно вибрати один, вказуємо потрібний за допомогою '-b'. Параметр «-R host / port» дозволяє відразу переправити NetFlow пакети на інший вузол. За допомогою параметра '-p' можна зчитувати дані не з мережі, а з pcap файлу.
Щоб прочитати і вивести таблицю з усіма зібраними даними за допомогою nfdump, досить вказати каталог:

$ Sudo nfdump -R var / cache / nfdump / router1 Date flow start Duration Proto Src IP Addr: Port Dst IP Addr: Port Packets Bytes Flows 2012-07-05 10: 09: 12.112 0.001 UDP 22.22.22.22:1234 -> 192.10 .19.10: 22, 1 400 1

На перший погляд, інформації небагато, але це якщо не знати, що nfdump вміє виводити інформацію в чотирьох різних форматах (line, long, extended і custom), а за замовчуванням використовується самий «мовчазний» line. Щоб змінити формат, слід використовувати параметр '-o'. Утиліта nfdump має велику кількість параметрів і фільтрів, що дозволяють відібрати потрібну інформацію, все це описано в «man nfdump», тому детально зупинятися тут не будемо.

налаштовуємо NFSen

Переходимо до налаштування NFSen. У репозитариях потрібного пакету немає, тому установку потрібно робити вручну. Сам додаток написано на PHP і Perl, для побудови графіків використовується RRDtool. Для його роботи потрібно стандартний LAMP сервер і Perl модулі Mail :: Header і Mail :: Internet. Встановлюємо додатки для задоволення залежностей:

$ Sudo apt-get install apache2 libapache2-mod-php5 \ php5-common libmailtools-perl rrdtool librrds-perl

Завантажуємо і розпаковуємо останню версію.

$ Wget -c http://goo.gl/CYk4s $ tar xzvf nfsen-1.3.6p1.tar.gz $ cd nfsen-1.3.6p1

Перейменовуючи і правимо шаблон конфігураційного файлу. На початку файлу йде багато змінних, що вказують на каталоги установки, в більшості випадків немає необхідності їх змінювати.
Перейменовуючи і правимо шаблон конфігураційного файлу

$ Cp etc / nfsen-dist.conf etc / nfsen.conf $ nano etc / nfsen.conf $ BASEDIR = "/ usr / nfsen"; # Каталог, в який буде встановлено скрипти $ HTMLDIR = "/ var / www / nfsen /"; # Каталог, в який встановлено утиліти пакета nfdump $ PREFIX = '/ usr / bin'; Користувач і група, від імені яких запускається веб-сервер $ USER = "www-data"; $ WWWUSER = "www-data"; $ WWWGROUP = "www-data"; # Джерела, можна вказати кілька, для виділення різними кольорами використовується параметр "col"% sources = ( 'ROUTER1' => { 'port' => '9001', 'col' => '# 0000ff', 'type' => 'netflow'},); $ MAIL_FROM = '[email protected]'; $ SMTP_SERVER = 'smtp.example.com';

Крім цього, у файлі можна встановити буфер для nfcapd, розширення для кожного колектора, налаштувати каталоги для збору даних і багато іншого. Ставимо.

$ Sudo ./install.pl etc / nfsen.conf

Скрипт перевірить наявність необхідних Perl-модулів, після чого скопіює компоненти за вказаними в nfsen.conf каталогам. Запускаємо nfsen, він активує процеси nfcapd:

$ Sudo / usr / nfsen / bin / nfsen start

Забезпечуємо автозагрузку:

$ Sudo ln -s / usr / nfsen / bin / nfsen /etc/init.d/nfsen $ sudo update-rc.d nfsen defaults 20

Створюємо настройки для Apache:

$ Sudo nano /etc/apache2/conf.d/nfsen.conf DirectoryIndex nfsen.php

Тепер набираємо в браузері адресу http: //імя_сервера/nfsen/nfsen.php і насолоджуємося генеруються графіками і зібраної статистикою. Інтерфейс дозволяє за допомогою фільтрів і запитів відібрати інформацію тільки за певними протоколами, IP-адресами, портів і т.д. За замовчуванням використовується для всього профілю «any», для виведення графіків «proto TCP».
Тепер набираємо в браузері адресу http: //імя_сервера/nfsen/nfsen

Можливості NFsen розширюються за допомогою плагінів (sf.net/apps/trac/nfsen-plugins). Для установки плагіна його потрібно розпакувати в підкаталог plugins, а потім підключити в nfsen.conf, взявши за приклад наявні там шаблони.

Наприклад, щоб відстежити тільки SSH трафік, пишемо «src or dst port 22«, при необхідності можна вказати IP і інші параметри. Спочатку використовується тільки один профіль - Live, в який записуються дані з усіх джерел, зазначених в nfsen.conf. Щоб побудувати графіки для різних джерел або критеріїв, слід створити відповідні профілі (Live -> New Profile).
Наприклад, щоб відстежити тільки SSH трафік, пишемо «src or dst port 22«, при необхідності можна вказати IP і інші параметри
Ось ми і побудували систему статистики, яка буде забезпечувати тебе повноцінної інформацією по витраті трафіку.