Как настроить Nginx rate limiting для защиты от DDoS и брутфорса

8 минут чтения
Средний рейтинг статьи — 4.9

Любой публичный веб-сервер рано или поздно сталкивается с угрозой DDoS-атак или попытками брутфорса. Даже если приложение правильно изолировано через контейнеры и cgroups, без ограничений на уровне веб-сервера оно всё равно может упасть под нагрузкой злоумышленников.

Nginx предоставляет встроенные механизмы rate limiting, которые позволяют контролировать частоту запросов от клиентов и защитить сервер от перегрузки. В этой статье разберём, как настроить эти ограничения и какие практические сценарии применения существуют.

Как работает rate limiting в Nginx

Rate limiting в Nginx основан на двух ключевых директивах:

  1. limit_req_zone — задаёт ключ, по которому считаются запросы (например, IP-адрес клиента), и скорость, с которой они разрешены.
  2. limit_req — применяет ограничение к конкретным location или server-блокам.

Принцип работы простой: если клиент превышает установленную скорость, Nginx возвращает ошибку 503 (Service Unavailable) или другой код, который вы настроите.

Базовая настройка лимита запросов

Простейший пример — ограничение количества запросов от одного IP:

http {
    # создаём зону лимитов размером 10МБ, ключ — IP клиента
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
 
    server {
        listen 80;
        server_name example.com;
 
        location / {
            limit_req zone=one burst=5 nodelay;
            proxy_pass http://backend;
        }
    }
}

Разбор параметров:

  • zone=one:10m — имя зоны one, 10 МБ памяти для хранения состояния клиентов (~160k IP).
  • rate=10r/s — разрешено 10 запросов в секунду на IP.
  • burst=5 — разрешает кратковременное превышение лимита на 5 запросов.
  • nodelay — позволяет сразу обрабатывать burst без задержек.

Этот простой пример уже защищает от множества простых сканирований и брутфорса.

Ограничение на login-формы и важные локации

Часто нужно ограничивать не весь сайт, а только критичные маршруты:

location /login {
    limit_req zone=one burst=3 nodelay;
    proxy_pass http://backend;
}

В данном случае один IP не сможет отправлять больше 3 запросов одновременно на /login.

Это особенно полезно для защиты от брутфорса паролей.

Комбинирование rate limiting и fail2ban

Для более продвинутой защиты Nginx хорошо работает в связке с fail2ban.

  • Nginx логирует превышение лимитов (limit_req_status 503 или 429).
  • Fail2ban сканирует логи и автоматически блокирует IP через iptables.

Такой подход позволяет сочетать профилактическое ограничение и активное блокирование злоумышленников.

Ограничение соединений с помощью limit_conn

Помимо количества запросов в секунду, Nginx умеет ограничивать количество одновременных соединений:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
 
    server {
        listen 80;
 
        location / {
            limit_conn addr 10;
            proxy_pass http://backend;
        }
    }
}

Здесь:

  • $binary_remote_addr — ключ по IP.
  • limit_conn addr 10 — разрешает максимум 10 одновременных соединений с одного IP.

Комбинация limit_req + limit_conn даёт хорошую базовую защиту от DDoS и «спам-запросов».

Rate limiting для API

Для REST API или JSON-endpoints часто используют ключ API или токен как ключ лимита:

limit_req_zone $http_api_key zone=apikey:10m rate=100r/m;
 
location /api/ {
    limit_req zone=apikey burst=20 nodelay;
}

Так можно контролировать каждого пользователя API, не влияя на других клиентов сайта.

Практические рекомендации

  1. Выбирайте правильный ключ: IP — стандарт, но для API лучше токен/ключ.
  2. Комбинируйте с кэшированием: Nginx + FastCGI или proxy_cache снижает нагрузку.
  3. Мониторьте лимиты: включите limit_req_status для логирования превышений.
  4. Тестируйте burst: убедитесь, что легальные клиенты не «срезаются» при коротких пиках трафика.
  5. Используйте fail2ban для блокировки повторных нарушителей.

Связь с ресурсами и контейнерами

Rate limiting в Nginx не заменяет ограничение ресурсов на уровне контейнера.

  • Namespaces и cgroups отвечают за изоляцию и лимиты CPU/памяти.
  • Nginx rate limiting защищает приложение от избыточного трафика и брутфорса.

В связке эти механизмы делают систему гораздо устойчивее к нагрузке и атакам.

Итог

Nginx предоставляет эффективные инструменты:

  • limit_req_zone и limit_req — контроль скорости запросов;
  • limit_conn — ограничение одновременных соединений;
  • логирование и интеграция с fail2ban — активная защита.

Даже базовая настройка rate limiting защищает сервер от простых DDoS-атак и брутфорса.

Для комплексной защиты стоит сочетать ограничение ресурсов через cgroups, изоляцию через namespaces и контроль трафика через Nginx.

8 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний