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 tcpdump
vemos 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-IP
cabeç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.