haproxy - passer l'IP original / distant en mode tcp

8

J'ai installé un haproxy avec keepalived pour l'équilibrage de charge et le basculement IP d'un cluster percona, et comme cela fonctionne très bien, j'aimerais utiliser le même lb / failover pour un autre service / démon.

J'ai configuré haproxy de cette façon:

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

L'équilibrage de charge fonctionne correctement, mais le service voit l'IP de l'équilibreur de charge au lieu des adresses IP réelles des clients. En mode http, il est assez facile de faire passer le haproxy sur l'IP distante, mais comment faire en mode tcp? Ceci est essentiel en raison de la nature du service dont j'ai besoin pour équilibrer la charge.

Merci! Vito

Vito Botta
la source
voici la documentation complète de haproxy 1.6.6 cbonte.github.io/haproxy-dconv/…

Réponses:

3

Juste pour de futures références, keepalived est une solution pour le basculement et non l'équilibrage de charge (peut-être voulez-vous dire LVS?). le mode proxy transparent pour HAProxy n'a rien à voir avec un moyen spécial d'envoyer l'IP d'origine, qui serait le mode HTTP normal non transparent où vous pouvez utiliser un en-tête HTTP standardisé pour cela.

À mon avis, la réponse correcte à la question d'origine est: vous pouvez compiler un support de proxy transparent dans HAProxy sur un noyau linux activé par TPROXY. Ceci, associé à la bonne version prenant en charge TPROXY + la configuration d'iptables sur la même machine, permet une prise en charge réelle du proxy TCP totalement transparent. Cela signifie que les serveurs principaux n'ont besoin d'aucune configuration spéciale.

Notez que ce n'est pas la configuration recommandée pour HAProxy et ne doit être utilisé que si vous en avez absolument besoin.

Robbert
la source
2

Il y a apparemment une sorte de mode "transparent" pour haproxy que je n'ai jamais regardé ou que je ne veux rien faire, que vous pourriez essayer. Sinon, vous devrez enseigner quel que soit le service principal sur la façon spéciale de haproxy d'envoyer l'adresse IP d'origine ("PROXY blahblah") et demander au service d'extraire l'IP d'origine de cela.

Pourquoi vous embêtez-vous avec l'haproxy, cependant? Vous avez déjà survécu et il assure également un équilibrage de charge transparent approprié.

womble
la source
Salut, merci beaucoup pour votre réponse :) Je lis des trucs sur le support 'tproxy', je suppose que c'est ce que vous vouliez dire? De plus, je n'avais pas envisagé l'équilibrage de charge avec keepalived directement pour cela. Keepalived transmet-il l'IP d'origine du client?
Vito Botta
Oui, keepalived conserve intacte l'IP d'origine, car c'est un équilibreur de charge, pas un proxy.
womble
2

L'utilisation send-proxydans votre configuration (par serveur) vous donnera l'IP source d'origine côté serveur de réception, même en mode TCP. Cela nécessite HAProxy 1.5+.

Vous pouvez trouver plus d'informations sur le protocole proxy dans la documentation 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
la source
HI Nils, merci pour la solution, mais lorsque j'entre send-proxy, cela provoque la panne de la base de données (haproxy ne peut pas détecter l'hôte)
neobie
la même chose est arrivée avec moi aussi avec DB. Toute solution ?
Peeyush
-4

Cette configuration a fonctionné pour moi. L'IP source peut être récupérée dans $ _SERVER ['HTTP_X_FORWARDED_FOR']:

global
        [..... des trucs habituels ....]   
        ssl-server-verify aucun

interface principale *: 5000
        bind *: 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        mode http
        option forwardfor
        reqadd X-Forwarded-Proto: \ https
        default_backend https_server

serveur https_server
        mode http
        équilibrer lessconn
        option tcpka
        stick-table type ip size 200k expire 30m
        serveur srv04 192.168.1.10:443 vérification ssl
        serveur srv05 192.168.1.11:443 vérification ssl
Pedro Sayago
la source
2
cette réponse ne s'applique pas. la connexion n'est pas HTTP.
longneck
Suggérez-vous que la connexion https doit être en mode tcp?.
Pedro Sayago
Non, je dis que la question utilise TCP et que votre réponse ne s'applique qu'à http / s.
longneck
ok, bonne chance alors, je n'ai trouvé aucun document relatif à haproxy en ip de transfert en mode tcp. Peut-être que la couche où les demandes sont traitées ne peut pas transmettre ces informations.
Pedro Sayago