Слідкуємо за трафіком за допомогою протоколу NetFlow, Для системного адміністратора
Слідкуємо за трафіком за допомогою протоколу NetFlow.
Про системи підрахунку трафіку написано багато. Але cnupm, trafd та інші «рахунки» – це суто утилітарні програми, які підходять лише для конкретних випадків. А якщо підрахунок трафіку і подання його в красивій формі (наприклад, на web-сторінці) не самоціль? Що якщо треба просто мати можливість контролювати трафік, що ще приходить з декількох маршрутизаторів? У цьому нам допоможе протокол NetFlow.
NetFlow - це пропрієтарний, але відкритий протокол, спочатку розроблений компанією Cisco для свого заліза з метою централізованого збору інформації про мережевий трафік. Однак технологія вийшла настільки вдалою, що її застосування можна зустріти будь-де: починаючи від залізок інших виробників і закінчуючи програмними маршрутизаторами під *nix. Архітектура NetFlow складається з трьох основних компонентів:
- сенсор;
- колектор;
- обробник даних, візуалізатор.
NetFlow? Так!
Отже, ми будемо рахувати трафік за допомогою NetFlow. Точніше, не рахувати, а збирати інформацію, адже NetFlow саме збирає інформацію про трафік, яку надалі можна обробляти. Підрахунок трафіку – це лише одне прикладне завдання. Тож будуватимемо систему контролю або обліку трафіку. Маючи таку систему, адміністратор завжди може дати оперативну відповідь на запитання на кшталт: «Скільки трафіку спожив кожен хост за довільний проміжок часу?», «З якими хостами було проведено найінтенсивніший обмін трафіком?», «Хто сьогодні перевищив ліміт у 100 Мб вхідного трафіку ?», «Хто, коли і звідки витягнув 20 гігів, за які вищий провайдер виставив нам рахунок?» і т.п.
Спочатку ми налаштуємосенсори на машинах в мережі, потім налаштуємо колектор, в який сенсори будуть відправляти інформацію про трафік. Потім розглянемо приклади того, як за допомогою NetFlow-даних, спеціальних утиліт для роботи з ними та базових знань у галузі shell-скриптингу відповісти на питання типу згаданих вище. Завдання ефектної візуалізації отриманих даних виходить за рамки цієї статті та буде вирішено у наступних номерах журналу.
Існує безліч програмних реалізацій компонентів NetFlow під *nix-подібні системи. Ми зупинимося на наступних:
- softflowd як NetFlow-сенсор;
- flow-tools як утиліт для збору інформації про трафік та роботи з нею.
Вибір цих програм обумовлений їх популярністю та можливостями роботи під безліччю варіацій *nix-систем. Існують також програми, заточені під будь-яку конкретну операційну систему. Наприклад, у випадку OpenBSD як сенсор рекомендується використовуватиpfflowd, що працює у зв'язці з пакетним фільтром PF. Той же розробник пропонуєflowd – маленький, швидкий та безпечний NetFlow-колектор, до якого додається набір утиліт flowrrd для відображення NetFlow-даних у rrd-базі (для подальшої обробки їх за допомогою RRDtool).
Як колектор будемо використовувати машину під керуванням FreeBSD 6. Сенсор поставимо на шлюз під керуванням OpenBSD 4.1.
Встановлення та налаштування
Установку flow-tools на FreeBSD будемо робити штатно, з портів:
$ cd /usr/ports/net-mgmt/flow-tools $ sudo make install clean
В результаті буде встановлена маса утиліт для роботи з NetFlow. Детальну інформацію про те, що поставлено з порту, можна отримати, наприклад, за допомогою команди:
$ pkg_info -L flow-tools-0.68_1
Зараз нас цікавить лише одна програма із набору – flow-capture. Це і є той колектор, який збирає інформацію з сенсорів. Аргументи запуску наступні:
/usr/local/bin/flow-capture -p /var/run/flow-capture.pid -N 3 -w /var/log/netflows -S 5 192.168.76.146/192.168.76.147/8818
В результаті нашого налаштування колектор слухатиме на хосту 192.168.76.146 (порт 8818/udp) і прийматиме з'єднання з колектора на машині 192.168.76.147.
Залишилося лише прописати колектор у автозапуск. На жаль, порт flow-tools не містить rc-скрипт для запуску колектора у FreeBSD-стилі, тому ми самі створимо flowd.sh наступного змісту:
# vi /usr/local/etc/rc.d/flowd.sh #!/bin/sh . /etc/rc.subr name=flowd rcvar=`set_rcvar` load_rc_config $name : $ : $ p > command=/usr/local/bin/flow-capture command_args="-p $ -N 3 -w /var/log/netflows -S 5 192.168.76.146/192.168.76.147/8818" stop_postcmd=stop_postcmd stop_postcmd() rm -f $pidfile > run_rc_command "$1"
Не забуваємо додати запис "flowd_enable="YES"" /etc/rc.conf.
Завдяки дивовижним pkg_tools установка сенсора на OpenBSD необтяжлива. При прописаній PKG_PATH набираємо:
$ sudo pkg_add softflowd-0.9.8
І річ у капелюсі. Прописати демон в автостарт «по-опенківському» також не становить проблем. У /etc/rc.local додаємо:
# vi /etc/rc.local if [-x /usr/local/sbin/softflowd]; then echo -n 'softflowd'; /usr/local/sbin/softflowd -i fxp0 -n 192.168.76.146:8818 fi
Тут fxp0 – інтерфейс, через який проходить трафік і слухатиме сенсор; 192.168.76.146:8818 – хост і порт колектора, на який сенсор надсилатиме дані про потоки трафіку.
Керуємо!
Якщо все запущено і працює коректно, то на сенсорі ми побачимо приблизно наступну інформацію щодо поточних netflow-потоків:
# softflowctl statistics softflowd[26337]: Accumulated statistics: Number of active flows: 925 Packets processed: 14552628 Fragments: 84 Ignored packets: 1100 too short) Flows видалено: 1013171 (0 forced) Flows вивезено: 1980130 в 74625 пакети (0 failures) .
А в каталозі /var/log/netflows мають з'явитися зібрані дані:
Тепер починається найцікавіше – те, заради чого ми всі затіяли. Озброївшись утилітами з набору flow-tools та мінімальними знаннями shell-скриптингу, ми маніпулюватимемо інформацією про трафік, ставлячи її під всебічний облік!
Нам знадобляться такі утиліти:
- flow-cat для конкатенації кількох netflow-файлів;
- flow-stat для генерації звітів за netflow-файлами;
- flow-print для виведення інформації про netflow-потоки у текстовому вигляді.
Перелік завдань, які можна вирішувати за допомогою flow-tools, обмежується лише фантазією адміністратора. Спробую окреслити типове коло завдань, під які будуть написані скрипти:
- Повідомлення адміністратора про перевищення будь-якою машиною денного ліміту трафіку N Мб з можливістю блокування цієї машини пакетним фільтром «до з'ясування обставин».
- Повідомлення адміністратора про перевищення сервером місячного ліміту трафіку в N Гб. Інформативно та корисно для самоконтролю, наприклад, у ситуації, коли в конторі є сервери, а оплата інтернету здійснюється за трафіку з оплаченим лімітом.
- Детальна, відсортована netflow-інформація щодо трафіку за будь-який день, місяць, рік. Зручна дляз'ясування питань на кшталт: «А хто й звідки у нас п'ятого числа хитнув 800 мегабайт?».
- Архівація старих netflow-даних (місячної давності).
Приклад обробки записів за допомогою flow-cat та flow-stat:
flowcat="/usr/local/bin/flow-cat" flowstat="/usr/local/bin/flow-stat" flows="/var/log/netflows" $flowcat $flows/$year/$month/$day $flowstat -f10 -p -S3
Результатом буде таблиця з п'яти колонок: src ip, dst ip, number of flows, number of bytes, number of packets. З'ясувати, хто ж перевищив ліміт, можна, наприклад, так:
SUBJ="$INBOUND TRAFFIC ALERT" MSG="Alert. Певні машини можуть більше 100 mbytes today. See details below." $flowcat $flows/$year/$month/$day $flowstat -f10 -p -S3 tail -20 \ while read SRC DST undef COUNT undef; do if [ $COUNT -gt 100000000 ]; then echo -e "$MSG\n$COUNT bytes з $SRC to $DST" mail -s "$SUBJ" toxa echo $DST >> /etc/pf.blockedusers fi done
table persist file /etc/pf.blockedusers block quick from to any
Зрозуміло, всі приклади розумно рознести за відповідними скриптами та виконувати їх за допомогою cron(8) з певною періодичністю.
Відзначу три цікаві програми у наборі flow-tools(1):
- flow-dscan – аналізує netflow-потоки щодо спроб сканування портів і наявності некоректно сформованих пакетів;
- flow-gen - генерує тестові netflow-потоки, корисно для налагодження;
- flow-rptfmt - дозволяє виводити netflow-дані в HTML.