Главное Авторские колонки Вакансии Образование
4 353 0 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Защита от HTTP-флуда (flood) и небольших DDoS-атак

Для борьбы с DDoS и HTTP-флудом часто применяют netstat, но проблема в том что невозможно подобрать оптимальное значение количества соединений с одного IP, которое считается атакой.
Мнение автора может не совпадать с мнением редакции

Типичным способом защиты от 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
0
В избр. Сохранено
Авторизуйтесь
Вход с паролем