encadeamento de proxy upstream NGINX

2

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 .

    
por t.niese 05.01.2017 / 07:57

0 respostas

Tags