Rate limiting — один из основных слоев защиты в сетевой безопасности. Его суть проста — ограничить количество запросов от одного IP или пользователя за определенное время. Если лимит превышен, сервер отклоняет дополнительные запросы и возвращает ошибку. Это защищает от DDoS атак, брутфорса и злоупотребления API. Также помогает справедливо распределять ресурсы сервера между всеми пользователями.
Зачем нужен rate limiting
Поскольку интернет-сервисы открыты, любой может подключиться и отправить запрос. Злонамеренный пользователь или бот может отправить тысячи запросов в секунду и вывести сервер из строя. Кроме того, многократные попытки подбора пароля тоже опасны. Rate limiting решает эти проблемы — если из одного источника приходит слишком много запросов, они автоматически останавливаются. Важно то, что rate limiting — структурный слой защиты, и даже если в каком-то приложении есть уязвимость, атакующий не сможет быстро её эксплуатировать.
Настройка rate limiting в Nginx
В Nginx rate limiting настраивается через директивы limit_req_zone и limit_req. Сначала определяется зона — по какому ключу ограничивать (IP, пользователь, заголовок) и объем памяти. Затем в server или location указывается сколько запросов разрешено и какой burst. Burst — резерв для коротких пиков, например, когда пользователь загружает страницу и нужно много ресурсов, это нормально. В Nginx можно создать несколько зон и поставить разные лимиты для разных endpoints.
Rate limiting через Cloudflare
Cloudflare предлагает облачный rate limiting и это самый эффективный вариант, потому что атака останавливается на серверах Cloudflare и вообще не доходит до вашего сервера. В dashboard Cloudflare создаются правила — URL pattern, количество запросов, временной интервал и действие. Действие может быть блокировкой, CAPTCHA или просто отбрасыванием. На бесплатном плане тоже есть базовый rate limiting, но для расширенных правил нужен платный план. Это особенно полезно для защиты страниц входа и API endpoints.
Rate limiting на уровне приложения
Rate limiting на уровне веб-сервера хорош, но когда нужны ограничения по бизнес-логике, нужна реализация в приложении. Например, пользователь не должен запрашивать код подтверждения больше 5 раз в день или отправлять заказ больше 3 раз в минуту. Redis — лучший инструмент для этого: хранит счетчики в памяти и автоматически очищает с TTL. В Laravel, Django и других фреймворках есть готовые middleware для rate limiting, нужна только настройка.
Практика Sayt.uz
На Sayt.uz используется многослойный rate limiting на уровне Nginx. На общие сайты установлено 30 запросов в секунду на IP, на страницы входа — 5 запросов в минуту. Для API endpoints ограничение по токену — каждый клиент имеет лимит в зависимости от тарифа. Если клиент превышает лимит, в кабинете появляется предупреждение и предложение повысить тариф. Через Cloudflare также включен дополнительный слой защиты — DDoS пиковая нагрузка автоматически обнаруживается и блокируется.