234 lines
8.2 KiB
Markdown
234 lines
8.2 KiB
Markdown
---
|
||
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
|