• Быстрый переход
  • Рубрики
  • Свежие записи
  • Метки
  • Архивы
  • Реклама 1
  • Реклама 2
  • Рейтинг@Mail.ru

    Борьба с DDoS-атакой с помощью (D)DoS Deflate


    Очень часто по чьему-то злому умыслу или по случайности, ваш сервис начинает испытывать нагрузку свыше той, на которую он рассчитан. Зачастую в таких случаях ваши постоянные клиенты начинают страдать от отказа в обсушивании на вашем ресурсе. Это может проявляться как полным отсутствием ответа от вашего сервиса, так и неприемлемо медленной его работой. Данную ситуацию можно оценивать как атаку на ваш сервис. Данный вид атак называется DoS — Denial of Service(если атака производится с одного адреса), либо DDoS — Distributed Denial of Service (если атака производится с множества адресов). В данной статье мы расскажем как настроить систему которая позволит защищать ваш сервис от подобного вида атак.
    1. Подтверждение атаки на сервер
    При DDoS-атаке (в нашем случае на 80 порт, который открыт на ресурсах, где размещены проекты, к которым нужен доступ по http) наблюдается повышение открытых и ожидающих закрытия соединений (до нескольких тысяч или десятков тысяч), возрастает количество пакетов на сетевом интерфейсе. В случае DDoS-атаки на 80 порт увеличивается общее число процессов на сервере, количество процессов apache (httpd), сайты начинают долго отвечать или не отвечать вовсе, на сервере используется большее число ресурсов (возрастает LA сервера, использование CPU и RAM достигает 100%). В таком случае нужно проверить общее количество соединений с сервером командой netstat:
    netstat -n -p | awk '{print $6}'|awk -F: '{print $1}' | sort -n | uniq -c | sort -nr | head -n10

    вывод команды в случае DDoS-а будет приблизительно таким:
    8580 LAST_ACK
    340 ESTABLISHED
    251 SYN_RECV
    157 FIN_WAIT1
    28 CONNECTED
    7 CLOSING
    6 TIME_WAIT
    3 FIN_WAIT2
    3 CLOSE_WAIT

    Большое количество соединений может указывать и на общую загруженность проекта (без воздействия ботов), поэтому необходимо вывести рейтинг количества подключений по 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
    378 46.173.210.3
    330 127.0.0.1
    216 213.111.233.25
    201 213.111.224.77
    144 116.81.150.194
    125 209.190.24.203

    Если в перечне с большим количеством соединений к серверу нету IP, на которые положены специфические функции связанные с приложениями, которые запущены на сервере (например, в связке nginx+apache с использованием ISPmanager виртуальные хосты бекенда (apache) создаются на тот же внешний IP, на котором висит nginx, только на порт 8080, соответственно с него будет открыто много соединений при большом количестве обращений на 80 порт nginx даже с разных IP посетителей; также повышенное количество соединений может быть обусловлено функционированием разнообразных систем мониторинга состояния сервера, например, nagios, zabbix, munin и т.д.; чатами и так далее. Как бороться с блокировкой нужных IP, см. п. 2), значит на сервер осуществляется DDoS-атака. Какой именно порт атакуют можно определить командой:
    sudo netstat -nput | awk '{print $4}'|awk -F: '{print $2}' | sort -n | uniq -c | sort -nr | head -n10

    Вывод команды будет иметь следующий вид
    13324 80
    803 8080
    ... ...
    3 22

    Видно, что атака направлена на 80 порт.
    Также при DDoS-е на 80 (http) порт будет наблюдаться возрастание логов доступа (acces) и ошибок (error) (если они включены) web-сервера (nginx, apache) вплоть до гигабайт.
    Переполнение логов ошибок nginx может быть также вызвано ограничением на открытые файлы в самой системе. В таком случае в логе ошибок можно увидеть множество ошибок:
    2012/05/08 06:11:18 [alert] 1614#0: accept() failed (24: Too many open files)
    ...
    2012/05/08 06:11:18 [alert] 1614#0: accept() failed (24: Too many open files)

    Данную ошибку можно устранить добавлением /etc/nginx/nginx.conf параметра
    worker_rlimit_nofile 16384;

    Где 16384 — число, до которого мы увеличиваем данный параметр. По умолчанию = 1024.

    2. Настраиваем (D)DoS Deflate для отражения атаки
    Принцип действия данного скрипта состоит в том, что им с некоторым интервалом (запуск осуществляется по cron) определяются IP, с которых превышен лимит на соединения к серверу. Такие IP блокируются через iptables или apf на некоторое время и по истечению этого времени происходит их вынесение из запрещающих правил. Разблокировка IP через некоторое время в таком случае дает два положительных момента: при вынесении таблица правил не содержит очень большое количество записей, а только те, с которых недавно осуществлялась атака, это дает большую производительность фильтра пакетов (iptables или apf); снижается нагрузка на CPU путем предотвращения перебора большого количества правил для входящего пакета.
    Установка (D)DoS Deflate
    Качаем установочный скрипт, даем ему права на выполнение и запускаем его
    wget http://www.inetbase.com/scripts/ddos/install.sh
    chmod 0700 install.sh
    ./install.sh

    В ходе установки в директорию /usr/local/ddos/ вносится сам скрипт, конфигурационные файлы и добавляется задание в cron. В debian-подобных системах задание, внесенное в cron установочным скриптом не всегда выполняется (в данном случае именно так и произошло), поэтому нужно самостоятельно добавить выполнение скрипта с помощью команды
    crontab -e

    Внести в редакторе заданий следующую строку
    */1 * * * * nice -n -5 /usr/local/ddos/ddos.sh

    Где */1 * * * * — указывает на выполнение скрипта с интервалом в 1 минуту.
    Проверить, выполняется ли скрипт по cron можно с помощью просмотра /var/log/syslog. В нем должны содержаться строки вида
    May 10 20:07:02 astreus /USR/SBIN/CRON[30284]: (root) CMD (nice -n -5 /usr/local/ddos/ddos.sh)

    Далее проверяем вывод команды iptables-save и удостоверяемся, что в ее выводе содержатся запрещающие правила
    -A INPUT -s 41.72.34.212/32 -j DROP
    ...
    -A INPUT -s 85.159.201.54/32 -j DROP

    Общее количество запрещающих правил можно посмотреть с помощью команды
    iptables-save | grep -c DROP

    Файл конфигурации скрипта /usr/local/ddos/ddos.conf имеет следующую структуру:
    ##### Путь к основным составляющим работы скрипта
    PROGDIR="/usr/local/ddos"
    PROG="/usr/local/ddos/ddos.sh"
    IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" # список игнорируемых IP
    CRON="/etc/cron.d/ddos.cron"
    APF="/etc/apf/apf"
    IPT="/sbin/iptables"

    ##### Интервал запуска скрипта в минутах
    FREQ=1

    ##### Количество максимальных соединений с одного IP
    NO_OF_CONNECTIONS=90

    ##### Если используем iptables - ставим 0
    ##### Если используем apf - устанавливаем его и ставим 1
    APF_BAN=0

    ##### При запуске задания через cron,
    ##### разработчики рекомендуют значение этой опции 1
    KILL=1

    ##### E-mail, на который отправляется уведомление о бане
    ##### Если отправка не нужна, ставим значение ""
    EMAIL_TO="root"

    ##### Время бана в секундах
    BAN_PERIOD=3600

    Для отправки уведомлений на e-mail используется команда mail -s «IP addresses banned on …» $EMAIL_TO. Стоит проверить с командной строки отправку письма с помощью этой команды. Возможно, понадобится установка пакета mailx (если он не установлен).
    Если нужно исключить блокировку скриптом определенных IP, они вносятся в /usr/local/ddos/ignore.ip.list по одному в строку. Например:
    10.10.10.1
    10.10.10.100

    При настройке (D)DoS Deflate в дистрибутивах на базе RedHat нужно учесть такие особенности:
    задание по cron добавляется и выполняется корректно, поэтому вручную добавлять его не нужно
    после смены интервала запуска скрипта (параметр FREQ) нужно единоразово выполнить скрипт с опцией —cron (/usr/local/ddos/ddos.sh —cron)
    в самом скрипте для корректной работы в связи с отличием вывода команды netstat в Debian и RedHat нужно часть
    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST

    заменить на
    netstat -ntu | grep ':' | awk '{print $5}' | sed 's/::ffff://' | cut -f1 -d ':' | sort | uniq -c | sort -nr > $BAD_IP_LIST

    Параметр NO_OF_CONNECTIONS конфигурационного файла стоит определять опытным путем с учетом специфики проекта, на который осуществляется атака.

    Особая благодарность сайту http://10serv.com/borba-s-ddos-atakoy-s-pomoshhyu-d-dos-deflate

    Автор: admin, 27 января 2014
    Рубрики: OS FreeBSD, OS Linux, Новости
    Метки: , , , , , , ,
    Есть 1 комментарий. к сообщению: “Борьба с DDoS-атакой с помощью (D)DoS Deflate”
    1. Dedicated servers:

      Но определить, была ли данная атака произведена злоумышленником, либо отказ в обслуживании был следствием нештатного события, они не могут. В соответствии с правилами политики обеспечения безопасности, при обнаружении DoS или DDoS-атаки потребуется её регистрация для дальнейшего аудита.

    Написать комментарий

    Последние статьи