--- tags: - upnote-import --- # HAProxy Reverse-Proxy-Servers auf OPNsense Quelle: [OPNsense - Router - schulnetzkonzept.de](https://old.schulnetzkonzept.de/opnsense) ## Einrichtung virtueller IPs und zugehöriger Namen (Aliases) für den HAProxy Um zwischen Anfragen an den HAProxy unterscheiden zu können, die ausschließlich von intern (lan) oder von intern und extern (lan\_wan) zulässig sind, werden zwei virtuelle LAN-IP-Adressen benötigt, auf denen der HAProxy lauschen kann: Interfaces / Virtual IPs / Settings → Add 1. ### Virtuelle IP (HAProxy-Interface für Interne und Externe Anfragen > - Interface: SERVER > - Address: 10.40.0.201/16  > - Description: HAProxy40\_lan\_wan 2. ### Virtuelle IP (HAProxy-Interface ausschließlich für Interne Anfragen > - Interface: SERVER > - Address: 10.40.0.202/16  > - Description: HAProxy40\_lan IP außerhalb des DHCP-Bereichs ## Interne und externe Anfragen Webserveranfragen (Ports 80/443) auf den HAProxy weiterleiten Sowohl externe als auch interne HTTP- und HTTPS-Anfragen sollen auf die entsprechenden HAProxy-Interfaces weitergeleitet werden. Firewall / Aliases → Add 1. Alias (HAProxy-Interface für interne und externe Anfragen) > - Name: HAProxy40\_lan\_wan > - Type: Host(s) > - Content: 10.40.0.201 2. Alias (HAProxy-Interface ausschließlich für interne Anfragen) > - Name: HAProxy40\_lan > - Type: Host(s) > - Content: 10.40.0.202 ## Interne und externe Anfragen Webserveranfragen (Ports 80/443) auf den HAProxy weiterleiten Sowohl externe als auch interne HTTP- und HTTPS-Anfragen sollen auf die entsprechenden HAProxy-Interfaces weitergeleitet werden. Firewall / NAT / Port Forward → Add ### Weiterleitung externer Anfragen 1. Weiterleitung (auf Port 80) > - Interface: WAN > - TCP/IP Version: IPv4 > - Protocol: TCP > - Destination: any > - Destination port range: from: HTTP to: HTTP > - Redirect target IP: HAProxy40\_lan\_wan > - Redirect target Port: http > - Description: HAProxy\_lan\_wan 2. Weiterleitung (auf Port 443) > - Interface: WAN > - TCP/IP Version: IPv4 > - Protocol: TCP > - Destination: any > - Destination port range: from: HTTPS to: HTTPS > - Redirect target IP: HAProxy40\_lan\_wan > - Redirect target Port: https > - Description: HAProxy\_lan\_wan ### Weiterleitung interner Anfragen Damit interne Aufrufe der Webdienste direkt beim Reverse-Proxy landen und nicht über das Internet geroutet werden, müssen entsprechende Nameserver-Weiterleitungen zur virtuellen IP-Adresse des gewünschten HAProxy-Moduls existieren. Sofern der Webdienst nur innerhalb des Hauses erreichbar sein soll, leiten Sie zur virtuellen IP von HAProxy\_lan ansonsten zu HAProxy\_lan\_wan weiter. Beispiel für den Webdienst Homeassistant, welcher auch von außen erreichbar sein soll: Services / Unbound DNS / Overrides / Host Overrides → Add > - Host: kbha > - Domain: straso.com > - Type: A or AAAA (IPv4 or IPv6 address) > - IP: 10.40.0.201 (virtuelle IP von HAProxy\_lan\_wan) AdGuard / Filter / DNS-Umschreibung > Domain: [kbha.straso.com](https://kbha.straso.com "https://kbha.straso.com") > Antwort: 10.40.0.201 ### Firewallregeln für Lan USER Vom Netzwerk USER aus werden die Anfragen zum HAProxy über den Webproxy (Squid) geleitet. Da im Netzwerk USER kein Webproxy aktiv ist, sind zwei zusätzliche Regeln erforderlich: Firewall/Rules/LAN\_LEHRER → Add > - Action: Pass > - Interface: LAN\_LEHRER > - TCP/IP Version: IPv4+IPv6 > - Protocol: any > - Source: LAN net > - Destination: HAProxy40\_lan\_wan, HAProxy40\_lan ## Einrichtung von Real Servers Real Servers sind jene Dienste, welche hinter dem HAProxy erreicht werden sollen. Richten Sie für jeden Ihrer Webdienste - unabhängig davon, ob dieser von außen erreichbar sein soll oder nicht - einen Real Server ein: - [kbha.straso.com](https://kbha.straso.com "https://kbha.straso.com") - [git.straso.com](https://git.straso.com "https://git.straso.com") Services / HAProxy / Settings / Real Servers → Add > - Name or Prefix: kbha\_host > - FQDN or IP: 192.168.1.192 > - Port: 8123 > - SSL; KEINE SSL Einstellungen ## Einrichtung von Backend Pools Mit einem Backend Pool können ein oder mehrere Real Server gebündelt werden. Auch wenn für jeden Webdienst jeweils nur einen Real Server (z. B. gibt es nur einen Nextcloud-Server) bereitgehalten wird, muss an dieser Stelle für jeden Dienst ein Backend Pool eingerichtet werden. Beispiel für den Webdienst [kbha.straso.com](https://kbha.straso.com "https://kbha.straso.com") Services / HAProxy / Settings / Virtual Services / Backend Pools → Add > - Name: kbha\_backend > - Servers: kbha\_host1 ## Einrichtung der Public Services Die Public Services des HAProxys sind die Anlaufstellen, die interne bzw. externe Anfragen entgegennehmen. ### Einrichtung des Public Service für interne und externe Anfragen über http Services / HAProxy / Settings / Virtual Services / Public Services → Add > - Name: http\_lan\_wan > - Description: interne und externe http-Anfragen > - Listen Addresses: 10.40.0.201:80, 10.40.0.202:80 > - Default Backend Pool: none > - Enable SSL offloading: kein Haken > - X-Forwarded-For header: Haken ### Einrichtung des Public Service für interne und externe Anfragen über https > - Name: http\_lan\_wan > - Description: interne und externe http-Anfragen > - Listen Addresses: 10.40.0.201:443, 10.40.0.202:443 > - Type: HTTP / HTTPS (SSL offloading) > - Default Backend Pool: none > - Enable SSL offloading: Haken > - Certificates: Web GUI SSL certificate (wird später durch Let's-Encrypt-Zertifikate ersetzt) > - X-Forwarded-For header: Haken ### Einrichtung des Public Service für ausschließlich interne Anfragen über https > - Name: https\_lan > - Description: interne und externe http-Anfragen > - Listen Addresses: 10.40.0.202:443 > - Type: HTTP / HTTPS (SSL offloading) > - Default Backend Pool: none > - Enable SSL offloading: Haken > - Certificates: Web GUI SSL certificate (wird später durch Let's-Encrypt-Zertifikate ersetzt) > - X-Forwarded-For header: Haken ### Einrichtung von Conditions Conditions sind vordefinierte Bedingungen die für die späteren Regeln für die Reaktionen des HAProxy notwendig sind. Zunächst benötigen wir für jeden Webdienst eine Bedingung, die greift, falls eine Anfrage mit dem entsprechenden Domänennamen an den HAProxy gerichtet wird. Beispiel für den Webdienst kbha.straso.com: Services / HAProxy / Settings / Rules & Checks / Conditions → Add > - Name: kbha > - Condition type: Host matchs > - Host Suffix: kbha.straso.com Weiterhin benötigen wir eine Bedingung, mit der der HAProxy erkennt, dass eine Anfrage an ihn nicht verschlüsselt erfolgt ist: > - Name: NoSSL\_condition > - Condition type: Traffic is SSL (locally deciphered) > - Negate condition: Haken ### Einrichtung von Rules Rules sind vordefinierte Regeln, wie der HAProxy bei Eintreten einer oder mehrere Bedingungen reagieren soll. Zunächst benötigen wir für jeden Webdienst eine Regel, die den HAProxy dazu verleitet, dass er eine an ihn gerichtete Anfrage an den entsprechenden Backend Pool weiterleitet. Beispiel für den Webdienst kbha.straso.com: > - Name: kbha > - Test type: if > - Select conditions: kbha > - Execute function: Use specified Backend Pool > - Use backend pool: kbha\_backend Weiterhin benötigen Sie eine Regel, die nicht verschlüsselte htttp-Anfragen auf https umleitet: > - Name: HTTPtoHTTPS\_rule > - Description: redirect HTTP to HTTPS > - Select conditions: NoSSL\_condition > - Execute function: http-request-redirect > - HTTP Redirect: scheme https code 301 ## Zuweisung von Rules zu Backend-Pools Da jede http-Anfrage an einen der Webdienste auf https umgeleitet werden soll, weisen wir jedem Backend Pool die Rule HTTPtoHTTPS\_rule zu. Beispiel für den Backend Pool kbha\_backend: > - Select Rules: redirect\_ssl ## Zuweisung von Rules zu Public Services Der Public Service http\_lan\_wan soll alle an ihn gestellte Anfragen an den entsprechenden Backend-Poll weiterleiten: > Select Rules: z. B.: kbha, git Der Public Service https\_lan soll nur auf https-Anfragen reagieren, die ausschließlich intern zugänglich sein sollen: > Select Rules: z. B.: git Der Public Service https\_lan\_wan soll auf sowohl interne als auch externe https-Anfragen reagieren: > Select Rules: z. B.: kbha, git