HAProxy - como anexar o IP do cliente nos cabeçalhos X-Client-IP e X-Forwarded-For?


10

Estou com um problema no servidor HAProxy. Quero encaminhar no cabeçalho um IP do cliente. Quase consegui, mas há um caso interessante e não consigo descobrir. Eu preciso escrever o IP do cliente em 2 lugares no cabeçalho, nas tags X-CLIENT-IP e X-FORWARDED-FOR.

O problema é: quando eu uso

option http-server-close
option forwardfor

No servidor de destino, vejo no cabeçalho X-FORWARDED-FOR = xxx.xxx.xxx.xxx (ip do cliente), mas não há cabeçalho x-client-ip.

Quando eu uso:

option forwardfor header X-Client-IP
option http-server-close

No servidor de destino, vejo o cabeçalho X-CLIENT-IP = xxx.xxx.xxx (IP do cliente), mas X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip)

Eu preciso ver no cabeçalho de destino onde X-CLIENT-IP e X-FORWARDED-FOR tem valor de IP do cliente.

Eu tento misturar configurações como

 option forwardfor
 option forwardfor header X-Client-IP
 option http-server-close

Sem efeito. Também não consigo instalar nenhum módulo. O alvo é o IIS.

Alguma ideia? :(

Respostas:


12

Você pode tentar configurar um cabeçalho personalizado, assim:

http-request set-header X-Client-IP %[src]

Ou, você pode até copiá-lo do cabeçalho X-Forwarded-For, acho que a sintaxe seria algo como:

http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])

A segunda opção me fornece no cabeçalho x-client-ip = req.hdr_ip (% 5bX-Forwarded-For% 5d), então algo está errado. Mas vou tentar o primeiro.
— precisa saber é o seguinte

O cabeçalho de conjunto de solicitação http de primeira resolução X-Client-IP% [src] funciona perfeitamente.
— precisa saber é o seguinte

O último exemplo está errado, a regra correta é: http-request set-header X-Client-IP% [req.hdr_ip (X-Forwarded-For)]
— #

X-Client-IP e X-Forwarded-For têm finalidades diferentes. Não é seguro copiar o X-Forwarded-For, porque o HAProxy pode retornar o valor enviado pelo cliente.
— Der_Meister 10/09/19

5

Se você deseja usar os dois, precisará adicionar o segundo com uma http-requestpalavra - chave.

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]

Eu acho que o set-header é melhor para remover os cabeçalhos maliciosos enviados pelo cliente.
— Der_Meister 10/09/19

@Der_Meister Você pode estar certo, mas não vejo como isso tenha alguma relevância para esta pergunta ou resposta. Cuidado ao elaborar?
— GregL

1
O objetivo do cabeçalho X-Client-IP é informar ao back-end o endereço IP real da conexão, não um valor aleatório de um cabeçalho de entrada. Não está mencionado na pergunta, só quero avisar futuros leitores.
— Der_Meister 10/09/19

Novamente, você pode estar certo, mas neste exemplo, o X-CLIENT-IPnão está sendo definido pelo cliente, mas pelo HAProxy com base no IP de origem. Eu sugeriria deixar esses comentários em perguntas que sejam relevantes para não confundir os leitores.
— GregL

add-headernão remove o X-CLIENT-IPque pode ter sido definido pelo cliente. É por isso que o @Der_Meister recomendou o uso set-header. Sugiro editar sua resposta para usar set-headerem seu lugar.
— pistache

0

A resposta sugerida acima que não funcionou para o KacproSo só precisava ler o valor adicionando &[...], portanto, isso deve funcionar bem:

http-request set-header X-Client-IP %[req.hdr_ip([X-Forwarded-For])]

0

Experimentando o HAproxy 1.7, esta é a sintaxe correta que faz esse trabalho, sem os colchetes quadrados ao redor do X-Forwarded-For

   http-request set-header X-Client-IP %[req.hdr_ip(X-Forwarded-For)]

-2

Você pode instalar um módulo chamado mod_rpaf nos seus servidores back-end. Isso copia o X-FORWARDED-FOR IP para o X-CLIENT-IP. Para mais informações, consulte isso . No Windows, você deve ter módulos semelhantes, algo como filtros X-Forwarded-For ASAPI.


Ele não pode instalar quaisquer módulos ..
— neutrinus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.