Типичным способом защиты от HTTP-флуда и небольших DDoS-атак на WEB-серверы является использование утилиты (D)DoS Deflate. Принцип работы этой утилиты основан на получении количества подключений с одного IP. Это делается с помощью утилиты netstat:

$ netstat -n -p | awk '{print $5}'|awk -F: '{print $1}' | sort -n | uniq -c | sort -nr | head -n10

> 734 109.120.130.51
> 562 77.221.129.90
> 415 109.206.161.21
> 410 109.86.223.41

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

Большинство провайдеров интернета используют NAT, поэтому многие пользователи имеют один и тот же IP. Со стороны WEB-сервера невозможно понять — большое количество соединений с одного IP это атака или это разные пользователи с одинаковым IP. При этом один и тот же сайт может генерировать совершенно разное количество запросов с одного IP, например, поиск картинок. Поиск может дать 10, а может и 100 результатов — каждый ресурс это запрос с IP.

Тем не менее, в экстренных ситуациях возможно применение (D)DoS Deflate либо netstat напрямую, однако стоит понимать что блокировка проходит достаточно грубо и на постоянной основе (добавление в cron) мы использовать указанный подход не рекомендуем.

XDDoS — DDoS protection system

Существует другой способ борьбы с флудом — парсинг логов доступа при помощи XDDoS.

На текущий момент реализован парсер логов доступа nginx, но довольно просто можно реализовать парсинг логов любого веб-сервера. Для блокировки может быть использован Advanced Policy Firewall, либо iptables напрямую.

Принцип работы

XDDoS парсит логи WEB-сервера и определяет количество запросов на конкретный URL. Если это количество превышает заданное пороговое значение (параметр —threshold), тогда IP блокируется.

Пример:
(1) http://attacktarget.com/main
(2) http://attacktarget.com/dfjslkdjf?query=fdksjf
(3) http://attacktarget.com/dfjslkdjf?query=3847587

Например, если на URL (2) с одного и того же IP более 35 запросов (значение по умолчанию), тогда этот IP блокируется.

Пример использования XDDoS для защиты от DDoS-атак и HTTP-флуда

# анализ логов nginx и блокировка через APF
tail -n 1000 /var/log/nginx/access.log | xddos --dry-run -p /var/run/httpprot.pid -f nginx -b apf --stdin

# анализ логов nginx и блокировка через iptables
tail -n 1000 /var/log/nginx/access.log | xddos --dry-run -p /var/run/httpprot.pid -f nginx -b iptables --stdin

Нужно убрать ключ —dry-run в боевом режиме.

Чтобы регулировать количество запросов на один URL, используется параметр —threshold.

Вместо tail -n 1000 можно использовать скрипт /usr/share/xddos/tlog.sh, который позволяет получить добавленный кусок лога WEB-сервера между запусками. Пример использования в скрипте /usr/share/xddos/runner.sh (этот скрипт запускается через cron при автоматической защите).

Установка XDDoS

cd
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
python get-pip.py

pip install pip --upgrade --no-cache-dir
pip install xddos

# обновление
# pip install xddos --upgrade --no-cache-dir

# документация
xddos -h

XDDoS может быть добавлен в cron для постоянной защиты WEB-сервера:

cd /usr/share/xddos
./enable.sh

# чтобы отключить постоянную защиту
cd /usr/share/xddos
./disable.sh

Проект на Github и установка.

Отмечено:

Добавить комментарий