Eu tenho algumas regras de "negação" antes da configuração do limite de solicitações. Se um usuário bloqueado (pelas regras de negação) estiver fazendo ddoss no site, ele ainda aciona o limite de solicitações e, portanto, cria milhares de entradas de log. Por que? Eu esperava que isso não ultrapassasse as regras de negação.
include /etc/nginx/blacklist.conf;
limit_req zone=limit burst=3 nodelay;
O log mostra um erro proibido e logo depois centenas de erros de limitação de solicitação. Isso se repete continuamente.
Responder1
Quando o nginx processa uma solicitação, ela passavárias fases. Entre eles :pré-acessoeacessofases.
Pré-acessonormalmente é onde limit_req
funciona, enquanto access é onde as diretivas allow
/ deny
funcionam. Isso significa que a limitação da taxa é feitaantesFiltragem de IP se ambas as diretivas forem declaradas no mesmo contexto.
Portanto, se sua vontade é tentar fazer com que algum processo semelhante ao fail2ban (dado o código de retorno 444 da sua outra pergunta) funcione diretamente no nginx usando diretivas nativas, isso simplesmente não é possível por natureza.
Responder2
Esse problema é um pouco antigo, mas para quem está com esse problema, a melhor solução que encontrei para esse caso é usar a map
with an if
em vez das deny
regras (embora eu tente evitar usar ifs
no nginx), porque assimXavier Lucasdisse:
a limitação de taxa é feita antes da filtragem de IP
Você pode alterar seu blacklist.conf
arquivo de:
deny 1.2.3.4;
para:
1.2.3.4 0;
Crie um arquivo whitelist.conf
:
if ( $whitelist = 0 ) {
return 403;
}
Em seguida, nginx.conf
inclua um mapa que coloque todos os IP na lista de permissões, exceto aqueles em blacklist.conf
:
http {
geo $whitelist {
/etc/nginx/blacklist.conf;
default 1;
}
...
}
Finalmente, também em nginx.conf
, adicione antes de cada diretiva de servidor o whitelist.conf
arquivo:
server {
server_name ...;
listen 443 ssl;
include /etc/nginx/whitelist.conf;
ssl_certificate /etc/ssl/bundle.crt;
ssl_certificate_key /etc/ssl/server.key;
...
}
...
As solicitações dos ips da lista negra serão retornadas imediatamentee não será registrado no arquivo de logs de erros.
Você também pode impedir que as solicitações desses ips sejam registradas no arquivo de logs de acesso com:
access_log /path/to/file if=$whitelist;