Как настроить Nginx rate limiting для защиты от DDoS и брутфорса
Любой публичный веб-сервер рано или поздно сталкивается с угрозой DDoS-атак или попытками брутфорса. Даже если приложение правильно изолировано через контейнеры и cgroups, без ограничений на уровне веб-сервера оно всё равно может упасть под нагрузкой злоумышленников.
Nginx предоставляет встроенные механизмы rate limiting, которые позволяют контролировать частоту запросов от клиентов и защитить сервер от перегрузки. В этой статье разберём, как настроить эти ограничения и какие практические сценарии применения существуют.
Как работает rate limiting в Nginx
Rate limiting в Nginx основан на двух ключевых директивах:
limit_req_zone— задаёт ключ, по которому считаются запросы (например, IP-адрес клиента), и скорость, с которой они разрешены.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, не влияя на других клиентов сайта.
Практические рекомендации
- Выбирайте правильный ключ: IP — стандарт, но для API лучше токен/ключ.
- Комбинируйте с кэшированием: Nginx + FastCGI или proxy_cache снижает нагрузку.
- Мониторьте лимиты: включите
limit_req_statusдля логирования превышений. - Тестируйте burst: убедитесь, что легальные клиенты не «срезаются» при коротких пиках трафика.
- Используйте 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.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний