Настройка защиты от DDoS-атак
В ispmanager можно настроить защиту сайта от DDOS-атак. Она нужна для ограничения доступа IP-адресов, с которых поступает большое количество запросов.
Включение защиты доступно, только если установлен веб-сервер Nginx или OpenLiteSpeed. Nginx полностью блокирует доступ к серверу с IP-адреса, а OpenLiteSpeed ограничивает для IP-адреса пропускную способность. Подробнее об установке см. в статье Установка веб-сервера.
Включение защиты
Чтобы использовать защиту, при создании или изменении WWW-домена включите опцию Включить защиту от DDOS-атаки и в блоке настроек Защита от DDoS-атаки укажите параметры защиты:
- Nginx:
- Количество запросов в секунду — максимальное количество запросов, которые Nginx может обработать от одного IP-адреса за секунду. Если это количество превышается, запросы помещаются в очередь и обрабатываются с задержкой. Если размер очереди превышает установленный предел (параметр "Максимальный размер всплеска"), новые запросы с этого IP-адреса блокируются файерволом на 5 минут.
- Максимальный размер всплеска — максимальное количество запросов, которые могут находиться в очереди на обработку. Если этот лимит превышен, новые запросы с IP-адреса также блокируются файерволом на 5 минут.
Используются следующие директивы:
- limit_req_zone — устанавливает зону ограничения скорости и определяет скорость запросов;
- limit_req — устанавливает размер всплеска (burst) и применяет ограничение к запросам.
Пояснение - OpenLiteSpeed:
- Количество запросов в секунду с одного IP-адреса — максимальное количество запросов, которые могут быть обработаны с одного IP-адреса за одну секунду. После достижения этого предела все последующие запросы от данного IP-адреса блокируются до начала следующей секунды.
- Пропускная способность, байт/сек — максимальная пропускная способность для одного IP-адреса. Фактическая пропускная способность может быть немного выше установленной настройки из-за оптимизации. Значение пропускной способности округляется с шагом 4 КБ. Установка значения 0 отключает это ограничение.
Используются следующие директивы:
- staticReqPerSec XXX — устанавливает ограничение статических запросов в секунду;
- dynReqPerSec XXX — устанавливает ограничение динамических запросов в секунду;
- outBandwidth XXX — устанавливает ограничение исходящей пропускной способности;
- inBandwidth XXX — устанавливает ограничение входящей пропускной способности.
Технические подробности для 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
А также в <путь к директории Nginx>/vhosts-resources/<имя домена>:
Конфигурационный файл nginx
limit_req zone=<имя WWW-домена> burst=<максимальный размер всплеска>;
error_page 503 =429 @blacklist;
Секция 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>;
Подробнее о модуле ngx_http_limit_req_module см. на официальном сайте.
Блокировка IP-адресов
При превышении максимального количества запросов:
- IP-адрес, с которого они поступают, передаётся в скрипт /mancgi/ddos. Скрипт вносит адрес в список заблокированных на 5 минут.
- Блокировка выполняется с помощью iptables для IPv4, ip6tables для IPv6 и ipset. В iptables создаётся правило:Обратите внимание!В среде виртуализации OpenVZ улитилита ipset недоступна и защита осуществляется только средствами Nginx.
iptables
В ip6tables создаётся правило:DROP all -- anywhere anywhere match-set ispmgr_limit_req src
ip6tables
В ipset создаются два набора (ispmgr_limit_req и ispmgr_limit_req6) с параметрами: hash:ip (IP-адрес) и timeout 300 (время блокировки в секундах).DROP all -- anywhere anywhere match-set ispmgr_limit_req6 src
- При блокировке в журнал /usr/local/mgr5/var/ddos.log добавляется запись:
Журнал блокировок
WARNING Address (<IP-адрес>) is blacklisted
- Чтобы проверить содержимое списка, выполните команду: В выводе команды в поле "Members" указываются все адреса из списка блокировки и время до её окончания.
ipset -L ispmgr_limit_req
Изменение периода блокировки
Чтобы изменить период, на который блокируются IP-адреса:
- Добавьте в конфигурационном файле ISPmanager (по умолчанию /usr/local/mgr5/etc/ispmgr.conf) параметр:
Конфигурационный файл ISPmanager
isp_limitreq_timeout <период блокировки в секундах>
- Определите в iptables номер правила ispmgr_limit_req src:
iptables -L INPUT --line-number
- Удалите это правило:
iptables -D INPUT <номер правила>
- Определите в ip6tables номер правила ispmgr_limit_req6 src:
ip6tables -L INPUT --line-number
- Удалите это правило:
ip6tables -D INPUT <номер правила>
- Удалить правила из ipset:
ipset destroy ispmgr_limit_req ipset destroy ispmgr_limit_req6
- Обновите правила брандмауэра ISPmanager:
/usr/local/mgr5/sbin/mgrctl -m ispmgr firewall