Настройка защиты от DDoS-атак
DDoS — это атака, при которой злоумышленники одновременно направляют много запросов на один ресурс, чтобы перегрузить его и сделать недоступным.
В ispmanager можно настроить защиту сайта от DDoS-атак через веб-сервер. Включение защиты доступно, только если в панели установлен веб-сервер Nginx или OpenLiteSpeed.
Nginx полностью блокирует доступ к серверу с IP-адреса, а OpenLiteSpeed ограничивает для IP-адреса пропускную способность.
Включение защиты
При создании или изменении сайта перейдите в блок настроек Оптимизация и защита от DDoS-атак, отметьте Включить защиту от DDoS-атаки и укажите нужные параметры защиты.
Параметры защиты для Nginx
- Количество запросов в секунду (rate) — максимальное количество запросов, которые Nginx может обработать от одного IP-адреса за секунду.
- Максимальный размер всплеска (burst) — максимальное количество запросов с одного IP-адреса, которые могут находиться в очереди на обработку.
Параметры защиты для OpenLiteSpeed
- Количество запросов в секунду — максимальное количество запросов, которые могут быть обработаны с одного IP-адреса за одну секунду. После достижения этого предела все последующие запросы от данного IP-адреса блокируются до начала следующей секунды.
- Пропускная способность, байт/сек — максимальная пропускная способность для одного IP-адреса. Фактическая пропускная способность может быть немного выше установленной настройки из-за оптимизации. Значение пропускной способности округляется с шагом 4 КБ. Установка значения 0 отключает это ограничение.
В конфигурационном файле OpenLiteSpeed используются следующие директивы:
- staticReqPerSec XXX — устанавливает ограничение статических запросов в секунду;
- dynReqPerSec XXX — устанавливает ограничение динамических запросов в секунду;
- outBandwidth XXX — устанавливает ограничение исходящей пропускной способности;
- inBandwidth XXX — устанавливает ограничение входящей пропускной способности.
Технические подробности для Nginx
Для работы защиты используется модуль ngx_http_limit_req_module, который позволяет ограничить скорость обработки запросов по заданному ключу или запросов, поступающих с одного IP-адреса.
Ограничение запросов
1. Создание зоны ограничения.
При включении защиты от DDoS в конфигурационном файле <путь к директории Nginx>/conf.d/isplimitreq.conf
создается зона разделяемой памяти (zone) и указывается максимальная скорость обработки запросов к сайту (rate):
limit_req_zone $binary_remote_addr zone=<имя сайта>:<размер зоны> rate=<количество запросов в секунду>r/s
Зона разделяемой памяти хранит информацию о запросах от каждого уникального IP-адреса и позволяет отслеживать их количество за определенный период времени.
2. Обработка входящего запроса.
Когда клиент отправляет запрос к сайту, обработка запроса происходит на основе конфигурационного файла сайта /etc/nginx/vhosts/<имя пользователя>/<имя сайта>.conf
. Если запрашивается динамическое содержимое, запрос перенаправляется в локацию @fallback:
}
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @fallback;
}
location / {
try_files /does_not_exists @fallback;
}
}
location @fallback {
include /etc/nginx/vhosts-resources/example.ru/dynamic/*.conf;
3. Применение ограничения.
В локации @fallback применяются директивы из файла <путь к директории Nginx>/vhosts-resources/<имя сайта>/dynamic/reqlimit.conf
:
limit_req_status 429;
error_page 429 @blacklist;
limit_req zone=<имя сайта> burst=<максимальный размер всплеска>;
Запрос попадает в зону ограничения (zone). Если количество запросов в секунду от данного IP превышает установленный лимит, избыточные запросы помещаются в очередь и их обработка замедляется. При превышении максимального количества запросов в очереди (burst) срабатывает ошибка 429 (Too Many Requests), и запрос перенаправляется в локацию @blacklist.
4. Внесение в черный список.
Локация @blacklist находится в конфигурационном файле <путь к директории Nginx>/vhosts-includes/blacklist-nginx.conf
:
location @blacklist {
proxy_redirect off ;
proxy_pass http://unix:/usr/local/mgr5/tmp/ddos.sock;
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>;
}
Запросы, попавшие в @blacklist, перенаправляются Nginx на сокет ddos.sock. Сокет «слушает» процесс ddos, который и блокирует IP-адреса.
Блокировка IP-адресов
Блокировка выполняется с помощью утилит:
- iptables для IPv4-адресов;
- ip6tables для IPv6-адресов;
- ipset.
При запуске панели в ipset создаются два набора — ispmgr_limit_req (для IPv4-адресов) и ispmgr_limit_req6 (для IPv6-адресов):
Name: ispmgr_limit_req
Type: hash:ip
Revision: <номер_версии>
Header: family inet hashsize <размер_хэша> maxelem <максимальное_количество_элементов> timeout <время_ожидания> bucketsize <размер_ведра> initval <начальное_значение>
Size in memory: <объем_памяти>
References: <количество_ссылок_на_хэш-таблицу>
Number of entries: <количество_записей_в_таблице>
Members: <записи>
Name: ispmgr_limit_req6
Type: hash:ip
Revision: <номер_версии>
Header: family inet6 hashsize <размер_хэша> maxelem <максимальное_количество_элементов> timeout <время_ожидания> bucketsize <размер_ведра> initval <начальное_значение>
Size in memory: <объем_памяти>
References: <количество_ссылок_на_хэш-таблицу>
Number of entries: <количество_записей_в_таблице>
Members: <записи>
В iptables и ip6tables создаются правила для блокировки адресов из этих наборов:
DROP all -- anywhere anywhere match-set ispmgr_limit_req src
DROP all -- anywhere anywhere match-set ispmgr_limit_req6 src
Заблокированные IP-адреса вносятся в журнал блокировок /usr/local/mgr5/var/ddos.log:
Block IP <IP-адрес>
Блокировка IP-адресов происходит следующим образом:
- Когда количество избыточных запросов превышает максимальный размер всплеска, запускается процесс ddos.
- Ddos запускает утилиту ipset.
- IP-адрес, с которого поступают избыточные запросы, добавляется в набор в ipset и в журнал блокировок.
- Правила в iptables и ip6tables блокируют пакеты с этого IP-адреса.
Чтобы проверить список заблокированных адресов, выполните одну из команд:
ipset -L ispmgr_limit_req
ipset -L ispmgr_limit_req6
Изменение периода блокировки
По умолчанию IP-адреса, с которых поступают избыточные запросы, блокируются на 300 секунд (5 минут). Чтобы изменить период блокировки:
- Добавьте в конфигурационном файле ispmanager (по умолчанию
/usr/local/mgr5/etc/ispmgr.conf
) параметр: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