pfSense-Cluster

Abschlussprojekt

Hochverfügbarer Cluster für Microsoft Exchange, gebaut aus ausgemusterter Hardware
Stadt Mannheim · IHK-Abschlussprojekt 2026 · Layer-4 Load Balancing

Aufgabe

Sechs Exchange-Knoten, aber die Last verteilte nur ein DNS-Eintrag — ohne Umschaltung bei Ausfall.

Ergebnis

gemessen im Labor
  • 3sbis zur Übernahme
  • 0%Fehler bei 10.000 Anfragen
  • 8msAntwortzeit im Mittel
  • 14.700€gespart in drei Jahren

Gebaut mit

  • pfSense
  • HAProxy
  • CARP
  • pfsync
  • ZFS
  • Cisco
  • Sophos SG 210

Vorher — die E-Mail geht verloren

CLIENTS die Leute, die eine E-Mail schicken PERIMETERSCHUTZ die Firewall am Eingang DNS-A-RECORD verteilt reihum MERKT NICHT, WER AUS IST EX-1 EX-2 EX-3 EX-4 EX-5 EX-6 EX-1 bis EX-6 = Postfach-Server 1 · DIE E-MAIL GEHT LOS 2 · DIE LISTE SCHICKT SIE ZU EX-3 3 · EX-3 IST AUS · E-MAIL WEG

Nachher — dieselbe E-Mail kommt an

CLIENTS dieselben Leute, dieselbe E-Mail PERIMETERSCHUTZ die Firewall am Eingang, unverändert CARP-VIP eine Adresse für beide Geräte pfSense A MASTER · ARBEITET AUSGEFALLEN pfSense B BACKUP · WARTET MASTER · ÜBERNIMMT pfsync beide wissen dasselbe HAProxy fragt jeden Server: antwortest du noch? mode tcp · balance source EX-1 EX-2 EX-3 EX-4 EX-5 EX-6 EX-1 bis EX-6 = Postfach-Server JEDER SERVER WIRD ALLE 2 SEKUNDEN GEFRAGT 1 · GERÄT A UND EX-3 FALLEN AUS 2 · DIE ADRESSE ZIEHT UM · E-MAIL WARTET 3 · NACH 3 SEKUNDEN LÄUFT ALLES ÜBER B 4 · EX-3 IST AUS · ALSO NIMMT SIE EX-4 5 · ANGEKOMMEN · 0 FEHLER

Gemessen

4 Tests · isoliertes Labor · Soll erfüllt
  • T-01 Umschaltung der virtuellen IP 3 s gefordert < 5 s · 2 verlorene Pakete
  • T-02 Ausfall eines Knotens erkannt 3,8 s gefordert < 4 s · Umverteilung korrekt
  • T-03 Sitzungstreue über Quell-IP 40 / 40 auch nach fünf Minuten identisch
  • LAST 10.000 Anfragen, 50 parallel 0 Fehler obwohl ein Knoten absichtlich tot war

Warum Layer 4 und nicht Layer 7

Ein Loadbalancer auf Layer 7 müsste die Verbindung aufbrechen, um hineinzusehen — er terminiert TLS, entschlüsselt, entscheidet, verschlüsselt neu. Damit läge der Klartext für einen Moment auf der Firewall, und die Firewall bräuchte alle Zertifikate.

Im TCP-Modus reicht HAProxy die Pakete unangetastet durch. Die Verschlüsselung bleibt vom Client bis zum Exchange-Server durchgehend bestehen, und auf der Firewall ist kein einziges Zertifikat zu verwalten. Für ein Netz, durch das Bürgerdaten laufen, ist das kein Detail.

Der Preis dafür: auf Layer 4 gibt es keine Cookies, mit denen man einen Nutzer an „seinen" Server binden könnte. Die Zuordnung läuft deshalb über einen Hash der Quell-IP — derselbe Client landet rechnerisch immer beim selben Knoten, ohne dass irgendwo eine Sitzungstabelle mitgeführt werden muss. Ob das in der Praxis hält, hat Test T-03 nachgemessen.

Die Entscheidung

Gewichtete Nutzwertanalyse, Schulnoten von 1 (sehr gut) bis 6.
KriteriumGewicht HAProxyWindows NLBDNS Round Robin
Ausfallsicherheit35 %156
Ende-zu-Ende-Verschlüsselung25 %111
Wirtschaftlichkeit25 %131
Administrationsaufwand15 %351
Gesamt1,303,502,75

Windows NLB fiel nicht aus Geschmacksgründen durch: Microsoft rät für moderne Exchange-Versionen in den eigenen Best Practices davon ab, weil es regelmäßig zu Verbindungsproblemen und Multicast-Kollisionen auf den Switchen kommt.

Was ich gebaut habe

  1. Zwei ausgemusterte Firewalls wiederbelebt

    Zwei Sophos SG 210, End-of-Life und ohne Herstellersupport, lagen ungenutzt im Bestand. Beide auf pfSense 2.8.1 geflasht, Dateisystem ZFS — dessen Copy-on-Write schützt die Firewall vor Dateisystemschäden, wenn im Serverraum der Strom wegbleibt.

  2. Aktiv/Passiv-Cluster über CARP

    Beide Knoten teilen sich eine virtuelle IP, die immer beim aktiven Gerät liegt. Advertising im Sekundentakt, Skew 0 auf dem Master und 100 auf dem Backup — daran entscheidet sich, wer führt.

  3. Zustandsabgleich über pfsync

    Über eine dedizierte Direktverbindung werden die Firewall-States in Echtzeit gespiegelt. Nur dadurch ist der Schwenk zustandsbehaftet: das Backup kennt die offenen Verbindungen bereits.

  4. HAProxy im TCP-Modus

    Frontend auf der virtuellen IP, mode tcp, balance source. Der Health-Check klopft alle zwei Sekunden auf Port 443 an — ohne Layer-7-Auswertung.

  5. Nicht am lebenden Netz getestet

    Der Antrag sah VLAN-Änderungen an den produktiven Core-Switchen vor. Weil das ein kommunales Netz mit Bürgerdiensten ist, habe ich stattdessen eine isolierte Laborumgebung aufgebaut: die sechs Exchange-Knoten per IP-Aliasing auf einem Intel NUC simuliert. Kein einziger Eingriff am laufenden Betrieb.

Was schiefging

Der Backup-Knoten verschwand. Beim ersten Konfigurationsabgleich stand auf dem LAN-Interface eine /30-Maske statt /24. Der Sync übertrug den Fehler brav auf das zweite Gerät — das damit im eigenen Netz nicht mehr erreichbar war. Gerettet über die serielle Konsole mit 115200 Baud; nach der Korrektur und einem Neustart lief die Synchronisation sauber.

Die Firewall antwortete statt der Dienste. Der erste Aufruf über den Loadbalancer landete auf der Login-Seite der pfSense selbst. Ursache war deren voreingestellte Weiterleitungsregel für die Verwaltungsoberfläche, die den Web-Port abfing. Lösung: die Verwaltung auf einen eigenen Port verschoben und die automatische Weiterleitung abgeschaltet.

Was die Lösung nicht kann

pfsync spiegelt die Firewall-States — nicht die Socket-Zustände von HAProxy. Die liegen im Arbeitsspeicher der Anwendung und sind nach einem Schwenk weg. Bestehende Proxy-Verbindungen brechen also ab und werden neu aufgebaut. Für Exchange ist das unkritisch, weil Outlook den Timeout im Hintergrund abfängt und sich in Millisekunden neu verbindet. Aber es ist ein Unterschied zu „gar kein Abbruch", und den sollte man kennen, bevor man die Architektur woanders wiederverwendet.

Ebenfalls der Ehrlichkeit halber: Der Failover wurde über den CARP-Wartungsmodus ausgelöst, nicht durch Stromzug. Im Labor hingen alle sechs simulierten Knoten an einer einzigen Schnittstelle — ein harter Zug hätte sie mit abgehängt und die Messung wertlos gemacht.

Was es gekostet hätte

EigenbauKommerzielle Appliance
Anschaffung0 €ca. 8.500 €
Support pro Jahr0 €ca. 2.400 €
Aufwand40 h ≙ 1.000 €4 h Hersteller-Setup
Hochverfügbarkeitnativ enthaltenkostenpflichtig
Über drei Jahre1.000 €15.700 €

Die Hardware kostete nichts, weil sie schon da war — zwei Geräte, die sonst entsorgt worden wären. Das ist der Kern des Projekttitels: Wiederverwertung von Bestandshardware.

Wie es weitergeht

Das Projekt endete mit dem bestandenen Nachweis, nicht mit dem Produktivbetrieb — das war so vorgesehen. Für den Go-Live habe ich dem Fachbereich einen Migrationsleitfaden übergeben: die temporäre Software-Bridge auflösen, das LAN-Interface an den produktiven Core-Switch legen, die Backend-Adressen von den simulierten auf die echten Knoten umschreiben und das Cluster in die bestehende VLAN-Struktur einbinden.