Haproxy não está passando corretamente no cabeçalho X-Forwarded-For

3

Tenho servidores da Web de back-end que recebem solicitações por meio do haproxy- > nginx- > fastcgi. O aplicativo da web costumava ver vários ip's chegando no cabeçalho X-Forwarded-For, encadeados com vírgulas (a maioria dos IPs originais à esquerda).

Em algum ponto do passado recente (apenas notei, por isso não sei o que causou isso) algo mudou, e agora estou vendo apenas um único IP passado no cabeçalho para o meu aplicativo da web.

Eu tentei com o haproxy 1.4.21 e 1.4.22 (atualização recente) com o mesmo comportamento. Haproxy tem o conjunto de cabeçalho forwardfor:

option forwardfor

Nginx fastcgi_params config define este cabeçalho para ser passado para o aplicativo:

fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;

Alguém tem alguma ideia sobre o que pode estar errado aqui?

EDITAR: Acabei de começar a registrar a variável $ http_x_forwarded_for nos logs nginx, e o nginx está sempre vendo apenas um IP, o que nunca deveria ser o caso, já que devemos sempre ver o nosso haproxy ip adicionado lá, certo? Portanto, o problema deve estar no manuseio do nginx da variável que está chegando ou no haproxy não estar construindo corretamente. Vou continuar cavando ...

EDIT # 2: Eu habilitei o log de cabeçalho request e response no HAProxy, e ele não está cuspindo nada para o X-Forwarded-For, o que parece muito estranho:

10 de outubro 10:49:01 newark-lb1 haproxy [19989]: 66.87.95.74:47497 [10 / out / 2012: 10: 49: 01.467] serviço http / newark2 0/0/0/16/40 301 574 - - ---- 4/4/3/0/0 0/0 {} {} "GET / 2zi HTTP / 1.1" O

Aqui estão as opções que eu defini para isso no meu frontend:

mode http
option httplog
capture request header X-Forwarded-For len 25
capture response header X-Forwarded-For len 25
option httpclose
option forwardfor

EDIT # 3: Parece que haproxy está mexendo no cabeçalho e passando apenas um para o backend. Isso está impactando bastante nosso serviço de produção, portanto, se alguém tiver uma ideia, será muito bem-vinda. Estou perplexo ...: (

    
por JesseP 10.10.2012 / 18:44

2 respostas

2

Para responder à sua última pergunta no comentário, é normal ter mais de um endereço IP no XFF, esse cabeçalho é uma lista de valores e os proxies geralmente adicionam o endereço do cliente lá. Como todos na longa cadeia anexam valores lá, seu servidor deve usá-los na ordem inversa. Por exemplo, o último valor será aquele adicionado pela instância haproxy na frente do servidor, e o valor anterior será aquele adicionado pelo cache reverso antes do haproxy, etc ...

Se você preferir não adaptar o aplicativo para analisar corretamente o cabeçalho, também é possível pedir ao haproxy para removê-lo antes de adicionar seu próprio cabeçalho XFF:

reqidel ^X-Forwarded-For:

Dessa forma, o servidor só receberá o valor adicionado por haproxy, que será o cliente da haproxy.

    
por 01.11.2012 / 09:08
0

Acho que há alguma confusão na maneira como você tenta usar o cabeçalho X-Forwarded-For.

Primeiro, o fato de o nginx ver um endereço IP significa que o haproxy o adiciona corretamente. O cabeçalho contém apenas o endereço de origem do qual o haproxy recebeu a conexão, portanto, é normal que você não veja o endereço IP do haproxy nos registros nginx.

Em segundo lugar, também é esperado que você não observe x-forwarded-in em solicitações recebidas, porque apenas alguns proxies de saída adicionam o cabeçalho, mas em geral é recomendado não fazê-lo ao acessar a Internet. Se alguns usuários enviarem uma solicitação com esse cabeçalho, você verá isso na captura do haproxy e o nginx registrará esse valor e o IP do cliente adicionado por haproxy.

O que eu não entendo é o seu ponto # 3, porque você parece assumir que o cabeçalho está necessariamente presente nas solicitações recebidas, o que obviamente não é o caso, a julgar pelas capturas do haproxy e pelos logs do nginx. Acabei de lhe enviar um pedido agora com "X-Forwarded-For: Oi, Jesse, este é o Willy" que você deve ver nos logs haproxy e nginx se puder ajudar a solucionar problemas.

O que é possível é que antes você estava acostumado a ver vários endereços porque um dos seus principais visitantes estava usando um proxy de saída que adicionou o cabeçalho XFF, ou porque você tinha outro proxy reverso na frente do haproxy (por exemplo: apache, stunnel, ...).

BTW, você deve substituir "option httpclose" por "option http-server-close", ele ativará o keep-alive com os clientes e reduzirá o tempo de carregamento da página para aqueles que experimentarem alta latência.

    
por 14.10.2012 / 10:57