haproxy e encaminhando o endereço IP do cliente para os servidores

13

Eu tenho um problema com o HAproxy.

Eu uso o HAproxy como balanceador de carga que distribui solicitações http de entrada para 5 servidores da web. normalmente, uma solicitação do cliente é encaminhada para servidores da web com o IP do loadbalancer. Mas eu preciso de clientes IPs ou IPs reais que solicitam algo de servidores web. Porque precisamos registrar os IPs do cliente real.

Eu tento obter IPs do cliente em servidores web, mas não consigo sucesso até agora. Sempre vejo o IP do balanceador de carga.

Eu uso a opção x-forward-for mas não resolve o problema. Depois disso, eu encontrei outra opção " fonte 0.0.0.0:80 usesrc clientip ", mas fiquei triste ao tentar executar o HAproxy que é sobre as 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 mudei nada. o que posso fazer para aprender os IPs do cliente real?

Minha versão do kernel do Linux é 2.6.32-34 Quero dizer que o kernel é o proxy transparente de suporte. e eu uso 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) Ao testar o HAproxy, usei uma dessas duas linhas.

Alguém me ajuda a aprender IPs reais dos clientes que estão sendo solicitados pelos nossos servidores?

    
por System 15.11.2011 / 13:18

3 respostas

14

Eu resolvi esse problema. Pode ser que não tenha sido um problema desde o começo. Eu fiz pesquisa no google quando enfrentei esse problema, e vi que

option forwardfor

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 web não é proveniente de HAproxy, é sobre 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

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

e esses comandos exibem o IP do loadbalancer. Isso está correto, mas não é isso que eu esperava. Apesar da opção forwardfor desses comandos, me deu o IP do loadbalancer

Ao usar a opção forwardfor, fazemos ativar o HAproxy para inserir o cabeçalho x-forwarded-for nos pedidos do cliente enviados para nossos servidores da web. HAproxy colocou esse campo no cabeçalho, mas eu ignorei isso. Hoje percebi que este é um campo de cabeçalho e tenho que ler este cabeçalho como este

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

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 que a outra informação é a função getallheaders () para PHP.

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

O fim de todo o meu último arquivo haproxy.cfg é como abaixo.

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    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:passwd

    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

No entanto, eu tenho muitas coisas que faltam sobre o HAproxy, como o que é o significado uid ou gid.

    
por 17.11.2011 / 12:42
2

Se você precisar do endereço IP do cliente no log do Apache, você pode alterar seu conf do apache para registrar o X-forwarded-for no lugar da fonte original (5h)

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    
por 16.11.2011 / 22:47
1

Tentei apenas a solução do @ System e parece que o nome do cabeçalho foi alterado de HTTP_X_FORWARDED_FOR para x-forwarded-for . Provavelmente está relacionado com a versão do HAproxy, porque a resposta foi escrita há 5 anos atrás ...?

Como exemplo, isso está funcionando na produção:

String requestIp = httpRequest.getHeader("x-forwarded-for");

    
por 04.07.2016 / 23:24

Tags