Tenho um roteador virtualizado com endereço IP público atribuído a ele diretamente no proxmox. Quando envio uma solicitação para a porta 443 de uma rede diferente (de um navegador), o roteador encaminha corretamente a porta para meu contêiner NGINX em um IP privado.
Já que o roteador executou um NAT no pacote do IP público para um endereço local 10.0.0.0/8, como o NGINX sabe qual era o IP original do cliente? Ele relata meu IP público corretamente em access.log, mas todas as informações de IP que ele deveria estar vendo seriam o IP privado do roteador, não é?
Além disso, quando verifico os cabeçalhos na minha guia de rede no cliente, não há nenhum cabeçalho X-Forwarded-For, e também não há nenhum outro proxy reverso (que eu saiba) que adicionaria o cabeçalho, definitivamente nenhum com os certificados SSL corretos para fazer isso.
Obrigado
Porque o roteador está traduzindo o endereço de destino dos pacotes IP de entrada (para o IP público do seu roteador) e traduzindo-os para ter um endereço de destino do seu endereço IP privado NGINX (quando ele encaminha os pacotes), deixando o endereço de origem nos pacotes inalterado.
Portanto, apenas o endereço de destino é modificado, não o endereço de origem, que acredito ser chamado de DNAT.
O roteador pode fazer isso porque ele é capaz de rastrear a conexão internamente, em sua própria tabela de rastreamento NAT. Quaisquer pacotes que retornam do NGINX podem então ser apropriadamente desNATados novamente para a saída, uma vez que uma conexão inicial de entrada tenha sido rastreada e estabelecida.
Esse processo preserva o endereço de origem, e é por isso que o NGINX sabe qual é.