Guten Abend allerseits.

Es gibt Menschen, meistens ITler wie Ich, die gerne ihre Daten bei sich haben und behalten möchten. Die Idee die den meisten kommt ist, dass sie sich mehrere Ports öffnen oder rein per VPN arbeiten, möchte man jedoch mit Federations arbeiten so ist das ein Problem.

Federations sind Vetrauensstellungen zu anderen Instanzen der gleichen Software. Sei es Nextcloud oder Diaspora* oder RocketChat.

Natülich möchte man dies auch mit SSL (Let's Encrypt) absichern. Alles in allem geht mit pfSense. pfSense ist eine Open Source Firewall Lösung aus dem Hause Netgate, wenn man selber kein Gerät oder VM aufsetzen möchte dann kann man gerne zur SG-1000 greifen.

Netgate SG-1000

Nachdem man seine pfSense hochgefahren hat (Es muss nur WAN oder LAN connected sein in diesem Szenario), kann man sie einrichten. Dort stellt man die IP-Adresse und das Administrator Passwort ein, dieses bitte unbedingt ändern!

Zugriff sicherstellen

Ist dies geschehen so ändert man den WebUI Port und deaktiviert die Anti-Lockout Redirect funktion. (System/Advanced)

Danach fügt man folgende Regeln hinzu:

Diese Regeln stellen sicher das Port 80 und 443 and die Firewall und somit dem HAProxy weitergegeben werden.

Pakete nachinstallieren

Nun installiert man die notwendig Pakete für pfSense. (System/Package Manager)

Das ACME Plugin ist wie die beschreibung schon sagt für das automatisierte abrufen von Let's Encrypt Zertifikaten. Das Cron Plugin lässt einen Cron Einträge anpassen, wofür sehen wir später.

Das HAProxy Plugin ist der Loadbalancer der auch gleichzeitig SSL-Terminator und Reverse-Proxy ist, der kommt zum schluss.

Let's Encrypt Zertifikate anfordern

Unter Services/ACME findet man die Zertifikatsverwaltung für LE. In dieser Verwaltung setzt man folgende Optionen:

Und wechselt gleich in den Cron bereich, ebenfalls unter Services. Dort befindet sich nun ein acme_command Cron-Job, diesen Anpassen und auf 0:00 umstellen, dies stellt sicher dass das Plugin nur um Mitternacht neue Zertifikate anfordert und tagsüber keine Sessions abbrechen.

Accountschüssel anlegen

Damit das ACME Plugin für einen Zertifikate anfordern darf muss man einen sog. Accountschlüssel hinterlegen.

Heutzutage lässt sich unter ACME Server die v2 Server auswählen, denkbar einfach einen Namen vergeben, Server wählen, E-Mail Adresse für die Registrierung angeben und einen Account Key generieren und hochladen lassen.

Die Testing Server sind dafür gedacht um SSL Funktionen zu testen, wie SNI (wird später benötigt). Nachdem man einen generiert hat wechselt man in die Certificate Übersicht.

Zertifikat hinterlegen

In diesem Menü vergibt man einen namen, idealerweise die Hauptdomain die es betrifft. Ich persönlich, obwohl Wildcard unterstützt wird, füge jede Domain als Alternative Domain Name hinzu, dies sieht dann so aus:

In dieser Domain SAN Tabelle lassen sich mehrere Domains hinterlegen, der CN des Zertifikates muss immer oben stehen. In der verifizierungsauswahl stehen viele verschiedene Methoden zur auswahl.

Das sind nur einige, ich bevorzuge DNS, somit muss ich kein Recognition Vodoo im HAProxy für Webroot erkennung machen. Es werden verschiedenste Provider unterstützt, unter anderen auch DigitalOcean und INWX (Mein DNS und Domain Provider), welche beide APIs anbieten, jedoch nur DigitalOcean API Keys, bei INWX muss man sein Username und Passwort hinterlegen.

In der Actionlist stellt man weiter unten nun sicher das der HAProxy bei neugenerierten Zertifikaten dann diese auch in seinem Cache aktualisiert.

Dynamic DNS einrichten

Wenn der eigene Router kein Dynamic DNS hat so kann man dies auch mit den meisten Domain Anbietern unter pfSense einrichten:

HAProxy konfigurieren

Damit HAProxy korrekt arbeiten kann muss man einige einstellungen machen. Zu erst stellt man sicher das HAProxy den Arbeitsspeicher von pfSense auch nutzen darf.

Danach noch welche DNS Server HAProxy zum auflösen von Domain nutzen soll.

Und bitte auch den korrekten SSL Schlüsselwert angeben das sie auch korrekt ausgeliefert werden.

Backends konfigurieren

Backends definieren im Prinzip eine Servergruppe die für einen Server zuständig ist.

  1. Die Auswahl wann ein Server zur auslieferung angesteuert wird.
  2. Wohin weitergeleitet werden soll, gehen auch andere Frontends
  3. Aktiviert die SSL Verbindung zwischen HAProxy und Zielserver
  4. Aktiviert SSL Optionen für die Verbindung von Punkt 3

Weiter unten kann man sich am Health Checking austoben.

Frontend konfigurieren

Eigentlich benötigt es nur 2 Frontends, für HTTP und HTTPS.

HTTP
Aktiviert always SSL
HTTPS

Darunter sind die ACLs, diese definieren wie einkommende Verbindungen behandelt werden sollen.

Filterregeln

Diese ACLs sind auf die Domains die einkommen festgesetzt und erkennen diese aus dem HTTP Header, vielmehr der HAProxy kann diese jetzt wahrnehmen.

Jetzt verheiratet man noch die Backends

Wie man schon sehen kann, es lassen sich auch Redirects direkt mit HAProxy steuern und somit direkt am Eingangspunkt von externem Traffic eine art .htaccess konfigurieren um zugriffe auf bestimmte URLs oder Pfade umzuleiten oder zu verhindern.

SNI Recognition

Die sog. SNI Recognition ermöglicht es dem HAProxy während der SSL aushandlung das korrekte Zertifikat zurückzuliefern. CommonName und Subject Alternative Name ACLs stellen genau diesen verhalten ein.

Wenn man nun den HAProxy benutzt und die Domain auf den HAProxy umlenkt so bekommt man nun auf Port 80 und 443 mehrere Services unter ohne sich mit Ports herumschlagen zu müssen.

Youtube Video (Alt mit Let's Encrypt Webroot erkennung)

Hinweise

Wenn man eine Domain komplett auf seine DynDNS Adresse umleiten möchte so ist es notwendig das der DNS oder Domain Provider das sog. ALIASing unterstützt. DigitalOcean tut es nicht.