В ISPmanager можно настроить защиту сайта от DDOS-атак. Она нужна для блокировки IP-адресов, с которых поступает большое количество запросов.

Включение защиты


Чтобы использовать защиту, при создании или изменении WWW-домена включите опцию Включить защиту от DDOS-атаки и в блоке настроек Защита от DDoS-атаки укажите параметры защиты:

  1. Количество запросов в секунду — при превышении этого количества запросов от одного IP-адреса, он блокируется на 5 минут.
  2. Максимальный размер всплеска — при превышении максимального количества запросов в секунду новые запросы блокируются.

Подробнее см. в статье Создание WWW-домена.

Технические подробности


Для работы защиты используется веб-сервер Nginx и модуль ngx_http_limit_req_module, который позволяет ограничить скорость обработки запросов по заданному ключу или запросов, поступающих с одного IP-адреса.

Принципы работы модуля

Модуль для каждого домена с включённой защитой создаёт зону разделяемой памяти (zone) и указывает максимальный размер всплеска запросов (burst). Если количество поступающих запросов превышает ограничение для зоны, то их обработка задерживается. Избыточные запросы задерживаются, пока их количество не превысит максимальный размер всплеска. При его превышении запрос завершается с ошибкой 503 (Service Temporarily Unavailable).

Настройки записываются в <путь к директории Nginx>/conf.d/isplimitreq.conf:

Конфигурационный файл nginx

limit_req_zone $binary_remote_addr zone=<имя WWW-домена>:<размер зоны> rate=<количество запросов в секунду>r/s
BASH
Пояснения

Размер зоны рассчитывается по формуле:

Формула для расчёта размера зоны

<количество запросов в секунду> * 64k
CODE

Например, если Количество запросов в секунду = 500, то размер зоны будет равен 500 * 64k, т.е. 32000k.


А также в <путь к директории Nginx>/vhosts-resources/<имя домена>:

Конфигурационный файл nginx

limit_req zone=<имя WWW-домена> burst=<максимальный размер всплеска>;
error_page 503 =429 @blacklist;
BASH
Пояснения

@blacklist — секция location, в которую выполняется перенаправление при срабатывании ошибки 503, т.е. при превышении максимального количества запросов с IP-адреса.

Секция location @blacklist создаётся в <путь к директории Nginx>/vhosts-includes/blacklist-nginx.conf с содержимым вида:

Конфигурационный файл nginx

location @blacklist {
proxy_redirect off ;
proxy_pass https://<IP-адрес>:<порт>;
rewrite (.*) /mancgi/ddos break;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X_ISP_FIREWALLSEC <ключ для ISPmanager>;
BASH
Пояснения
<IP-адрес> — адрес сервера с ISPmanager, который слушает ihttpd. Если ihttpd слушает любой корректный адрес сервера, то IP-адрес выбирается произвольно.

<порт> — порт, который слушает ihttpd.

Блокировка IP-адресов

При превышении максимального количества запросов:

  1. IP-адрес, с которого они поступают, передаётся в скрипт /mancgi/ddos. Скрипт вносит адрес в список заблокированных на 5 минут.
  2. Блокировка выполняется с помощью iptables для IPv4, ip6tables для IPv6 и ipset.

    Обратите внимание!

    В среде виртуализации OpenVZ улитилита ipset недоступна и защита осуществляется только средствами Nginx.

    В iptables создаётся правило:

    iptables

    DROP       all  --  anywhere             anywhere            match-set ispmgr_limit_req src 
    
    BASH

    В ip6tables создаётся правило:

    ip6tables

    DROP       all  --  anywhere             anywhere            match-set ispmgr_limit_req6 src 
    
    BASH

    В ipset создаются два набора (ispmgr_limit_req и ispmgr_limit_req6) с параметрами: hash:ip (IP-адрес) и timeout 300 (время блокировки в секундах).

  3. При блокировке в журнал /usr/local/mgr5/var/ddos.log добавляется запись:

    Журнал блокировок

    WARNING Address (<IP-адрес>) is blacklisted
    BASH
  4. Чтобы проверить содержимое списка, выполните команду:

    ipset -L ispmgr_limit_req
    BASH

    В выводе команды в поле "Members" указываются все адреса из списка блокировки и время до её окончания.

Изменение периода блокировки

Чтобы изменить период, на который блокируются IP-адреса:

  1. Добавьте в конфигурационном файле ISPmanager (по умолчанию /usr/local/mgr5/etc/ispmgr.conf) параметр:

    Конфигурационный файл ISPmanager

    isp_limitreq_timeout <период блокировки в секундах>
    BASH
  2. Определите в iptables номер правила ispmgr_limit_req src:

    iptables -L INPUT --line-number
    BASH
  3. Удалите это правило:

    iptables -D INPUT <номер правила>
    BASH
  4. Определите в ip6tables номер правила ispmgr_limit_req6 src:

    ip6tables -L INPUT --line-number
    BASH
  5. Удалите это правило:

    ip6tables -D INPUT <номер правила>
    BASH
  6. Удалить правила из ipset:

    ipset destroy ispmgr_limit_req
    ipset destroy ispmgr_limit_req6
    
    BASH
  7. Обновите правила брандмауэра ISPmanager:

    /usr/local/mgr5/sbin/mgrctl -m ispmgr firewall
    BASH