Limite de taxa nginx com o cabeçalho X-Forwarded-For

23

Eu estou olhando para limitar a taxa usando HttpLimitReqModule do nginx . No entanto, todas as solicitações são provenientes do mesmo IP (um balanceador de carga), com o endereço IP real nos cabeçalhos.

Existe uma maneira de ter o limite de taxa nginx com base no ip no X-Forwarded-Forcabeçalho em vez do ip da fonte?

John Brodie
fonte

Respostas:

28

Sim, a sequência típica de definição de configuração com limitação de taxa se parece com:

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;

Onde $binary_remote_addrestá a chave exclusiva para o limitador. Você deve tentar alterá-lo para $http_x_forwarded_forvariável que obtém o valor do X-Forwarded-Forcabeçalho. Embora isso aumente o consumo de memória porque $binary_remote_addrestá usando o formato binário compactado para armazenar endereços IP e $http_x_forwarded_fornão está.

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;
Andrei Mikhaltsov
fonte
Acabei de chegar à mesma conclusão e, em um teste rápido, funciona bem. Obrigado por apontar o aumento do uso de memória.
John Brodie
2
Cuidado, pode haver problemas de segurança graves para isso: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell
Observe que as informações em que o blog post sobre symfony era endereços com o seguinte: symfony.com/doc/current/components/http_foundation/...
calumbrodie
5
Se você usar o módulo realip, a $binary_remote_addrvariável será definida corretamente.
precisa saber é o seguinte
5

A limit_req_zonediretiva define a variável a ser usada como chave para o agrupamento de solicitações.
Geralmente, o $binary_remote_addré usado e não $remote_addrporque é menor e economiza espaço.

Talvez você queira usar o RealipModule como alternativa .
Isso reescreverá as variáveis ​​de endereço remoto para o endereço fornecido em um cabeçalho personalizado e também facilitará o registro e o uso de outras variáveis.

Lukas
fonte
1
+1 para o módulo RealIP. Ao usar este módulo, $binary_remote_addre $remote_addrnormalmente é definido como o valor do cabeçalho configurado X-Forwarded-For- portanto, suas variáveis ​​padrão agora são o "endereço IP do cliente real". Corra nginx -Vpara ver se o NGINX foi construído com --with-http_realip. Então a configuração é tão simples quanto set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; :, onde a faixa CIDR é a do seu balanceador de carga upstream que está configurando o X-Forwarder-Forcabeçalho.
markdsievers 9/07