Типичным способом защиты от 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 и установка.