Anstatt Web-Ports (80/443) blind auf einzelne Webserver oder Docker-Container weiterzuleiten, bietet ein zentraler HAProxy auf der OPNsense entscheidende Vorteile: Automatisches SSL-Offloading via Let's Encrypt, DDoS-Schutz, zentrale Zugriffskontrollen sowie domainbasiertes Routing (Layer 7 HTTP oder Layer 4 TCP-Passthrough).
os-haproxy und klicke auf das +-Symbol.os-acme-client (für automatisierte Let's Encrypt Zertifikate) und installiere es ebenfalls.HTTP-01 (nutzt den integrierten ACME-Server auf Port 43580) oder DNS-01 (über API für Wildcard-Zertifikate).example.com, www.example.com) und den Challenge-Typ zuweisen.Ein Real Server repräsentiert das Backend-Ziel (z. B. deinen Webserver-Cluster, Docker-Container oder einen sekundären Reverse Proxy wie NPM):
RS_Docker_Node0110.10.10.208080RS_NPM_Passthrough10.10.10.30443 (empfängt verschlüsselten TCP-Traffic)Backend Pools gruppieren Server und steuern das Load-Balancing sowie Health Checks:
BE_Web_ClusterHTTP (Layer 7)RS_Docker_Node01 (und weitere Cluster-Nodes)Round robinHTTP (z. B. Methode OPTIONS oder GET auf /health.php).BE_NPM_PassthroughTCP (Layer 4)RS_NPM_PassthroughUm im TCP-Modus nach Domainnamen zu trennen, werten wir den SNI-Header (Server Name Indication) des TLS-Handshakes aus:
c_sni_hauptdomainCustom condition (req_ssl_sni) oder SSL / TLS Server Name Indication matchesexample.com (sowie optional www.example.com)r_route_hauptdomainc_sni_hauptdomainUse specified Backend Pool → BE_Local_SSL_Terminator (leitet an den internen SSL-Terminator weiter).Damit ACME HTTP-01 Challenges funktionieren und normaler Web-Traffic auf HTTPS gezwungen wird:
192.0.2.1:80, [2001:db8::1]:80HTTPredirect_acme_challenges (greift bei path_beg -i /.well-known/acme-challenge/ → leitet an acme_challenge_backend auf Port 43580).r_redirect_https (greift bei normalem HTTP-Traffic → http-request redirect scheme https).Wenn HAProxy im TCP-Modus (Layer 4) läuft, um z. B. bestimmte Domains lokal zu terminieren und alle anderen Subdomains verschlüsselt an NPM weiterzugeben, tritt häufig folgendes Problem auf: HAProxy entscheidet zu schnell, bevor der Browser den TLS-Handshake mit der SNI geschickt hat, und schickt allen Traffic fälschlicherweise ans Default-Backend.
Die Lösung via Optionsweiterleitung:
192.0.2.1:443, [2001:db8::1]:443.TCP.BE_NPM_Passthrough (Fallback für alle Subdomains).r_route_hauptdomain.tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
Diese beiden Zeilen zwingen HAProxy dazu, bis zu 5 Sekunden auf das ClientHello-Paket zu warten. Sobald das Paket da ist, wird die SNI ausgelesen, die ACL matcht zuverlässig und das Routing greift pixelgenau.
Für Domains, die direkt von der OPNsense entschlüsselt und per Round-Robin auf Backend-Server verteilt werden sollen:
FE_Internal_SSL_Terminator127.0.0.1:8443HTTP / HTTPS (SSL Offloading)BE_Web_ClusterKlicke abschließend auf Apply. Eingehende Anfragen auf der Hauptdomain werden nun sauber lokal entschlüsselt und gebalanced, während beliebige Subdomains transparent als TCP-Stream an den nachgelagerten Proxy durchgereicht werden.