Registrando o IP do solicitante original em vez do IP do proxy de encaminhamento para determinadas solicitações HTTP (logs nginx)

1

Eu uso nginx como um proxy reverso na frente do nosso servidor web de aplicativos (gunicorn; é um aplicativo Django). A maioria dos usuários que acessam este aplicativo da Web é roteada por meio de um proxy de encaminhamento .

Como os pedidos passam pelos servidores do proxy de encaminhamento, o endereço IP nesses casos é sempre dos servidores proxy em vez do solicitante original. Eu quero corrigir essa situação.

Todas as solicitações originadas do proxy de encaminhamento contêm um cabeçalho via:proxy . Em tais solicitações, o IP do solicitante original é enviado em um campo de cabeçalho HTTP separado chamado X-IORG-FBS-UIP (e também X-FORWARDED-FOR ).

A minha pergunta é: como posso configurar o nginx de forma a detectar se o pedido tem via:proxy header e, em caso afirmativo, registra o IP do solicitante original do X-IORG-FBS-UIP header? Um exemplo ilustrativo seria ótimo; desde já, obrigado! Meu nginx é v 1.4.6

Observe que não tem os intervalos de IP usados pelo proxy de encaminhamento. Se o fizesse, uma maneira de resolver esse problema seria configurar etc/nginx/conf.d/proxies_acl.conf com:

set_real_ip_from 1.2.3.0/22;
set_real_ip_from 23.22.20.0/22;
real_ip_header X-IORG-FBS-UIP;
    
por Hassan Baig 22.04.2017 / 01:59

2 respostas

3

Tente isso. Interessado em saber se funciona. Se você tem algum cliente que não está traduzido, isso quebraria isso.

set_real_ip_from 0.0.0.0/0;
real_ip_header X-IORG-FBS-UIP;

Suas declarações set_real_ip_from e real_ip_header acima são a maneira padrão de fazer isso. A única diferença entre a sua situação e o que a maioria das pessoas tem é que você não sabe o endereço IP dos proxies. 0.0.0.0/0 significa "todo endereço IP", portanto, as declarações acima dizem "para cada solicitação, obtenha o IP do cliente para os logs do cabeçalho X-IORG-FBS-UIP". Meu palpite é se esse cabeçalho não existir, ele usará o IP real.

Na maioria dos casos, você pode obter os endereços IP dos proxies. AWS, CloudFlare, etc. Por que você não conhece os IPs de seus proxies?

Também observo que você fez uma pergunta quase idêntica há alguns meses e aceitou a resposta. Se alguém não responder à sua pergunta, não a marque como resposta.

Método alternativo solicitado - NÃO FUNCIONA

Você solicitou um método alternativo com base na presença do cabeçalho via: proxy. Eu não acredito que isso seja possível. Eu escrevi isso

if ($http_X_via:proxy) {
  set_real_ip_from $remote_addr;
  real_ip_header X-IORG-FBS-UIP;
}

Mas isso falha. Nginx diz que set_real_ip_from não pode entrar em um bloco if. Isso significa que você precisa conhecer seus IPs antecipadamente ou usar minha outra solução acima.

    
por 22.04.2017 / 02:43
0

Há um bom motivo para especificar o endereço IP do proxy. Qualquer um pode enviar cabeçalhos de proxy para o seu servidor, com "ip real" configurado para algum endereço IP arbitrário, abrindo possíveis falhas de segurança se você confiar no endereço passado nesses cabeçalhos. É por isso que o módulo real_ip está configurado para que você especifique os proxies de encaminhamento confiáveis .

Se o seu objetivo é simplesmente fazer com que o nginx registre o suposto IP real, você não precisa alterar o IP do solicitante. Você só precisa registrar o que está nos cabeçalhos X-IORG-FBS-UIP e X-FORWARDED-FOR . Como descrito aqui , você pode configurar o logger nginx para capturar X-FORWARDED-FOR da seguinte forma:

add the following line in your general nginx.conf in the http {} section.

log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
  '"$request" $status $body_bytes_sent "$http_referer" '
  '"$http_user_agent"' ;

Eu acho que adicionando uma segunda diretiva de registrador para X-IORG-FBS-UIP permitirá que você lide com os dois. Mais sobre como configurar o logger nginx aqui .

    
por 22.04.2017 / 17:15