Сегодня представляю вниманию заготовку в виде конфигурации nginx, с помощью которой вы без труда сможете отбить распределенную аттаку седьмого уровня (L7) и такого-же класса средней школы.
Итак, все складываем в глобально подгружаемые конфиги, в дебиан это /etc/nginx/conf.d
задаем белый список, он же список исключений
geo $whitelist {
default 0;
127.0.0.1 1; # localhost
10.10.10.0/24 1; # office, internal network
}
map $whitelist $limit {
0 $binary_remote_addr;
1 "";
}
и активируем защиту
limit_req_zone $limit zone=main:16m rate=240r/m;
limit_req_log_level info;
limit_req zone=main burst=2400;
limit_req_status 444;
#limit_req_dry_run on;
В приведённом выше примере мы отбрасываем запросы с одного ip-адреса частотой более 240 запросов в минуту, с всплеском 2400.
Внимание, директива в последней стоке закомментирована, т.к. появилась в сравнительно новой версии nginx (1.17.6)
Если по каким-то причинам блокировка на основе ip-адреса не подходит, например, на сайт льётся мобильный траффик с ограниченного пула ip-адресов сотового оператора, то можно подмешать в словарь зоны порт клиента, http-метод и нормализованный uri, обьявление зоны в этом случае будет выглядеть так
limit_req_zone $binary_remote_addr:$remote_port:$request_method:$uri zone=main:32m rate=240r/m;