Nginx Múltiplos se as instruções causarem o uso da memória para saltar

5

Precisamos bloquear um grande número de solicitações por endereço IP com nginx. As solicitações são intermediadas por proxy por um CDN e, portanto, não podemos bloquear com o endereço IP do cliente real (seria o endereço IP do CDN, não o cliente real). Então, temos $ http_x_forwarded_for que contém o IP que precisamos bloquear para uma determinada solicitação.

Da mesma forma, não podemos usar tabelas IP, pois o bloqueio do endereço IP do cliente com proxy não terá efeito. Precisamos usar o nginx para bloquear o pedido com base no valor de $ http_x_forwarded_for.

Inicialmente, tentamos várias declarações if simples: link

No entanto, isso fez com que nosso uso de memória nginx saltasse consideravelmente. Fomos de algum lugar em torno de um tamanho de 40MB para um tamanho de 200MB.

Se mudássemos as coisas e criassemos um regex grande que correspondesse aos endereços IP necessários, o uso de memória era bastante normal: link

Lembre-se de que estamos tentando bloquear mais de 3 ou 4 endereços IP ... mais de 50 a 100, que podem ser incluídos em vários blocos de configuração do servidor nginx (20+).

Pensamentos? Sugestões?

Estou interessado em saber por que o uso de memória aumentaria muito usando vários blocos se, e também se há maneiras melhores de atingir nosso objetivo.

    
por Justin Kulesza 24.10.2012 / 21:43

2 respostas

4

Sugiro testar o módulo de mapa com algo parecido com isto:

map $http_x_forwarded_for $deny_access {
    default     0;
    1.2.3.4     1;
    1.2.3.5     1;
    1.2.3.6     1;
}

if ($deny_access = 1) {
    return 403;
}

444 é um código de status especial que faz com que o nginx solte a conexão sem enviar uma resposta. No seu caso, isso está deixando cair a conexão entre o nginx e o CDN - o CDN decide então o que devolver ao cliente. Eu sugeriria retornar o padrão 403 (Proibido).

    
por 24.10.2012 / 22:18
1

Outra opção seria usar o módulo de IP Real para definir o IP do cliente para o valor de X-Forwarded-For e, em seguida, usar deny diretivas para controlar o acesso.

No entanto, isso retornaria um 403 (em vez da resposta vazia retornada usando 444). Também requer que o Ngnix seja compilado com --with-http_realip_module - algo que pode não ser uma opção se você estiver restrito a usar uma distribuição binária.

    
por 25.10.2012 / 16:37

Tags