Блокируем DoS/DDoS атаки с помощью nginx


Часто бывает что сайт пытаются DoS/DDoSить, для чего и с какой целью это делается описывать не буду. Я лишь приведу ниже несколько простых но достаточно эффективных настроек для блокировки мелких атак. Понятное дело что далеко не всегда это сработает.

1. Блокируем ненужные методы запросов

location / {
     if ($request_method !~ (GET|POST)) {
       return 403;
     }
  }

Все запросы кроме GET и POST получат 403 ошибку при попытке запроса.

2. Лимитируем кол-во запросов в определённый промежуток времени

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

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

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

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

Данный метод более подробно описан тут

3. Если атака направленна на конкретную ссылку\файл — блокируем её полностью

location /admin.php {
   deny all;
 }

Таким образом мы полностью заблокируем все запросы к данной странице, к сожалению данная страница не будет доступна и нам тоже.

Однако мы можем сделать следующее:

location /admin.php {
    allow x.x.x.x;
    deny all;
}

Где x.x.x.x — это наш локальный IP адрес. Таких правил можно добавить сколько угодно.


Наверх