haproxy - passa ip original / remoto no modo tcp

8

Eu tenho o haproxy configurado com keepalived para balanceamento de carga e failover de IP de um cluster percona, e como funciona muito bem, eu gostaria de usar o mesmo lb / failover para outro serviço / daemon.

Eu configurei o haproxy desta maneira:

listen my_service 0.0.0.0:4567
    mode tcp
    balance leastconn
    option tcpka
    contimeout      500000
    clitimeout      500000
    srvtimeout      500000

    server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
    server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3

O balanceamento de carga funciona bem, mas o serviço vê o IP do balanceador de carga em vez dos IPs reais dos clientes. No modo http, é muito fácil passar o haproxy pelo IP remoto, mas como faço no modo tcp? Isso é crítico devido à natureza do serviço necessário para carregar o equilíbrio.

Obrigado! Vito

Vito Botta
fonte
aqui está a documentação completa do haproxy 1.6.6 cbonte.github.io/haproxy-dconv/…

Respostas:

3

Apenas para referências futuras, keepalived é uma solução para failover e não balanceamento de carga (talvez você queira dizer LVS?). o modo proxy transparente do HAProxy não tem nada a ver com nenhuma maneira especial de enviar o IP original, que seria o modo HTTP não transparente normal, no qual você pode usar um cabeçalho HTTP padronizado para isso.

Na minha opinião, a resposta correta à pergunta original é: Você pode compilar o suporte a proxy transparente no HAProxy em um kernel Linux habilitado para TPROXY. Isso, juntamente com a versão de suporte TPROXY adequada + a configuração do iptables na mesma máquina, permite um suporte a proxy TCP totalmente transparente e real. Isso significa que os servidores back-end NÃO precisam de nenhuma configuração especial.

Observe que, na verdade, essa não é a configuração recomendada para o HAProxy e só deve ser usada se você precisar absolutamente.

Robbert
fonte
2

Aparentemente, existe algum tipo de modo "transparente" para a haproxia que eu nunca olhei ou que queira saber, que você poderia tentar. Caso contrário, você precisará ensinar o que o serviço de back-end é sobre a maneira especial da haproxy de enviar o IP original ("PROXY blahblah") e solicitar que o serviço retire o IP original.

Por que você está se incomodando com haproxy? Você já manteve a manutenção no local e também faz o balanceamento de carga transparente adequado.

mulher
fonte
Oi, muito obrigado pela sua resposta :) Estou lendo algumas coisas sobre o suporte 'tproxy', acho que foi isso que você quis dizer? Além disso, eu não tinha considerado o balanceamento de carga com keepalived diretamente para isso. Keepalived passa o IP original do cliente?
Vito Botta
Sim, keepalived mantém intacto o IP original, porque é um balanceador de carga, não um proxy.
Womble
2

O uso send-proxyem sua configuração (por servidor) fornecerá o IP de origem original no lado do servidor de recebimento, mesmo no modo TCP. Isso requer HAProxy 1.5+.

Você pode encontrar mais informações sobre o Proxy Protocol na documentação HAProxy .

listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout      500000
clitimeout      500000
srvtimeout      500000

server host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
server host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
Nils Schmidt
fonte
HI Nils, obrigado pela solução, mas quando eu entrada send-proxy, que causam o baixo db (haproxy não consegue detectar o host)
neobie
O mesmo aconteceu comigo também com o DB. qualquer solução ?
Peeyush #
-4

Essa configuração funcionou para mim. O IP de origem pode ser recuperado em $ _SERVER ['HTTP_X_FORWARDED_FOR']:

global
        [..... coisas normais .... ]   
        ssl-server-verifique nenhum

frontend main *: 5000
        bind *: 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        modo http
        opção forwardfor
        reqadd X-Forwarded-Proto: \ https
        default_backend https_server

servidor de servidor https_server
        modo http
        balance leastconn
        opção tcpka
        mesa de palito tipo ip tamanho 200k expiram 30m
        verificação ssl do servidor srv04 192.168.1.10:443
        verificação ssl do servidor srv05 192.168.1.11:443
Pedro Sayago
fonte
2
esta resposta não se aplica. a conexão não é HTTP.
longneck
Você está sugerindo que a conexão https deve estar no modo tcp ?.
Pedro Sayago
Não, estou dizendo que a pergunta usa tcp e sua resposta se aplica apenas a http / s.
longneck
ok, boa sorte então, não encontrei nenhum documento relativo ao haproxy no modo tcp forwarding ip. Talvez a camada em que as solicitações são processadas não possa passar essas informações.
Pedro Sayago