O módulo real_ip do Nginx permite que você defina a $remote_addr
variável com base nos valores enviados em campos de cabeçalho específicos. Ele tem uma compreensão especial do X-Forwarded-For
cabeçalho e é capaz de usar o valor não confiável mais à direita no cabeçalho como o endereço IP de conexão.
Eu gostaria de usar o módulo real_ip para definir $remote_addr
o endereço IP de conexão. O problema que eu tenho é que eu sei quantos saltos de volta do final X-Forwarded-For
para olhar, mas não o endereço IP dos proxies no meio. Pelo que entendi, isso significa que não posso usar set_real_ip_from
para especificar o endereço IP do proxy.
O que eu gostaria de poder fazer é configurar o nginx para escolher o penúltimo endereço da lista como o $remote_addr
. Parece que o módulo real_ip só funciona se você tiver uma infraestrutura onde você conheça os endereços IP dos seus proxies.
Existe uma maneira de fazer isso com o módulo real_ip? Eu trabalhei em uma solução baseada em regex, mas prefiro usar o módulo real_ip se for possível.
Eu não acho que isso seja um engano do nginx real_ip_header e X-Forwarded-For parece errado ou perguntas semelhantes. Para reafirmar a questão:
- Eu sei quantos saltos a partir do final o endereço IP de conexão será.
- Não conheço os endereços IP confiáveis para proxies intermediários entre o IP de conexão e meu servidor, então não posso usar
set_real_ip_from
.
Mais detalhes sobre as especificidades:
Estou executando o nginx dentro do Google Cloud, por trás do balanceador de carga HTTP do Google Cloud. O Google Cloud usa o X-Forwarded-For
cabeçalho para indicar o ponto de entrada para a rede do Google Cloud. Eu sei que o penúltimo valor da X-Forwarded-For
lista é o que eu quero, mas não sei qual será o endereço IP do último valor (o proxy). Mesmo se eu pudesse enumerar todo o espaço de endereço do Google Cloud para proxies (não está especificado que o GCLB opera apenas dentro do espaço de endereço do GCP), isso o abriria para qualquer outro usuário que pudesse obter um servidor dentro desse espaço de endereço.
Acabei usando uma versão baseada em regex. Da minha configuração do nginx:
e então eu uso $connecting_ip na minha definição de servidor:
Isso não pode ser feito com o
ngx_http_realip_module
próprio, dado que, conforme especificado na descriçãoreal_ip_recursive
de , apenas o último endereço no campo de cabeçalho (ou seja, seus GFEs, quando definido como ) ou o último endereço não confiável (ou seja, o endereço do cliente, quando set to ) será correspondido para replace , portanto, mesmo que você tenha obtido o endereço do proxy anterior com manipulação de string e definido para ele, o módulo não mudaria .off
on
$remote_addr
$http_x_forwarded_for
$set_real_ip_from
$remote_addr
Portanto, parece que você terá que recorrer a
$remote_addr
se redefinir manualmente com uma expressão regular como mencionou ou usar outro módulo.Com isso dito, pode valer a pena notar que o endereço GFE do seu Load Balancer deve sempre corresponder ao
35.191.0.0/16
ou130.211.0.0/22
CIDRs .