FastFlowIPs

FastFlowIPs

🚨 FastFlowIPs

Як усе почалося

Опенсорс чи не опенсорс - ось у чому питання.

Дилема між «взяти щось готове» та «написати своє рідне» стала майже вічною, особливо тепер, коли кожного дня на ринку з’являється новий AI-інструмент. Але чи варто писати щось власне? Однозначної відповіді немає. Та якщо викинути страхи в /dev/null, то можна сміливо пробувати.

Історія почалася з оновлення VyOS на продакшн-роутерах до версії VyOS 1.5.x (circinus). Після цього й без того нервового процесу ми виявили, що частина правил просто зникла. Причому одна конкретна частина - і на всіх роутерах одразу. Тож ми вирішили нарешті відкрити VyOS Project Updates - і саме там натрапили на: FastNetMon-based service ids ddos-protection is removed from rolling and deprecated in LTS releases (T7241):

For quite a while, we had a CLI for configuring FastNetMon — a DDoS detection daemon. However, that integration was never especially deep, and we do not see a path to significant improvement.
The long-term plan is to move FastNetMon to an addon, once we finalize a mechanism for allowing addons to extend the system CLI. As for built-in components, the approach will be “quality over quantity” — it’s better to have a smaller number of integrations that serve a large number of users and play well together, but to provide an option for everyone to install or develop integrations for their own needs.

Після традиційних стадій «заперечення - гнів - торг» ми змирилися з відсутністю service ids ddos-protection і спробували повернути FastNetMon Community вручну. Але нас чекала стадія «депресія»: Community-версія більше не встановлювалася - здається, усі розуміють чого. Оформлювати комерційну версію ніхто, звісно, не поспішав.

Проблема не була критичною, але для нас, як для IPv4-брокера та хостинг-провайдера, такий моніторинг був важливим. Тому ми вирішили діяти негайно.

FastNetMon: дякуємо, любимо, але…

Наше знайомство з FastNetMon почалося не так давно, але інструмент швидко завоював симпатію і приносив відчутну користь, навіть попри те, що стабільно відкушував близько 30% CPU.

Весь трафік був як на долоні, Grafana сяяла метриками, і життя здавалося трохи спокійнішим. Тепер ми сидимо перед порожніми дашбордами трафіку і з якоїсь причини вирішуємо жити складніше. По примусу, звісно. І, як це зазвичай буває, тільки втративши, починаєш згадувати всі недоліки.

FastNetMon загалом виправдовував наші очікування і навіть більше. Але при всій своїй користі він збирав купу абсолютно непотрібної інформації, перетворюючи дашборди на строкате місиво з цифр і графіків. Плюс - те саме навантаження на CPU. Не критичне, але дратівливе. Тому однозначного “за” або “проти” ми так і не винесли, але душа просила простоти й легкості, а не чергової підписки і тюнінгу під кожне чихання.

Ідея написати свій інструмент прийшла не одразу. Боротьба за FastNetMon тривала - ми намагалися воскресити його, витягуючи старий бінарник з іншого сервера. Так, певною мірою це було збоченням, але мета досягнута - FastNetMon ожив. От тільки радості це не принесло. Відчуття було таке, ніби ми зібрали чучело давно покійного домашнього улюбленця: наче стоїть, наче впізнаваний, але жити з цим якось дивно.

Тому так жити не можна - одностайно вирішили ми і почали створення власного моніторингового DDoS-протектора з блекджеком і низьким навантаженням на CPU.

Ну і понеслося

Почалася розробка власного інструменту. До мозкового штурму були підключені найкращі уми та AI-моделі, внаслідок чого на світ з’явився FastFlowIPs. FastFlowIPs - це високопродуктивний інструмент моніторингу мережі eBPF, який відстежує статистику трафіку за IP-адресами в режимі реального часу. Створений для продакшн-середовищ із мінімальними накладними витратами.

Суть його роботи полягає в тому, що він захоплює мережевий трафік за допомогою eBPF, рахує статистику по IP-адресах (PPS, Mbps) і може автоматично блокувати IP-адреси, що перевищують порогові значення. Метрики експортуються по протоколу Graphite і чудово мапляться з вимогами Grafana. Дашборди виходять прості, легкі та швидко налаштовувані.

Запуск FastFlowIPs виконується однією строкою, де можна вказати -min-ips-pps та -min-flow-pps для експорту тільки найбільш значущих метрик, а також мережу й інтерфейс, які потрібно моніторити. Єдина must-have вимога - жорстко вказати -graphite-host і -graphite-port, якщо є потреба експорту метрик.

Крім того, FastFlowIPs оптимізований для мереж із високим навантаженням. На 75% менше операцій із м’ютексами, на 60% швидше обробка рядків у порівнянні з типовими реалізаціями.

Приклад конфігурації можемо розглянути нижче:

# Interface and basics
-interface eth0 # Network interface (default: eth0)
-interval 5s # Collection interval
-show-stats # Display periodic tables
-verbose # Detailed logging

# Network filtering
-networks "192.168.1.0/24" # Monitor specific networks only

# IP banning thresholds
-ban-pps-rx 1000 # Ban if receiving > 1000 PPS
-ban-pps-tx 500 # Ban if sending > 500 PPS
-ban-mbps-rx 100 # Ban if receiving > 100 Mbps
-ban-mbps-tx 50 # Ban if sending > 50 Mbps
-ban-time 5m # How long to ban
-ban-script /path/script.sh # Script to execute on ban/unban

# Graphite export
-graphite-host localhost # Graphite server
-graphite-port 32003 # Graphite port
-min-flow-pps 10 # Only export flows > 10 PPS
-min-ips-pps 5 # Only export IPs > 5 PPS

Не обійшлося і без Режимів Моніторингу, які дозволяють налаштувати цей скромний інструмент на ваш смак і колір:

  • Без звуку (за замовчуванням): відображає тільки повідомлення про блокування і запуск. Ідеально підходить для продакшену.
  • Статистика (-show-stats): показує періодичні таблиці трафіку, відсортовані за обсягом.
  • Докладний (-verbose): детальна реєстрація, включно зі статистикою експорту Graphite.

Вишенька на торті - ban-script, який буде жорстко блокувати будь-яку підозрілу активність, що перевищила вказані порогові значення:

/path/to/script.sh ban 192.168.1.100    # IP exceeded threshold
/path/to/script.sh unban 192.168.1.100 # Ban expired

Простий приклад із використанням iptables:

#!/bin/bash
case $1 in
ban) iptables -I INPUT -s $2 -j DROP ;;
unban) iptables -D INPUT -s $2 -j DROP 2>/dev/null ;;
esac

Але, в будь-якому випадку, ви завжди зможете змінити скрипт і зробити його більш/менш жорстким - залежно від вимог вашої інфраструктури.

І трохи про Graphite і метрики. Дашборд у Grafana створюється за лічені хвилини за допомогою двох основних груп метрик:

Flow метрики: **network.flows.{SRC_IP}*to*{DST_IP}.{pps,mbps}.{rx,tx}**
IP метрики: **network.ips.{IP_ADDRESS}.{pps,mbps}.{rx,tx}**

Більше деталей про FastFlowIPs можна знайти у самому репозиторії: https://github.com/denisix/fastflowips а також підтримати автора і зробити свій внесок у розвиток цього маленького, але вже корисного інструменту.

Архітектура за 3 абзаци (без страждань)

Якщо описувати інструмент людською мовою, то всередині це акуратний Go-сервіс, який слухає NetFlow-пакети, розбирає їх на складові та збирає по кожному IP найпростішу статистику: pps, mbps, вхідний/вихідний трафік, хто там взагалі шумить у мережі й навіщо. Уся математика робиться на льоту - Go ідеально підходить для таких легких, але високонавантажених операцій.

Дані агрегуються у невеликих структурах у пам’яті, сортуються й періодично відправляються назовні: або в Graphite/Grafana, або в будь-який інший sink, який ви вкажете. Блокування IP-адрес через зовнішній скрипт реалізовано в коді через пороги PPS/Mbps і виклик BanScript, якщо хтось раптом вирішив влаштувати маленький локальний DDoS-фестиваль.

Найприємніше: усе це - один чистий бінарник без тонни залежностей і без типового «пекельного малого бізнесу» навколо open-source монстрів. Конфіги - через флаги, збір статистики - напряму, логіка - прозора. У результаті вийшов легкий і чесний інструмент, який робить рівно те, що нам потрібно, без зайвої магії та важких демонів.

Результати через пару днів

Процес дебагу виявився значно довшим і складнішим, ніж сам процес написання інструмента. Спочатку в планах не було встановлення порогових значень для FastFlowIPs, тому кілька разів (багато) Grafana нервово затримувала дихання від кількості метрик і відмовлялася навіть просто показувати нам їх. У легенді дашбордів було таке число IP-адрес, що їх можна було б скролити кілька годин поспіль і, ймовірно, все одно не дійти до кінця. Прорахувалися… але де?

Дебаг то ламав, то стабілізував, то знову ламав виснажений FastFlowIPs, поки той не починав тихо плакати у corner-case-ах. Метрик було то надто багато, то надто мало, то не було взагалі нічого. Очевидно, від надлишку почуттів. Крім того, найбільшою загадкою для нас стали метрики Flows RX/TX, які трохи переплутались місцями - що чудово можна було відстежити в реальному часі на роутерах VyOS. Над цією задачею ламали голову найвидатніші уми нашої команди, після чого все ж таки мета була досягнута: метрики стабілізовані, а Grafana позбулася астми.

На сьогоднішній день ми маємо причісані, акуратні й інформативні метрики, що відображають потрібний нам мережевий трафік:

fastflowips-1

fastflowips-2

fastflowips-3

fastflowips-4

Коли варто писати свій міні-FastNetMon

Свої велосипеди - зло. Поки не настає момент, коли без них взагалі ніяк.

Писати власний інструмент однозначно варто, коли готові рішення або занадто важкі, або занадто розумні для вашої задачі. Коли вам не потрібні 100500 фіч, інтеграції з космічною станцією і dashboard’и на 19 екранів; коли вам потрібні просто числа - швидко і без головного болю.

Також варто задуматися про власне рішення, якщо ситуація вимагає гнучкості: потрібно швидко додати метрику, вшити анти-DDoS логіку під себе, подружити моніторинг з кастомним залізом або просто обійти обмеження, які раптово випиляли з улюбленої прошивки (щирі вітаннячка VyOS 1.5).

Коротше, своє рішення - це про контроль, швидкість, мінімалізм і відсутність залежностей, які раптово зникають із репозиторіїв. Головне - не забувати золоте правило: якщо це можна зробити простіше - зроби простіше.

І ще одне правило: якщо працює - не чіпай.

Закривалочка

У підсумку вся ця історія - не про трафік, не про DDoS і навіть не про FastNetMon.
Вона про те, що інколи команда просто хоче інструмент, який працює, не ламається після апдейта і не перетворює життя на Втечу з Шоушенка.

Ми не винайшли велосипед - ми зібрали свій маленький самокат, який ідеально їде саме по нашій доріжці. І в цьому немає нічого поганого. У світі, де величезні open-source проекти живуть своїм життям, приємно мати щось своє, рідне й передбачуване.

Тож якщо ви теж колись дивилися на черговий «ідеальний, але надто вже ідеальний» інструмент і думали: «та простіше написати самому» - можливо, ви на правильному шляху. Просто робіть це з розумом, тестами і приготуйтеся страждати.

networking ebpf ddos monitoring grafana graphite