Haproxy - Übergeben Sie die Original- / Remote-IP im TCP-Modus

8

Ich habe Haproxy mit Keepalived für den Lastausgleich und das IP-Failover eines Percona-Clusters eingerichtet, und da es hervorragend funktioniert, möchte ich dasselbe lb / Failover für einen anderen Dienst / Daemon verwenden.

Ich habe Haproxy folgendermaßen konfiguriert:

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

Der Lastausgleich funktioniert einwandfrei, aber der Dienst sieht die IP des Load Balancers anstelle der tatsächlichen IPs der Clients. Im http-Modus ist es recht einfach, dass Haproxy die Remote-IP weitergibt, aber wie mache ich das im TCP-Modus? Dies ist aufgrund der Art des Dienstes, den ich zum Lastausgleich benötige, von entscheidender Bedeutung.

Vielen Dank! Vito

Vito Botta
quelle
Hier ist die vollständige Dokumentation von Haproxy 1.6.6 cbonte.github.io/haproxy-dconv/…

Antworten:

3

Nur für zukünftige Referenzen ist keepalived eine Lösung für Failover und nicht für Lastausgleich (vielleicht meinen Sie LVS?). Der transparente Proxy-Modus für HAProxy hat nichts mit einer speziellen Art des Sendens der ursprünglichen IP zu tun. Dies wäre der normale nicht transparente HTTP-Modus, in dem Sie einen standardisierten HTTP-Header verwenden können.

Meiner Meinung nach lautet die richtige Antwort auf die ursprüngliche Frage: Sie können die transparente Proxy-Unterstützung in HAProxy auf einem TPROXY-fähigen Linux-Kernel kompilieren. Dies ermöglicht zusammen mit der richtigen TPROXY-unterstützenden Version + Konfiguration von iptables auf demselben Computer eine tatsächliche vollständig transparente TCP-Proxy-Unterstützung. Dies bedeutet, dass Backend-Server KEINE spezielle Konfiguration benötigen.

Beachten Sie, dass dies nicht das empfohlene Setup für HAProxy ist und nur verwendet werden sollte, wenn Sie es unbedingt benötigen.

Robbert
quelle
2

Es gibt anscheinend eine Art "transparenten" Modus für Haproxy, den ich noch nie angeschaut habe oder mit dem ich etwas zu tun haben möchte, den Sie ausprobieren könnten. Andernfalls müssen Sie lernen, was auch immer der Backend-Dienst über die spezielle Methode von haproxy zum Senden der ursprünglichen IP ("PROXY blahblah") ist, und den Dienst die ursprüngliche IP daraus ziehen lassen.

Warum beschäftigen Sie sich jedoch mit Haproxy? Sie sind bereits an Ort und Stelle, und es führt auch einen ordnungsgemäßen transparenten Lastausgleich durch.

womble
quelle
Hallo, vielen Dank für Ihre Antwort :) Ich lese ein paar Dinge über die Unterstützung von 'tproxy'. Ich denke, das haben Sie gemeint? Außerdem hatte ich nicht in Betracht gezogen, den Lastausgleich mit keepalived direkt dafür durchzuführen. Übergibt keepalived die ursprüngliche IP des Clients?
Vito Botta
Ja, keepalived behält die ursprüngliche IP bei, da es sich um einen Load Balancer und nicht um einen Proxy handelt.
Womble
2

Wenn Sie send-proxyin Ihrer Konfiguration (pro Server) verwenden, erhalten Sie die ursprüngliche Quell-IP auf der empfangenden Serverseite, auch im TCP-Modus. Dies erfordert HAProxy 1.5+.

Weitere Informationen zum Proxy-Protokoll finden Sie in der HAProxy-Dokumentation .

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
quelle
HI Nils, danke für die Lösung, aber wenn ich send-proxy eingebe, wird die Datenbank heruntergefahren (Haproxy kann den Host nicht erkennen)
Neobie
das gleiche passierte mir auch mit DB. irgendeine Lösungsmöglichkeit ?
Peeyush
-4

Diese Konfiguration hat bei mir funktioniert. Die Quell-IP kann in $ _SERVER ['HTTP_X_FORWARDED_FOR'] abgerufen werden:

global
        [..... übliches Zeug .... ]   
        ssl-server-verify keine

Frontend-Haupt *: 5000
        bind *: 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        Modus http
        Option vorwärts für
        X-Forwarded-Proto: \ https
        default_backend https_server

Backend https_server
        Modus http
        Balance am wenigsten verbinden
        Option tcpka
        Stick-Tisch Typ IP-Größe 200k verfallen 30m
        server srv04 192.168.1.10:443 ssl check
        server srv05 192.168.1.11:443 ssl check
Pedro Sayago
quelle
2
Diese Antwort trifft nicht zu. Die Verbindung ist nicht HTTP.
Longneck
Schlagen Sie vor, dass sich die https-Verbindung im TCP-Modus befinden muss?
Pedro Sayago
Nein, ich sage, dass die Frage TCP verwendet und Ihre Antwort nur für http / s gilt.
Longneck
ok, dann viel glück, ich habe kein Dokument in Bezug auf Haproxy im TCP-Modus gefunden, das IP weiterleitet. Möglicherweise kann die Ebene, auf der Anforderungen verarbeitet werden, diese Informationen nicht weitergeben.
Pedro Sayago