Защита от DDoS-атаки

Материал из ISPWiki
Перейти к: навигация, поиск

Данная опция активируется галочкой "Включить защиту от DDoS-атаки" в свойствах WWW-домена. Галочка доступна только, если на сервере установлен Nginx.

Anti-ddos.png
Anti-ddos2.png

Для работы системы используется модуль ngx_http_limit_req_module.

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

   http {
       limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
       server {
           location /search/ {
               limit_req zone=one burst=5;
           }

Задаёт зону разделяемой памяти (zone=one) и максимальный размер всплеска запросов (burst). Если скорость поступления запросов превышает описанную в зоне (rate=1r/s), то их обработка задерживается так, чтобы запросы обрабатывались с заданной скоростью. Избыточные запросы задерживаются до тех пор, пока их число не превысит максимальный размер всплеска. При превышении запрос завершается с ошибкой 503 (Service Temporarily Unavailable). По умолчанию максимальный размер всплеска равен нулю.

В зоне размером 1 мегабайт может разместиться около 16 тысяч состояний размером 64 байта. При переполнении зоны в ответ на последующие запросы сервер будет возвращать ошибку 503 (Service Temporarily Unavailable).

Скорость задаётся в запросах в секунду (r/s).


Для включения защиты от DDoS необходимо в настройках WWW-домена включить переключатель "Включить защиту от DDoS-атаки", после чего необходимо заполнить поля "Количество запросов в секунду" и "Максимальный размер всплеска".

После сохранения изменений в файле $HOME_NGINX/conf.d/isplimitreq.conf будет создана запись, к примеру:

limit_req_zone $binary_remote_addr zone=example.com:128k rate=2r/s;

где

   zone - имя зоны разделяемой памяти, наывается по имени WWW-домена;
   размер зоны (128к) рассчитывается по формуле: "скорость запросов" * 64к;
   rate - скорость поступления запросов, определяется в поле формы "Количество запросов в секунду".

Далее, будет создан файл $HOME_NGINX/vhost-resources/ИМЯ_ДОМЕНА/reqlimit.conf c содержимым:

   limit_req zone=example.com burst=3;
   error_page 503 =429 @blacklist;

где

   zone - имя зоны, определенной в предыдущем конфигурационном файле;
   burst - размер всплеска, определенной в поле формы "Максимальный размер всплеска";
   @blacklist - имя локейшена, в который осуществляется редирект, при  срабатывании ошибки 503, т.е. превышении порога количества запросов с IP-адреса. 

Далее, будет создан файл $HOME_NGINX/vhost-includes/blacklist-nginx.conf c содержимым:

location @blacklist {

       proxy_redirect off ;
       proxy_pass https://IPADDRESS;
       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;

}

где

   IPADDRESS - IP-адрес и порт который слушает IHTTPD. При изменении адреса панели, измененный адрес и порт перезаписываются в этом файле. Если IHTTPD настроен на прослушку любого адреса, то выбирается любой из валидных IP-адресов, настроенных на сервере.

При превышении порога количества запросов IP-адрес, с которого поступают запросы, передается в скрипт /mancgi/ddos, который вносит данный IP-адрес в список заблокированных адресов на 5 минут. При блокировке в лог-файл $HOME_MGR/var/ddos.log вносится запись:

WARNING Address (xxx.xxx.xxx.xxx) is blacklisted


Сама блокировка осуществляется с помощью iptables (ip6tables для IPv6) и ipset.

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

В iptables создается цепочка правило

DROP       all  --  anywhere             anywhere            match-set ispmgr_limit_req src 

привязанное к имени списка из ipset - ispmgr_limit_req (для IPv6 - ispmgr_limit_req6)

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

Чтобы проверить содержимое списка можно использовать команду: ipset -L ispmgr_limit_req. В выводе команды в поле "Members" будут отражены все адреса, попавшие в список, и время оставшееся до конца блокировки

Для изменения timeout необходимо:

1. В конфигурационном файле ispmgr.conf добавить строку

isp_limitreq_timeout количество секунд.

2. Узнать в iptables номер правила ispmgr_limit_req src:

iptables -L INPUT --line-numbers

и удалить её:

iptables -D INPUT номер строки

3. Узнать в ip6tables номер правила ispmgr_limit_req6 src:

ip6tables -L INPUT --line-numbers

и удалить её:

ip6tables -D INPUT номер строки

4. Удалить правила из ipset:

ipset destroy ispmgr_limit_req
ipset destroy ispmgr_limit_req6

После чего выполнить команду:

sbin/mgrctl -m ispmgr firewall