У меня есть несколько "запрещающих" правил перед конфигурацией лимита запросов. Если заблокированный пользователь (по правилам запрета) делает ddoss на сайт, он все равно запускает лимит запросов и, следовательно, создает тысячи записей в журнале. Почему? Я ожидал, что он не выйдет за пределы правил запрета.
include /etc/nginx/blacklist.conf;
limit_req zone=limit burst=3 nodelay;
В журнале отображается ошибка "запрет" и сразу за ней сотни ошибок ограничения запросов. Это повторяется снова и снова.
решение1
Когда nginx обрабатывает запрос, он проходит черезнесколько фаз. Среди них :предварительный доступидоступфазы.
Предварительный доступобычно там, где limit_req
работает, в то время как доступ там, где работают директивы allow
/ deny
. Это означает, что ограничение скорости выполняетсядоФильтрация IP, если обе директивы объявлены в одном и том же контексте.
Так что если вы хотите попытаться заставить какой-нибудь процесс, подобный fail2ban (учитывая код возврата 444 в вашем другом вопросе), работать непосредственно в nginx с использованием собственных директив, то это просто невозможно по своей природе.
решение2
Эта проблема немного устарела, но для тех, у кого она есть, лучшее решение, которое я нашел для этого случая, — использовать a map
с if
вместо deny
правил (хотя я стараюсь избегать использования ifs
в nginx), потому что, какКсавье Лукассказал:
ограничение скорости выполняется до фильтрации IP
Вы можете изменить свой blacklist.conf
файл:
deny 1.2.3.4;
к:
1.2.3.4 0;
Создайте файл whitelist.conf
:
if ( $whitelist = 0 ) {
return 403;
}
Затем в nginx.conf
, включите карту, которая добавляет в белый список все IP-адреса, за исключением тех, что указаны в blacklist.conf
:
http {
geo $whitelist {
/etc/nginx/blacklist.conf;
default 1;
}
...
}
Наконец, также nginx.conf
добавьте перед каждой директивой сервера whitelist.conf
файл:
server {
server_name ...;
listen 443 ssl;
include /etc/nginx/whitelist.conf;
ssl_certificate /etc/ssl/bundle.crt;
ssl_certificate_key /etc/ssl/server.key;
...
}
...
Запросы с IP-адресов, занесенных в черный список, будут немедленно возвращены.и не будет зафиксировано в файле журнала ошибок.
Вы также можете остановить регистрацию запросов с этих IP-адресов в файле журнала доступа с помощью:
access_log /path/to/file if=$whitelist;