Eu tenho um problema com o HAproxy.
Eu uso o HAproxy como balanceador de carga, que distribui solicitações http recebidas para 5 servidores web. normalmente uma solicitação de cliente é encaminhada para servidores da Web com o IP do loadbalancer. Mas preciso de IPs de clientes ou IPs reais que solicitem algo dos servidores da web. Porque precisamos registrar os IPs do cliente real.
Eu tento obter os IPs do cliente em servidores web, mas não consigo obter sucesso até agora. Sempre vejo o IP do balanceador de carga.
Eu uso a opção x-forward-for, mas não está resolvido o problema. Depois disso, encontrei outra opção " source 0.0.0.0:80 usesrc clientip ", mas fiquei com um erro ao tentar executar o HAproxy, que trata de necessidades de compilação com a opção USE_TPROXY do HAproxy. Eu fiz isso, recompilei o HAproxy com a opção USE_TPROXY, mas não altera nada. o que posso fazer para aprender os IPs de clientes reais.
Minha versão do kernel do linux é 2.6.32-34. Quero dizer que o kernel é compatível com proxy transparente. e eu uso o UBUNTU 10.4 LTS
meu arquivo de configuração está aqui
global
maxconn 100000
uid 99
gid 99
daemon
defaults
option forwardfor except 127.0.0.1
mode http
(1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
(2)source 0.0.0.0:80 usesrc clientip
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen myWeb 0.0.0.0:80
mode http
balance source
option forwardfor header X-Client
option http-server-close
stats enable
stats refresh 10s
stats hide-version
stats scope .
stats uri /lb?stats
stats realm LB2\ Statistics
stats auth admin:xXx
server S1 192.168.1.117:80 check inter 2000 fall 3
server S2 192.168.1.116:80 check inter 2000 fall 3
server S3 192.168.1.118:80 check inter 2000 fall 3
(1) (2) Durante o teste do HAproxy, usei uma dessas duas linhas.
Alguém me ajuda a aprender IPs reais dos clientes que estão sendo solicitados de nossos servidores?
Respostas:
Eu resolvi esse problema. Pode ser que não foi um problema desde o início. Eu fiz a pesquisa no google quando enfrentei esse problema e vi que
linha para usar no arquivo haproxy.cfg e também outras opções. Eu tentei essas opções, incluindo recompilar o haproxy ... Mas o problema real relacionado ao aprendizado de IPs de clientes reais em servidores da Web não é proveniente do HAproxy, trata-se de ler cabeçalhos por scripts de servidor; no nosso caso, essa linguagem de script é PHP.
Eu tento aprender os IPs do cliente por esses comandos
e esses comandos exibem o IP do loadbalancer. Isso está correto, mas não é o que eu esperava. Apesar da opção forwardfor, esses comandos me deram o IP do loadbalancer
Ao usar a opção forwardfor, permitimos ao HAproxy inserir o cabeçalho x-forwarded-for nos pedidos do cliente enviados aos nossos servidores da web. O HAproxy colocou esse campo no cabeçalho, mas eu o ignorei. Hoje eu percebi que esse é um campo de cabeçalho e tenho que ler esse cabeçalho assim
Com este comando, obtive o endereço IP do cliente, não o endereço IP do loadbalancer.
Mas minha oferta é para obter os dados do cabeçalho para investigar as outras informações da função getallheaders () do PHP.
Fim de todo o meu último arquivo haproxy.cfg é como abaixo.
No entanto, tenho muitas coisas ausentes sobre o HAproxy, como qual é o significado uid ou gid.
fonte
Se você precisar do endereço IP do cliente no log do Apache, poderá alterar o seu apache conf para registrar o X-forwarded no lugar da fonte original (5h)
fonte
Tentei a solução do @ System e parece que o nome do cabeçalho foi alterado de
HTTP_X_FORWARDED_FOR
parax-forwarded-for
. Provavelmente está relacionado com a versão HAproxy, porque a resposta foi escrita 5 anos atrás ...?Como exemplo, isso está funcionando na produção:
String requestIp = httpRequest.getHeader("x-forwarded-for");
fonte