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? :(

KacproSo
fonte

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])
Jakov Sosic
fonte
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]
GregL
fonte
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])]
user489680
fonte
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)]
user3540644
fonte
-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.

Jeroen
fonte
Ele não pode instalar quaisquer módulos ..
neutrinus