
Адаптивный двухэтапный шлюз для защиты от DDoS-атак на уровне L4, использующий поведенческий анализ трафика, классификацию методом случайного леса и принудительное применение правил на уровне ядра через ipset/iptables.
Первая линия обороны
Адаптивный двухступенчатый шлюз для смягчения объёмных DDoS-атак на уровне 4.
Автор: Abdullah Armiyao
Проект: Adaptive Two Stage Framework for Near Real Time Layer 4 Volumetric DDoS Mitigation Using Behavioral Traffic Analysis

Большинство систем смягчения DDoS использует фиксированные пороги: блокировать всё, что отправляет больше некоторого жёстко заданного числа пакетов в секунду. Это не работает в обоих направлениях. Легитимный всплеск трафика в часы пик — и реальные пользователи блокируются, или атакующий держится чуть ниже порога и проходит.
FLOD изучает, как выглядит ваш нормальный трафик, и сдвигает собственные границы обнаружения, чтобы им соответствовать. Он отличает DDoS-поток от flash crowd — легитимного всплеска — без ручной настройки порогов.
Он работает встроенно на шлюзе между источником трафика и защищаемыми хостами и сбрасывает или ограничивает нежелательные источники на уровне ядра.
Панель управления называет заблокированные адреса атакующими, чтобы тот, кто не знает топологию сети, мог определить, какие отправители были враждебными. Адреса с ограничением скорости перечислены отдельно, поскольку ограничение скорости также используется как предосторожность и применяется сразу к целым группам.
Ступень 1 — это сенсор на Rust на пути пакетов. Он перехватывает каждый пакет, направленный защищаемому хосту, вычисляет скорость и разнообразие источников за короткие окна и сравнивает их с базовой линией, которую поддерживает сам. Он выполняет только арифметику, поэтому не мешает трафику.
Ступень 2 — это сервис на Python. Он получает сводку от Ступени 1 раз за
окно, классифицирует её с помощью Random Forest и применяет меры на уровне ядра
через ipset и iptables. Рядом с ним на каждом
окне работает Isolation Forest, помечающий трафик, не похожий ни на что, что изучила любая из моделей, и отображаемый как
отдельное состояние Anomalous, а не запускающий принудительные меры. Ступень 2 также
обслуживает веб-панель управления.
Две ступени соединены через Unix domain socket.
Модели обучаются на захваченном размеченном трафике, и развёртывание продолжает захватывать новые данные. Окна, которые Isolation Forest находит незнакомыми, и окна, которые Random Forest уверенно называет DDoS, записываются в файлы захвата. Периодическая задача переоценивает их с помощью Random Forest и второй, иначе построенной модели, и добавляет строку для обучения только тогда, когда обе выбирают один и тот же класс с высокой уверенностью и обе были обучены после захвата строки. Страница проверки в панели управления показывает подготовленные строки, по 500 на страницу, и человек решает, объединить ли их с обучающими данными или отбросить. Ничто не попадает в обучающий набор само по себе.
FLOD работает с объёмными потоками уровня 4, видимыми только по заголовкам пакетов: скорость, энтропия IP-адресов источников, сочетание протоколов и то, насколько трафик сконцентрирован на самом загруженном источнике. На практике это означает потоки, которые одновременно имеют большой объём и сконцентрированы, поступая от ограниченного набора реальных адресов.
Одна вещь явно вне области применения, и одна решена частично:
Атаки на уровне приложений. Содержимое запросов не анализируется, поэтому медленные и низкоинтенсивные потоки запросов и исчерпание соединений находятся вне того, что может наблюдать набор признаков, основанный только на заголовках.
Рандомизированная подмена источника. Подделка нового адреса источника для каждого пакета повышает энтропию вместо её понижения, инвертируя сигнал, который ищут признаки на основе адресов. Энтропия портов источника, дисперсия TTL и разнообразие отпечатков TCP SYN инвариантны к подмене адресов и закрывают это слепое пятно обнаружения, но обнаружение поддельного потока — более узкая задача, чем его остановка: блокировка поддельного адреса всё равно наказывает того, кто на самом деле им владеет, поэтому безопасное противодействие этому классу остаётся открытым вопросом. См. Detection и Explainer.
git clone https://github.com/DevInBlack001/ddos-reduction-system.git
cd ddos-reduction-system
sudo bash scripts/install.sh --interface <IFACE> --victim-ips <IP1>,<IP2>
sudo systemctl enable --now ddos-stage2
sudo systemctl enable --now ddos-stage1
Установщик собирает Stage 1, затем копирует код Stage 2 и виртуальное
окружение в /opt/flod/stage2 (владелец — root) и настраивает там
административную учётную запись, поскольку Stage 2 работает от root и не должен
запускать что-либо из рабочей копии, в которую непривилегированная учётная запись всё ещё может
писать. Изменяемое состояние, база данных, JSON-конфигурация, обученные модели, находится
в /var/lib/flod. Сама рабочая копия с этого момента служит лишь источником;
повторный запуск scripts/install.sh или scripts/update.sh обновляет
установленную копию из неё. Причины описаны в разделе Безопасность.
Панель управления доступна на порту 8000, по HTTPS после того, как самоподписанный сертификат установщика будет на месте. Полные инструкции, включая сетевую схему, от которой это зависит, находятся в wiki.
Установщик также настраивает инструментарий сборки eBPF, когда это возможно, под ту версию LLVM, которую поставляет ваш дистрибутив. Эта часть необязательна: без неё сенсор всё равно собирается и работает на libpcap.
У сенсора есть два бэкенда захвата. libpcap используется по умолчанию и работает
везде. При наличии инструментария --capture-mode kernel подсчитывает пакеты
в пути драйвера через XDP и TC, пробуждая пользовательское пространство раз за окно,
а не на каждый пакет. Обнаружение в обоих случаях идентично.
Настройка обнаружения измеряется, а не угадывается. scripts/calibrate.py читает
собственный журнал сенсора, выбирает обычный трафик и определяет, где должны
находиться границы аномалий в вашей сети.
Чтобы попробовать без установки чего-либо, запустите его прямо из рабочей копии:
sudo bash scripts/run.sh
Он запрашивает каждое необходимое значение, предлагает значение по умолчанию для каждого из них и спрашивает, запускать ли также этап 2. Добавьте --defaults, чтобы принять всё без запросов.
Чтобы запустить наборы тестов:
scripts/test.sh
Wiki — для запуска системы:
| Страница | Содержание |
|---|---|
| Installation | Требования, размещение в сети, первый вход |
| Configuration | Флаги сенсора, настройка принудительных мер, оповещения |
| Dashboard Guide | Каждая страница консоли |
| Troubleshooting | Когда что-то не работает |
docs/ — для понимания или изменения системы: