Substituindo o cabeçalho X-Forwarded-For no haproxy?

6

No meu balanceador de carga HAProxy, tenho os seguintes fragmentos de configuração:

defaults
    mode                    http
    log                     global
    option                  httplog clf
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch

frontend  main_http *:80
    option forwardfor except 127.0.0.1
    option httpclose
    default_backend         backend_http

backend backend_http
    balance     roundrobin
    option httpchk
    server  node1 10.0.0.64:80 check port 80
    server  node2 10.0.0.65:80 check port 80
    server  node3 10.0.0.66:80 check port 80

Nos nós (Tomcat), estou registrando solicitações neste formato (combinadas com x-forwarded-for no primeiro campo e o REMOTE_ADDR real colado no final):

pattern='%{X-Forwarded-For}i - %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %a'

Isso parece funcionar bem para a maioria das solicitações, mas em alguns casos, presumo que os clientes estão por trás de proxies, estou vendo solicitações em que o primeiro campo contém esses valores (cada linha representa uma solicitação real, eu desfiei os IPs reais para privacidade):

10.83.103.44, 10.83.103.44 
10.83.198.52, 10.83.198.52 
10.53.109.36, 10.53.109.36 
unknown, unknown 
192.168.1.43, 127.0.0.1 
192.168.11.189, 127.0.0.1 
10.1.6.3, 216.x.y.194, 10.37.52.202 
192.168.50.250, 38.x.y.5, 10.37.31.201 

De acordo com os documentos do HAproxy, o último X-Forwarded-For deve ser o correto que ele anexou, mas este não parece ser o caso. Meu aplicativo usa o IP do cliente para uma pesquisa geográfica, portanto, isso não é apenas um problema de registro, ele está estragando tudo.

O que eu gostaria de fazer é: em vez de ter o HAproxy anexando o IP do cliente ao cabeçalho existente do X-Forwarded-For, simplesmente sobrescreva-o. Portanto, se ele receber X-Forwarded-For: 10.1.2.3 do endereço IP 98.76.54.32, o que ele enviaria para os clientes é apenas X-Forwarded-For: 98.76.54.32 . Há alguma maneira de fazer isso? Eu gostaria de saber por que esse lixo óbvio está chegando aos nós - unknown, unknown é claramente informação de lixo eletrônico - mas vou me contentar com uma solução alternativa se existir.

Obrigado antecipadamente.

    
por Evan 10.02.2012 / 21:43

3 respostas

11

Remova o cabeçalho da solicitação antes que o HAProxy adicione o seu próprio:

reqidel ^X-Forwarded-For:.*

O risco para essa mudança é que você perderá suas informações sobre o endereço IP do cliente "real" - seus logs estarão mostrando o IP do servidor proxy que o cliente está usando. Parece que você está bem com isso!

Como um aparte, consulte esta pergunta para obter informações interessantes sobre a confusão na ordem de adição do cabeçalho X-Forwarded-For .

    
por 10.02.2012 / 22:14
1

Para quem ainda está intrigado, você pode usar um desses dois snippets diretamente:

Primeiro:

backend forward_real_ip
    mode http
    reqidel ^X-Forwarded-For:.*
    option forwardfor

Segundo:

backend forward_real_ip
   mode http
   http-request set-header X-Forwarded-For %[src]

Veja os documentos do HAProxy:

por 20.02.2018 / 15:42
0

Se você olhar a documentação do haproxy especificamente na opção forwardedfor , você pode ler:

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

Você pode alterar a linha correspondente em sua configuração, como:

option forwardfor except 127.0.0.1 header My-X-Forwarded-For

Dessa forma, você terá dois X-Forwarded-For cabeçalhos. Pode ser útil para você manter os IPs reais dos clientes e, ao mesmo tempo, obter o haproxy inserindo seu cabeçalho sem confusão.

Esta é apenas mais uma opção na qual você pode estar interessado:)

    
por 11.02.2012 / 09:08