Самая простая и эффективная защита от ddos на уровне nginx

Статей в интернете на тему защиты от ddos атак довольно много, но действительно эффективных можно найти от силы пару штук. Представим такую ситуацию, что атакующий сервер применяем ддосер на яве, что будем делать? Ответ многих новичков — вешаться, т.к. на атакуемый сервер идет параллельная очередь «пустых» запросов. Решение данной проблемы не за горами, нам поможет nginx. Будем использовать limit_req_zone и limit_req.
В http { кидаем:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

В данном случае состояния сессий хранятся в зоне «one» размером 10 мегабайт и средняя скорость запросов для этой зоны не может более 1 запроса в секунду.

В качестве сессии используется адрес клиента. Обратите внимание, что вместо переменной $remote_addr используется переменная $binary_remote_addr, позволяющая уменьшить размер состояния до 64 байт. В зоне размером 1 мегабайт может разместиться около 16000 состояний размером 64 байта.

Скорость задаётся в запросах в секунду. Если же нужна скорость меньше одного запроса в секунду, то она задаётся в запросах в минуту, например, ползапроса в секунду — это 30r/m.

Теперь в location / { или в location ~ \.php$ { (если у вас php-fpm)

limit_req zone=one burst=5;

позволяют в среднем не более 1 запроса в секунду со всплесками не более 5 запросов.

Директива задаёт зону (zone) и максимально возможные всплески запросов (burst). Если скорость запросов превышает описанную в зоне, то их обработка запроса задерживается так, чтобы запросы обрабывались с заданной скоростью. Избыточные запросы задерживаются до тех пор, пока их число не превысит заданное число всплесков. В этом случае запрос завершается кодом «Service unavailable» (503). По умолчанию число всплесков равно нулю.

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

limit_req zone=one burst=5 nodelay;

Ну и как всегда спасибо Игорю Сысоеву.


Понравилась статья? Поделись с остальными.

Комментарии закрыты.