LINUX.ORG.RU

FastNetMon 1.0.0 — программа для выявления входящих/исходящих атак

 , , ,


9

6

Хотел бы поделиться своей программой для анализа проходящего миррор-порты/роутеры/OpenVZ ноды трафика на предмет входящих/исходящих DDoS атак.

  • Для чего она писалась? Чтобы фиксировать серьезные всплески в сотни kpps по полосе/pps как со стороны клиентов, так и со стороны интернета в сторону клиентов.
  • Что выдает? Выдает топ 10 самых активных потребителей ресурсов сети, выборки топ 10 можно делать как по pps так и по трафику.
  • Что умеет? Умеет передавать управление внешнему скрипту, который передаст IP на/с которого идет атака на анализ группе администраторов либо заблокирует его на некоторое время.
  • На чем работает? Поддерживает PF_RING (рекомендуется), pcap (не рекомендуется) и ULOG2 (не рекомендуется).
  • Что еще умеет? Умеет считать трафик по заданным диапазонам, решение базируется на redis и используется в исключительно внутренних целях.
  • На каком канале работает? Приложение сейчас в продакшене (на миррор портах, с отдельной машины) с нагрузкой в несколько гигабит входящего+исходящего трафика с примерно 550kpps и более в среднем. Ресурсы почти не жрет — около 10% по всем ядрам на i7 2600.
  • На какой платформе точно работает? Debian/CentOS/Ubuntu. Но скомпилировать можно только на Debian 7.
  • На чем написано? C++ 11.

>>> Подробности



Проверено: fallout4all ()
Последнее исправление: ymn (всего исправлений: 2)

Ответ на: комментарий от Mr_Alone

Сейчас самый фиговый паблик бот динамично их меняет. Про приват вообще молчу.

Marlboro
()
Ответ на: комментарий от DeadEye

Боюсь, что с clang ничего не выйдет, по крайне мере в моем Wheezy:

clang++ -std=c++11 -static -DPF_RING -DREDIS -I/opt/pf_ring/include  -c fastnetmon.cpp -o fastnetmon.o 
In file included from fastnetmon.cpp:45:
In file included from /usr/include/c++/4.6/thread:37:
/usr/include/c++/4.6/chrono:666:7: error: static_assert expression is not an integral constant expression
      static_assert(system_clock::duration::min()
      ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

И баг этот фиксится, боюсь, только ожиданеим следующего релиза Debian.

Может кто попробует в Ubuntu/Fedora собрать проект силами clang?

nrg
() автор топика
Ответ на: комментарий от rms_is_our_savior

В том числе :) Но для вычисления узлов ботнета у нас есть более специфичная штука: Antidoto, но там пока далеко не все идеи еще реализованы.

nrg
() автор топика
Ответ на: комментарий от nrg

Попробую силами GCC 4.9.0 (G++), потом своим clang 3.4.1. Если скомпилится, напишу.

DeadEye ★★★★★
()
Ответ на: комментарий от reprimand

Поидее, не вижу причин, противоречащих этому, правда, придется использовать медленный PCAP, ибо PF_RING'а под FreeBSD нету.

Ну или жду патчи, если кто-то интегрирует netmap =)

nrg
() автор топика
Ответ на: комментарий от nrg

Может быть кто-то займется лоббированием вопроса по добавлению PF_RING в Gentoo?

А что там лабировать — запилите баг на багзилле и ебилд. А, вот же он: https://bugs.gentoo.org/show_bug.cgi?id=366609

netmon should probably take this. I'll see about merging the two ebuilds, or Jason can.

Так что ждите. Или помогите пилить.

wayland_systemd
()

PF_RING (рекомендуется), pcap (не рекомендуется)

А вы замеряли насколько медленнее работает pcap? Много он дропает пакетов? Сильно ли больше загрузка CPU?

Насколько я понял, PF_RING это практически тот же pcap только с zero-copy. В libpcap 1.0 и выше тоже это есть (ну, почти)

Насколько реально отличается производительность механизмов в вашей программе?

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за интерес, статистика созранилась даже.

При потоке в 100 pps: 
PCAP statistics
Received packets: 6353168
Dropped packets: 848902 (13%)
Dropped by driver or interface: 1

При потоке в 250 kpps потери превышали 30%, иными словами проще сказать не «pcap медленнее», а «pcap вообще не может справится».

Ulog2 на тех же скоростях выдавал статистику чуточку получше:

ULOG buffer errors: 2904 (0%)
ULOG packets received: 210776

Но при этом отъедал почти полностью одно ядро и не хотел масштабироваться по всем ядрам, что приводило к тому, что в райооне 300 kpps начинались потери за 40%.

Если в libpcap 1.0.0 добавят модуль ядра а-ля PF_RING, я с радостью его протестирую :)

nrg
() автор топика
Ответ на: комментарий от AS

Я уже не помню. Мы слали им патчи для фикса блокировок, их приняли и все стало более-менее стабильно. Потом после полугода в продакшене мы решили обновить модуль и все снова встало колом на тех же самых блокировках. Ну и в этот момент мы вкинули модуль :)

nrg
() автор топика
Ответ на: комментарий от nrg

Его нет в репозиториях почти всех дистрибутивов

В ALT, кстати, есть для некоторых ядер:

$ apt-cache search pf_ring
kernel-modules-pf_ring-drivers-std-def - Standard drivers that have been enhanced with PF_RING native support
kernel-modules-pf_ring-std-def - pf_ring kernel modules
kernel-modules-pf_ring-drivers-std-pae - Standard drivers that have been enhanced with PF_RING native support
kernel-modules-pf_ring-std-pae - pf_ring kernel modules
libpfring1.0 - User space library used to manpulate PF_RING
kernel-headers-pf_ring - Header files for the PF_RING module
kernel-source-pf_ring - Packet capture acceleration by means of a ring buffer

AS ★★★★★
()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от nrg

PF_RING это не только zero-copy. Там вся суть в том что: 1) Трафик не попадет в стек Linux для последующей обработки вообще 2) Трафик накапливается в кольцевых буферах внутри ядра и оттуда очень эффективно блоками копируется в юзерспейс

nrg
() автор топика
Ответ на: комментарий от nrg

Ответил выше, кратко - С++11:)

std::vector<pair_of_map_elements> vector_for_sort; for( map_for_counters::iterator ii=my_map_packets.begin(); ii!=my_map_packets.end(); ++ii) { vector_for_sort.push_back( make_pair((*ii).first, (*ii).second) ); }

1. для vector_for_sort забыли сделать .reserve(my_map_packets.size()) 2. for совсем не по C++11 написан (auto - красивше) 3. Потестируйте boost::unordered_map - он может оказаться лучше http://tinodidriksen.com/2009/07/09/cpp-map-speeds/

anonymous
()
Ответ на: комментарий от anonymous

Спасибо большое! Не знал, что auto можно использовать в компиляторах без полной поддержки С++11, очень удобно, отрефакторил код с ним.

Также заменил std::map на boost::unordered_map. Я давно присматривался к unordered_map, но std::unordered_map бажный ужасно и откровенно падал, поэтому вернулся на std::map.

Поверхностные тесты std::map vs boost::unordered_map показли такие результаты:

std::map 41% cpu
boost::unordered_map 25% cpu

Теперь осталось кривой belongs_to_network преписать на patricia и все будет ок!

nrg
() автор топика
Ответ на: комментарий от nrg

А зачем ждать добавления модуля в libpcap, когда pf_ring предоставляет обертку над libpcap, которая вполне себе фунциклирует через LD_PRELOAD? :)

anonymous
()

Ubuntu 14.04, g++ 4.8.2. Попытка собрать fastnetmon кончается тем, что

g++ -static libipulog.o fastnetmon.o -o fastnetmon -L/opt/pf_ring/lib -lhiredis -lpfring -lnuma -lrt -lpthread -I../PF_RING-6.0.1/userland/lib -I../PF_RING-6.0.1/kernel -L../PF_RING-6.0.1/userland/lib
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libhiredis.a(net.o): In function `redisContextConnectTcp':
(.text+0x4ae): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
../PF_RING-6.0.1/userland/lib/libpfring.a(pfring_mod.o): In function `pfring_mod_set_bpf_filter':
pfring_mod.c:(.text+0x1241): undefined reference to `pcap_compile_nopcap'

dexpl ★★★★★
()
Ответ на: комментарий от anonymous

То бишь, собираем под обычный libpcap, а потом бац - подкладываем pf_ring. Потом - netmap (там тоже есть обертка, но недоразвитая).

anonymous
()
Ответ на: комментарий от anonymous

Да, разумеется, это возможно. Но прямое использование PF_RING намного гибче и удобнее. При нем можно использовать встроенные парсеры пакетов, а также управлять очередями.

nrg
() автор топика

кривой велосипед, сделанный в свободное от работы время на заводе мягкой игрушки из отходов производства, который, пока, может поворачивать только направо, не имеет тормозов, заднего колеса и амортизаторов под сиденьем.

любой не слишком криворукий админ знает, как все это делается любой тулзой, собирающей netflow.

anonymous
()
Ответ на: комментарий от anonymous

Netflow на мой взгляд не совсем верный путь решения данной проблемы, так как его генерация сама по себе часто сильно перегружает машину (если это, скажем, Linux box или не high end роутер).

А кроме того, практикуемое в NetFlow сэмплирование (уплотнение) данны[ может привести к тому, что агент сгенерирует NetFlow об атаке уже тогда, когда атака станет очень мощной и уже ляжет вся сеть.

На Linux все усложняется тем, что сам по себе ipt_netflow не особенно стабилен.

nrg
() автор топика
Ответ на: комментарий от anonymous

кривой велосипед, сделанный в свободное от работы время на заводе мягкой игрушки из отходов производства, который, пока, может поворачивать только направо, не имеет тормозов, заднего колеса и амортизаторов под сиденьем.

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

любой не слишком криворукий админ знает, как все это делается любой тулзой, собирающей netflow.

Да вы что? А я вот отказался от netflow и мне почему-то кажется, что производительность программы автора будет намного выше, нежели netflow-based костыли.

Wheely
()

Для того чтобы собирать метрики для каждого IP-адреса можно использовать netflow (или ipfix) с маршрутизатора. Главное продумать куда складывать и сколько хранить. Для быстрого доступа к общим метрикам - складывать в какой-нибудь редис. Если требуется проверить «а не сканировали ли наших клиентов на наличие только что опубликованной уязвимости за месяц до её публикации», то можно и подождать пару часиков. Конечно, далеко не всё можно вычислить используя netflow как источник данных, но и не мало :)

Кроме сбора метрик по трафику, что ещё может делать ваш инструмент? Как вы по всплеску трафика определяете что это именно участник DDoS'а, а не клиент решил скачать/залить свежие бэкапы с «жирного» канала? (Это же живого человека на полную ставку нанимать надо чтобы он каждые всплески проверял) Мониторятся ли «отпечатки» ботнетов по трафику?

technoid
()
Ответ на: комментарий от nrg

А как у Вас PF_RING собран, как указано в гайде на GitHub?

Да, кроме make install и modprobe pf_ring (надеюсь, для компиляции загруженный модуль не нужен?:). Собираю fastnetmon командой make BUILD_FLAGS="-I../PF_RING-6.0.1/userland/lib -I../PF_RING-6.0.1/kernel -L../PF_RING-6.0.1/userland/lib"

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

Это бага-фича либа PF_RING, чтобы все собралось без ошибок переберите PF_RING вот так:

cd /usr/src/PF_RING-6.0.1/userland/lib
./configure  --disable-bpf --prefix=/opt/pf_ring
make install

Это у меня указано в либе на GitHub. А что касается прочих варнингов, то просто удалите строку: STATIC = -static. Она включена по дефалту чисто для моего удобства и при локальной компиляции в общем-то не нужна.

nrg
() автор топика
Ответ на: комментарий от technoid

Все это планируется в будущих версиях :)

nrg
() автор топика
Ответ на: комментарий от nrg

На Linux все усложняется

понятно, целевая аудитория - админы локалхостов.

anonymous
()
Ответ на: комментарий от Woofywoof

Ни грамма :) А вот кофе... тонны!

nrg
() автор топика

На какой платформе точно работает? Debian/CentOS/Ubuntu

Красава.

slyjoeh ★★★
()
Ответ на: комментарий от nrg

текущая PF_RING сейчас 6.0.1,а тут 1.0.

Может быть, не прижился, и тот, кому было нужно, обновлять перестал...

AS ★★★★★
()
Ответ на: комментарий от AS

На самом деле очень странно, почему. Штука полезнейшая! Он может акселерировать snort, suricata да и вообще подменять собой pcap.

nrg
() автор топика
Ответ на: комментарий от nrg

Он может акселерировать snort, suricata да и вообще подменять собой pcap.

Да это я в курсе. Когда-то сам на него смотрел, потом необходимость не то, чтобы отпала, но ушла на второй план.

AS ★★★★★
()
Ответ на: комментарий от DALDON

Это довольно неэффективный способ защиты от атак, потому что, как сказали выше, даже простейшие DDoS боты давно рандомизируют User Agent и представляются реальными пользователями.

А в целом это возможно и довольно легко даже силами моей программы - достаточно слазить в пакет и изъять host хидер из входящего пакета.

nrg
() автор топика
Ответ на: комментарий от nrg

Ок! У меня сейчас есть беда в офисе. Есть заражённые win машинки, которые принимают участие в ботнете. По сему в целом темой интересуюсь. Но там реально всплески трафика не большие совсем... Вот слегка думаю чего делать.

DALDON ★★★★★
()
Ответ на: комментарий от DALDON

Поставьте мой монитор, он покажет всплески трафика ну или просмто tcpdump'ом последите за трафиком.

nrg
() автор топика
Ответ на: комментарий от nrg

tcpdumpом как раз ловлю. Так вот всплесков то нету как раз... Оно скотина понемного, помаленьку... Ходит куда ему надо. И засыпает... В целом уже все заражённые машины выцепил. :)

DALDON ★★★★★
()
Ответ на: комментарий от DALDON

Попробуйте найти управляющего сервера IP и забанить его. Упарвляемые боты отсохнут сами, мы так делали много раз, наиболее эффективный метод;

nrg
() автор топика
Ответ на: комментарий от nrg

Да, такой ip я уже нашёл. :) Ну хотелось бы на будущее как-то придумать, что-то интересное. :)

DALDON ★★★★★
()
Ответ на: комментарий от sartakov

Где-то 50 боевыми серверами под нагрузкой.

nrg
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.