Leia o "IP de origem" de uma conexão encaminhada

Leia o "IP de origem" de uma conexão encaminhada

Meu firewall está funcionando bem: a conexão da internet é encaminhada para um servidor NGINX, que então distribui adequadamente e o servidor de aplicativos funciona corretamente, exceto para os LOGs internos.

O problema que estou enfrentando é em relação ao IP recebido pelo nosso servidor de aplicação: eles não são o "IP do cliente", mas atualmente são o IP NGINX.

Considere esta rede: cliente IP 1, firewall IP 2, NGINX IP 3, servidor web IP 4.

No firewall vemos os pacotes sendo encaminhados para o NGINX, mas no NGINX tcpdumpvemos conexões de entrada do próprio NGINX IP 3 em vez do IP 1 da fonte original.

A questão é que nos LOGs do servidor web vemos nossas conexões de entrada como IP 3, o esperado é IP 1.

É uma configuração incorreta do firewall ou do NGINX? Todas as ideias sobre como resolver isso?

Configuração atual ( /etc/nginx/sites-enabled/app.domain.com):

...
location ^~ / {
proxy_pass      http://10.0.0.11;
proxy_set_header        Host                    $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;
}
...

Responder1

Esta é uma operação normal. Quando o nginx é um proxy reverso, ele abre uma conexão com o destino final e faz proxy do cliente para o servidor de aplicativos. O IP de origem não pode ser outro senão o endereço IP nginx, caso contrário a conexão TCP não funcionaria.

Você precisa configurar o servidor de aplicativos para usar o endereço IP especificado no X-Real-IPcabeçalho em vez do endereço IP da conexão TCP.

Responder2

A solução para este caso foi alterar o código c# conforme abaixo. Nenhuma alteração de firewall ou nginx foi feita.

var userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

Tentativas anteriores malsucedidas:

var userIP = Request.ServerVariables["X_FORWARDED_FOR"];
var userIP = Request.ServerVariables["X-REAL-IP"];
var userIP = Request.ServerVariables["REMOTE_ADDR"];
var userIP = Request.UserHostAddress;

Obrigado a todos os contribuidores por ajudarem a esclarecer que o problema não estava no firewall nem na configuração do nginx.

informação relacionada