Задать вопрос
ms-dred
@ms-dred
Вечно что то не то и что то не так...

Как лимитировать трафик с определенной страны в Nginx?

Китаезы атакуют, баню всю страну и все хорошо, никакого ддоса нет, но есть же и нормальные люди которые ищут информацию какую то на сайте, к тому же для них даже языковая версия имеется. Как только бан снимаю в nft, так через день другой опять начинают ддосить сервер запросами.
Реально ли сделать limit_zone именно для страны?

Сейчас к примеру имеются следующие настройки лимитирующие запросы по IP, но в случае ддоса они бесполезны.
limit_req_zone $binary_remote_addr zone=auth:10m rate=35r/s;

limit_req zone=auth burst=60 delay=35;
limit_req_log_level warn;
limit_req_status 429;


У меня два вопроса к знающим людям:
1. А можно ли вместо $binary_remote_addr указать локаль в браузере? Если что сайт автоматом создает куку с локалью locale=zh, но думаю она бесполезна в случае ддоса, к тому же и куки могут быть отключены. Может быть есть какие то стандартные переменные в nginx с помощью которых можно узнать есть ли в заголовке браузера информация что у пользователя язык выставлен "zh"?
2. Если с первым все можно сделать, то возможно ли в одном блоке server указать два лимита?
К примеру как то так
В кофиге
limit_req_zone $binary_remote_addr zone=auth:10m rate=35r/s;
limit_req_zone $LOCALE_ZH zone=zh_limit:10m rate=10r/s;

А в блоке server
limit_req zone=auth burst=60 delay=35;
limit_req zone=zh_limit burst=20 delay=10;
limit_req_log_level warn;
limit_req_status 429;


По факту хочется сделать следующее, если у пользователя стоит локаль zh, просто ставим его сразу в очередь и пусть ждет своего часа.
К слову, сервер на который идет ддосс выдерживает, с ним все хорошо, проблема в сервере на котором размещена база данных, очень много запросов поступает на нее, и она крашится от нехватки памяти. В боевых условиях вся эта связка выдерживает 200к в сутки, но вот всплески трафика от ддоса выдержать она не в силах.
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Средний 3 комментария
Решения вопроса 1
@dodo512
limit_req_zone
В качестве ключа можно использовать текст, переменные и их комбинации.
Запросы с пустым значением ключа не учитываются.

С помощью map новой переменной присваивать либо пустую строку либо $binary_remote_addr.

limit_req_zone $bad_locale zone=zh_limit:10m rate=10r/s;

map $cookie_locale $bad_locale {
    default     "";
    "zh"        $binary_remote_addr;
}

Дальше использовать limit_req zone=zh_limit как обычно. Ограничивать будеть только тех кто с нужной кукой.

Ещё вариант $http_accept_language если нужно проверять содержимое заголовка Accept-Language.
map $http_accept_language $bad_locale {
default     "";
~^zh        $binary_remote_addr;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
YCLIENTS Москва
от 350 000 до 400 000 ₽
Viletech Москва
от 70 000 до 120 000 ₽
от 200 000 до 260 000 ₽