Meu servidor da web está inundado com spammers de conteúdo.
Eu não quero bloquear completamente os IPs usando iptables porque eles são de IPs dinâmicos e se eu bloquear um IP, depois de alguns minutos o spam vem de outro IP, então eu suponho que ele usa uma rede de bots de PCs infectados que provavelmente se reconecta e eu não quero acabar bloqueando completamente um ISP inteiro ou bloquear permanentemente os nós de saída. Então eu quero usar o soft bloqueio similar ao que o cloud-flare e o google fazem. Eles exibem uma página da Web para esses IPs com pontuação ruim, contendo informações sobre o motivo pelo qual eles estão bloqueados e a possibilidade de desbloqueá-los.
Eu também tenho uma solução para conseguir isso, mas estou pensando se há uma maneira melhor de resolver isso.
Eu tenho uma regra catch all que vai passar o pedido para o meu aplicativo que pontua o IP, se o IP tiver uma pontuação ruim, a página de informações será exibida com um erro 502. Se o IP está bem, então um 418 é retornado e o pedido é passado para @final-pass
location ~ {
error_page 500 418 = @final-pass;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_intercept_errors on;
proxy_pass http://unix:/tmp/ip-check.sock;
}
Então eu tenho o @final-pass
que este encaminhará o pedido para uma segunda instância do nginx que tem uma configuração regular e todos os hosts virtuais:
location @final-pass {
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;
proxy_request_buffering off;
proxy_http_version 1.1;
}
Existe uma maneira melhor ou correta de resolver isso? O erro 418
parece ser um pouco feio.
EDITAR
Existe uma maneira melhor / correta para conseguir que eu possa passar o pedido para um upstream primeiro, e se o pedido não for tratado por esse upstream passá-lo para outro, sem abusar do erro 418
?
EDIT2 444
pode ser um código de erro melhor, mas a questão ainda é a mesma, existe uma maneira melhor de usar um erro para esse tipo de encaminhamento .
Tags nginx