A descrição da Wikipedia do cabeçalho HTTP X-Forwarded-For
é:
Encaminhado para X: cliente1, proxy1, proxy2, ...
A documentação nginx para a diretiva real_ip_header
diz, em parte:
Esta diretiva define o nome do cabeçalho usado para transferir o endereço IP de substituição.
No caso de X-Forwarded-For, este módulo usa o último ip no cabeçalho X-Forwarded-For para substituição. [Ênfase minha]
Essas duas descrições parecem estar em desacordo. Em nosso cenário, o X-Forwarded-For
cabeçalho é exatamente como descrito - o endereço IP "real" do cliente é a entrada mais à esquerda. Da mesma forma, o comportamento do nginx é usar o valor mais à direita - que, obviamente, é apenas um de nossos servidores proxy.
Meu entendimento X-Real-IP
é que ele deve ser usado para determinar o endereço IP real do cliente - não o proxy. Estou faltando alguma coisa, ou isso é um bug no nginx?
E, além disso, alguém tem alguma sugestão de como fazer com que o X-Real-IP
cabeçalho exiba o valor mais à esquerda , conforme indicado pela definição de X-Forwarded-For
?
fonte
A análise do
X-Forwarded-For
cabeçalho é realmente falha no módulo nginx real_ip.Inicia na extremidade direita da cadeia de cabeçalho e, assim que vê um espaço ou vírgula, para de procurar e cola a parte à direita do espaço ou vírgula na variável IP. Portanto, trata o endereço de proxy mais recente como o endereço de cliente original .
Não está se saindo bem de acordo com as especificações; esse é o risco de não ser explicitado em termos dolorosamente óbvios em uma RFC.
Além disso: é difícil até encontrar uma boa fonte primária no formato, que foi originalmente definido pelo Squid - uma escavação na documentação confirma a ordem; mais à esquerda é o cliente original, mais à direita é o anexo mais recente. Estou extremamente tentado a adicionar uma [citação necessária] a essa página da Wikipedia. Uma edição anônima parece ser a autoridade da Internet sobre o assunto.
Se possível, você pode fazer com que seus proxies intermediários parem de se adicionar ao final do cabeçalho, deixando-o apenas com o endereço do cliente real?
fonte
X-Forwarded-For
já existe. (é o endereço IP do cliente correto), o próprio nginx passa a acrescentar o endereço IP do nosso balanceador de carga (o salto anterior) aoX-Forwarded-For
cabeçalho. (presumivelmente anexando o que ele vê como "endereço remoto"). Se simplesmente não fizesse isso, seria capaz de usar oX-Forwarded-For
cabeçalho como antes. (temos sido recentemente migrando para nginx)proxy_pass
- e, mesmo assim, apenasproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
no local.X-Forwarded-For
cabeçalho com o endereço do cliente original à esquerda e possivelmente os proxies anexados a ele. Portanto, o proxy atualmente em exibição adiciona o proxy anterior (= iniciador) ao final dessa lista e serve oX-Forwarded-For
cabeçalho assim aumentado para o próximo salto upstream. É verdade que eles poderiam ter escolhido uma redação mais óbvia.X-Real-IP é o endereço IP do cliente real com o qual o servidor está falando (o cliente "real" do servidor), que, no caso de uma conexão com proxy, é o servidor proxy. É por isso que o X-Real-IP conterá o último IP no cabeçalho X-Forwarded-For.
fonte
X-Real-IP
o retorno endereço IP do meu próprio servidor proxy sempre ser útil?