nGinX Forbidden ainda aciona limite de solicitações

nGinX Forbidden ainda aciona limite de solicitações

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_reqfunciona, enquanto access é onde as diretivas allow/ denyfuncionam. 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 mapwith an ifem vez das denyregras (embora eu tente evitar usar ifsno nginx), porque assimXavier Lucasdisse:

a limitação de taxa é feita antes da filtragem de IP

Você pode alterar seu blacklist.confarquivo 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.confinclua 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.confarquivo:

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; 

informação relacionada