HAProxy SSL Farm-Optionen

7

Ich versuche herauszufinden, wie eine SSL-Farm mit Haproxy- und SSL-Reverse-Proxys eingerichtet wird, und suche nach allgemeinen Ratschlägen:

Ist es möglich, alle folgenden Bedingungen zu erfüllen:

  • Lastausgleichsanforderungen für die SSL-Farm und Failover, sodass mehr als ein SSL-Feld möglich ist (möglicherweise hilft der sslcheck in haproxy dabei).
  • Rufen Sie ein HTTP-Protokoll ab, das die tatsächlichen Client-IP-Adressen enthält.
  • Keine TProxy-Anforderung

Wenn alle drei nicht möglich sind, frage ich mich, was die Kompromisse sein könnten. Im Moment denke ich über Folgendes nach, aber das könnte sich ändern:

Haproxy 443 TCP-Proxy-Frontend -> SSL-Proxies (möglicherweise Nginx) auf hohen Ports -> Haproxy HTTP-Frontend -> Webserver

Mir ist klar, dass ich wahrscheinlich den zweiten Sprung zurück zu Haproxy überspringen könnte, aber die einzige Perspektive von allem in HAproxy könnte nett sein. Auch wenn ich TProxy verwenden muss, wird das Routing möglicherweise einfacher, wenn ich von der SSL-Farm zu Haproxy zurückkehre.

Referenzen:
http://haproxy.1wt.eu/download/1.5/doc/configuration.txt
http://1wt.eu/articles/2006_lb/index_05.html

Kyle Brandt
quelle

Antworten:

2

Kyle,

Wenn Sie nur ein Failover für den SSL-Teil und keinen Lastausgleich benötigen, empfehle ich Folgendes. Sie installieren haproxy + keepalived + stunnel (gepatcht) auf zwei Knoten. Keepalived besitzt die Serviceadresse und überprüft das Vorhandensein der Stunnel- und Haproxy-Prozesse, um deren Gewicht zu berechnen, sodass der Knoten in der besten Form der Master ist. Stunnel empfängt den Datenverkehr auf Port 443 und leitet ihn lokal an Haproxy auf einem beliebigen Port weiter. Damit haproxy die IP-Adresse des Clients protokollieren kann, benötigen Sie den x-forwarded-for-Patch für stunnel (Sie finden ihn auf meiner Website). Anschließend weisen Sie haproxy an, den x-forwarded-for-Header zu protokollieren.

Es gibt jedoch eine Einschränkung. Wenn Sie HTTP Keep-Alive unterstützen, fügt stunnel den x-forwarded-for-Header nur einmal hinzu, was etwas problematisch ist. Bei Exceliance haben wir begonnen, an einem Patch zu arbeiten, um die Verbindungsparameter von stunnel an haproxy weiterzuleiten, anstatt mit dem x-forwarded-for zu spielen. Auf diese Weise glaubt Haproxy, dass es seine Verbindung vom realen Client erhält. Wenn Sie interessiert sind, sagen Sie mir, wir können es Ihnen senden, sobald es fertig ist.

Willy Tarreau
quelle
1

OK, ich sehe das ziemlich spät, aber wie wäre es mit:

      VLAN1         VLAN2

INET -- | -- [SSL] -- | -- [HTTP Load Balancer]
        |             |
        | -- [SSL] -- | -- [WEB01]
        |             |
        | -- [SSL] -- | -- [WEB02]
                      |
                      | -- [WEB03] etc

In Worten:

  • Einfaches DNS Round Robin zum Veröffentlichen von x IP-Adressen für den Dienst,
  • Mit Front-End-SSL-Proxys (Apache, Nginx), die direkt auf diese IPs reagieren. (Optional, aber empfohlen, mit VRRP, CARP oder Linux-HA, um eine hohe Verfügbarkeit für diese IPs sicherzustellen.)
  • Alle SSL-Proxys senden ihre Anforderungen an einen einarmigen Load Balancer (zur Vereinfachung der Konfiguration, Single Point of LB / Session Management).
  • Zuletzt sendet die LB die Anfrage an die Webanwendungsserver.

Ein paar Dinge springen heraus:

  • HAProxy und die SSL-Proxys (nginx) sind in Bezug auf Funktionen und Verwendungsmodell in dieser Architektur ziemlich ähnlich. Gibt es andere Anforderungen an den einfachen HTTP-Lastausgleich (wurde die Ratenbegrenzung an anderer Stelle erwähnt)? Wenn nicht, ist es möglicherweise sauberer, HAProxy zu überspringen und nur einen Webservertyp für die gesamte SSL- und LB-Verarbeitung (fx nginx) zu verwenden.
  • DNS Round Robin ist wahrscheinlich "gut genug", um die Last nur grob auf 2-3 SSL-Proxys zu verteilen. Aber wenn es Ihnen nicht gefällt, können Sie L4-Mechanismen verwenden.

Rufen Sie ein HTTP-Protokoll ab, das die tatsächlichen Client-IP-Adressen enthält.

Angenommen, das erste Gerät auf HTTP-Ebene fügt den X-FORWARDED-FOR-Header hinzu und Sie verwenden so etwas wie dieses oder die IIS-Plugins von F5 . Dies sollte funktionieren.

Jesper M.
quelle