Ich habe folgendes Setup:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
Bei HTTP-Anfragen funktioniert dies hervorragend . Anfragen werden einwandfrei an meine Apache-Server verteilt. Bei SSL-Anforderungen verteilte HAproxy die Anforderungen mithilfe des TCP-Lastenausgleichs. Dies funktionierte jedoch, da HAproxy nicht als Proxy fungierte, den X-Forwarded-For
HTTP-Header nicht hinzufügte und die Apache / PHP-Server die Clients nicht kannten echte IP-Adresse.
Also fügte ich stunnel
vor HAproxy hinzu und las, dass stunnel den X-Forwarded-For
HTTP-Header hinzufügen könnte . Das Paket, das ich in pfSense installieren konnte, fügt diesen Header jedoch nicht hinzu. Dies beeinträchtigt anscheinend meine Fähigkeit, KeepAlive-Anforderungen zu verwenden , die ich wirklich gerne behalten würde. Das größte Problem, das diese Idee tötete, war jedoch, dass stunnel die HTTPS-Anforderungen in einfache HTTP-Anforderungen umwandelte, sodass PHP nicht wusste, dass SSL aktiviert war, und versuchte, auf die SSL-Site umzuleiten.
Wie kann ich HAproxy zum Lastenausgleich für mehrere SSL-Server verwenden, sodass diese Server sowohl die IP-Adresse des Clients als auch wissen, dass SSL verwendet wird? Und wenn möglich, wie mache ich das auf meinem pfSense-Server?
Oder sollte ich das alles fallen lassen und einfach Nginx verwenden?
X-Forwarded-For
, siehe hier .Antworten:
Sie brauchen nicht alles fallen zu lassen, Sie könnten einfach nginx vor haproxy für die SSL-Unterstützung verwenden und Ihre gesamte Konfiguration für den Lastenausgleich beibehalten. Sie müssen nicht einmal Nginx für HTTP verwenden, wenn Sie nicht möchten. Nginx kann sowohl X-Forwarded-For als auch einen benutzerdefinierten Header übergeben, der angibt, dass SSL verwendet wird (und Client-Zertifikatsinformationen, wenn Sie dies wünschen). Nginx-Konfigurations-Snippet, das die erforderlichen Informationen sendet:
quelle
Nur zur Veranschaulichung, da dieser Thread häufig für HAProxy + SSL verwendet wird, unterstützt HAProxy seit 1.5-dev12 auf beiden Seiten natives SSL. X-Forwarded-For, HTTP-Keep-Alive und ein Header, der dem Server mitteilt, dass die Verbindung über SSL hergestellt wurde, sind also so einfach wie folgt:
Ich bin mir sicher, dass Sie zu dem Zeitpunkt, als Sie sich etwas anderes einfallen ließen, zumindest neue Besucher die einfache Lösung finden werden :-)
quelle
acl is-ssl dst_port 443
und eine Zeile neu schreiben:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx scheint mit diesem Header ziemlich gutFür alle anderen, die diese Frage finden, bin ich Ochotos Rat gefolgt und habe Nginx verwendet. Hier sind die spezifischen Schritte, mit denen ich diese Funktion auf meinem pfSense-Router ausgeführt habe :
Unter Verwendung der pfsense-Weboberfläche habe ich das Paket pfsense PfJailctl und das Paket "jail_template" unter System> Packages installiert, damit ich ein FreeBSD- Jail erstellen kann, unter dem nginx auf dem pfsense-System kompiliert und installiert werden kann.
Ich habe ein Jail für meinen Nginx-Server unter " Dienste"> "Jails" konfiguriert und dem neuen Jail denselben Hostnamen und dieselbe IP-Adresse wie dem virtuellen IP-Alias zugewiesen, auf dem HAproxy ausgeführt wurde. Ich habe das Gefängnis an die WAN-Schnittstelle gebunden. Ich habe die Standardvorlage für Gefängnisse verwendet und unionfs anstelle von nullfs aktiviert.
Sobald das Gefängnis angefangen hatte, ging ich in die Pfsense-Box und rannte
jls
, um die Nummer des Gefängnisses zu finden. Dann rannte ich losjexec 1 sh
, um eine Granate ins Gefängnis zu bringen. Von dort aus habe ich BSD-Ports eingerichtet und nginx installiert mit:Ich habe dann nginx so konfiguriert, dass es auf Port 443 lauscht und alle Anfragen an HAproxy über Port 80 weiterleitet, einschließlich der realen IP und des SSL-Status in HTTP-Headern. Meine
usr/local/etc/nginx/nginx.conf
sieht aus wie:Ich habe dann meine PHP-Anwendung geändert, um den
X-Forwarded-Proto
HTTP-Header zu erkennen :Das endgültige Setup lautet also:
quelle
Meine Konfiguration für eine 1.5-dev-17-Version von Haproxy:
Es verwendet die
ssl_fc
ACL. Bitte beachten Sie, dass dasoption http-server-close
Teil sehr wichtig ist.quelle
HAProxy kann ein SSL-Backend nicht erreichen, ohne den rohen TCP-Modus zu verwenden.
X-Forwarded-For
Sie können jedoch möglicherweise den Datenverkehr mit einem Überwachungsstunnel für den Backend-Transit neu verschlüsseln. Hässlich.Ich mag den Ansatz von Ochoto besser, mit einer Einschränkung: Nginx ist ein perfekter Load Balancer. Wenn Sie es verwenden, würde ich sagen, verwenden Sie es für alles. Übertragen Sie eingehendes HTTPS per Proxy, um ausgeglichene HTTPS-Backends zu laden. Auf diese Weise sind keine benutzerdefinierten Header für SSL-Informationen erforderlich (es sei denn, Sie benötigen das Client-Zertifikat).
quelle
Ich habe letztes Jahr eine Lösung implementiert, um HAProxy so in pfSense zu integrieren , dass alle Funktionen von HAProxy genutzt werden und eine gute Isolation mit pfSense besteht. Damit ist es eine praktikable Option für Produktionsumgebungen . SSL wird auf HAProxy beendet . Ich habe HAProxy mit ezjail und Ports Collection in einem Jail in pfSense installiert . Auf diese Weise ist es sehr einfach, beide Komponenten unabhängig voneinander zu warten. Und Sie können jede gewünschte Version installieren. Ich habe mit 1.5-dev13 angefangen. Und seitdem funktioniert es perfekt für mich. Ich habe das Ganze hier dokumentiert.
HAProxy unter pfSense installieren
Übrigens, Willy, vielen Dank für dieses hervorragende Produkt.
quelle