ispmanager 6 lite, pro, host

Настройка защиты от DDoS-атак

DDoS — это атака, при которой злоумышленники одновременно направляют много запросов на один ресурс, чтобы перегрузить его и сделать недоступным.

В ispmanager можно настроить защиту сайта от DDoS-атак через веб-сервер. Включение защиты доступно, только если в панели установлен веб-сервер Nginx или OpenLiteSpeed.

Nginx полностью блокирует доступ к серверу с IP-адреса, а OpenLiteSpeed ограничивает для IP-адреса пропускную способность.

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

При создании или изменении сайта перейдите в блок настроек Оптимизация и защита от DDoS-атак, отметьте Включить защиту от DDoS-атаки и укажите нужные параметры защиты.

Параметры защиты для Nginx

  1. Количество запросов в секунду (rate) —  максимальное количество запросов, которые Nginx может обработать от одного IP-адреса за секунду.
  2. Максимальный размер всплеска (burst) — максимальное количество запросов с одного IP-адреса, которые могут находиться в очереди на обработку.

Параметры защиты для OpenLiteSpeed

  1. Количество запросов в секунду — максимальное количество запросов, которые могут быть обработаны с одного IP-адреса за одну секунду. После достижения этого предела все последующие запросы от данного IP-адреса блокируются до начала следующей секунды.
  2. Пропускная способность, байт/сек — максимальная пропускная способность для одного IP-адреса. Фактическая пропускная способность может быть немного выше установленной настройки из-за оптимизации. Значение пропускной способности округляется с шагом 4 КБ. Установка значения 0 отключает это ограничение.

В конфигурационном файле OpenLiteSpeed используются следующие директивы:

  • staticReqPerSec XXX — устанавливает ограничение статических запросов в секунду;
  • dynReqPerSec XXX — устанавливает ограничение динамических запросов в секунду;
  • outBandwidth XXX — устанавливает ограничение исходящей пропускной способности;
  • inBandwidth XXX — устанавливает ограничение входящей пропускной способности.

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

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

Ограничение запросов

Начиная с версии ispmanager 6.74.0, ограничение распространяется только на запросы динамического содержимого.

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.
В среде виртуализации OpenVZ утилита ipset недоступна и защита осуществляется только средствами Nginx.

При запуске панели в ipset создаются два набора — ispmgr_limit_req (для IPv4-адресов) и ispmgr_limit_req6 (для IPv6-адресов):

ispmgr_limit_req
Name: ispmgr_limit_req
Type: hash:ip
Revision: <номер_версии>
Header: family inet hashsize <размер_хэша> maxelem <максимальное_количество_элементов> timeout <время_ожидания> bucketsize <размер_ведра> initval <начальное_значение>
Size in memory: <объем_памяти>
References: <количество_ссылок_на_хэш-таблицу>
Number of entries: <количество_записей_в_таблице>
Members: <записи>
ispmgr_limit_req6
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 создаются правила для блокировки адресов из этих наборов:

iptables
DROP all -- anywhere anywhere match-set ispmgr_limit_req src
ip6tables
DROP all -- anywhere anywhere match-set ispmgr_limit_req6 src
Пояснение

Заблокированные IP-адреса вносятся в журнал блокировок /usr/local/mgr5/var/ddos.log:

Block IP <IP-адрес>

Блокировка IP-адресов происходит следующим образом:

  1. Когда количество избыточных запросов превышает максимальный размер всплеска, запускается процесс ddos.
  2. Ddos запускает утилиту ipset.
  3. IP-адрес, с которого поступают избыточные запросы, добавляется в набор в ipset и в журнал блокировок.
  4. Правила в iptables и ip6tables блокируют пакеты с этого IP-адреса.

Чтобы проверить список заблокированных адресов, выполните одну из команд:

Для IPv4-адресов
ipset -L ispmgr_limit_req
Для IPv6-адресов
ipset -L ispmgr_limit_req6
Пояснение

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

По умолчанию IP-адреса, с которых поступают избыточные запросы, блокируются на 300 секунд (5 минут). Чтобы изменить период блокировки:

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

     

  2. Определите в iptables номер правила ispmgr_limit_req src, выполнив в терминале команду:
    iptables -L INPUT --line-number
  3. Удалите это правило:
    iptables -D INPUT <номер правила>
    Пояснение
  4. Определите в ip6tables номер правила ispmgr_limit_req6 src:
    ip6tables -L INPUT --line-number
  5. Удалите это правило:
    ip6tables -D INPUT <номер правила>
    Пояснение
  6. Удалите наборы из ipset:
    ipset destroy ispmgr_limit_req
    ipset destroy ispmgr_limit_req6
  7. Обновите правила брандмауэра ispmanager:
    /usr/local/mgr5/sbin/mgrctl -m ispmgr firewall