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
- HAProxy
- CARP
- pfsync
- ZFS
- Sophos SG 210
Vorher — die E-Mail geht verloren
Nachher — dieselbe E-Mail kommt an
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
| Kriterium | Gewicht | HAProxy | Windows NLB | DNS Round Robin |
|---|---|---|---|---|
| Ausfallsicherheit | 35 % | 1 | 5 | 6 |
| Ende-zu-Ende-Verschlüsselung | 25 % | 1 | 1 | 1 |
| Wirtschaftlichkeit | 25 % | 1 | 3 | 1 |
| Administrationsaufwand | 15 % | 3 | 5 | 1 |
| Gesamt | 1,30 | 3,50 | 2,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
-
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.
-
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.
-
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.
-
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. -
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
| Eigenbau | Kommerzielle Appliance | |
|---|---|---|
| Anschaffung | 0 € | ca. 8.500 € |
| Support pro Jahr | 0 € | ca. 2.400 € |
| Aufwand | 40 h ≙ 1.000 € | 4 h Hersteller-Setup |
| Hochverfügbarkeit | nativ enthalten | kostenpflichtig |
| Über drei Jahre | 1.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.