HAProxy Reverse Proxy (+SSL Termination, IP Forwarding)

Vorwort

Ich hatte mir selbst die Aufgabe gesetzt, nach meiner Wireguard umstellung, meinen reinen Reverse Proxy auf einen HAProxy umzuziehen.

Falls eine Anleitung zu einem NGINX Reverse Proxy gebraucht wird, kann gerne dieser Beitrag befolgt werden: NGINX Reverse Proxy (+SSL Termination, IP Forwarding & Proxy Caching)

Vorbereitung

Als Betriebssystem kommt diesmal ein Ubuntu 22.04 Minimal zum Einsatz. Die neuste LTS Version zum aktuellen Zeitpunkt.
Die Version von HAProxy in den AlmaLinux Repositories ist leider „uralt“ und ist laut HAProxy schon gar nicht mehr Unterstützt. (Version 1.8)

In den aktuellen Ubuntu 22.04 Repositorys ist Version 2.4 enthalten:

timo@shdefsnhaproxy-01:~$ apt show haproxy
Package: haproxy
Version: 2.4.18-0ubuntu1.2
Priority: optional
Section: net
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian HAProxy Maintainers <[email protected]>

Ich möchte selbst allerdings Version 2.6 installieren da diese HTTP3 over QUIC unterstützt.
Das können wir unter Ubuntu ganz einfach, wie folgend machen:

sudo add-apt-repository ppa:vbernat/haproxy-2.6

Das ganze dann mit Y bzw. J bestätigen und fertig ist die Installation des Repositorys.

Wenn wir uns die Version jetzt noch einmal anschauen, sehen wir das wir nun mit Version 2.6.9 unterwegs sind:

timo@shdefsnhaproxy-01:~$ apt show haproxy
Package: haproxy
Version: 2.6.9-1ppa1~jammy
Priority: optional
Section: net
Maintainer: Debian HAProxy Maintainers <[email protected]>
Installed-Size: 4012 kB

Das dann einfach wie man es kennt installieren:

sudo apt install haproxy

Wieder mit Y bestätigen und fertig ist die HAProxy Installation.

Konfiguration von HAProxy

Die Konfiguration von HAProxy finde ich selbst straight forward.

Sie besteht aus den 4 „Kategorien“
– global
– default
– frontend
– backend

Unter Frontend erstellen wir die „Schnittstellen“, mit denen unser HAProxy am Ende vom Internet aus angesprochen wird.
Backend beschreibt die eigentlichen Webserver.

In meinem Falle muss ich global und default nicht anfassen, man kann hier allerdings auch die check variable für healthchecks als „default“ angeben.

Die Konfiguration können wir unter ubuntu so bearbeiten:

sudo nano /etc/haproxy/haproxy.cfg

Reverse Proxy konfiguration

Um HAProxy als Reverse Proxy nutzen zu können, müssen wir ein Frontend und ein Backend erstellen:

frontend default
   mode http
   bind :80

   default_backend timo-web

backend timo-web
  mode http
  server timo-web 192.168.43.12:80

Mit dieser Konfiguration wird nun jeder Traffic der beim HAProxy auf Port 80 ankommt (und HTTP spricht) auf das backend timo-web umgeleitet.

Im Normalfall haben wir allerdings mehrere Backends mit verschiedenen Domains.
Für eine Konfiguration mit 2 Domains sieht das entsprechend wie folgend aus:

frontend default
   mode http
   bind :80

   use_backend timo-web if { hdr(host) eq timo-brunn.de }
   use_backend timo-data if { hdr(host) eq data.timo-brunn.de }
   default_backend redirect_to_blank

backend redirect_to_blank
   mode http
   http-request redirect location https://www.youtube.com/watch?v=dQw4w9WgXcQ code 302


backend timo-web
  mode http
  server timo-web 192.168.43.12:80

backend timo-data
  mode http
  server timo-data 192.168.43.13:80

Mit obenstehender Konfiguration äußert sich das jetzt wie folgend:
HTTP Traffic an die Domain Timo-Brunn.de wird an den Webserver 192.168.43.12 weitergeleitet
Traffic für die Domain data.Timo-Brunn.de wird an 192.168.43.13 weitergeleitet.

Und Traffic, der ohne Host Header ankommt, wird zu YouTube umgeleitet.

Wichtig ist hierbei, dass HAProxy den Host Header überprüft, der im HTTP Request steht.
Dieser kann bei speziellen Ports auch mit Port erscheinen!

SSL Termination

SSL Termination ist beim HAProxy ziemlich einfach. Hier muss auf dem Frontend lediglich SSL aktiviert werden und der Client darauf umgeleitet werden.
Unser Beispiel sieht danach so aus:

frontend default
   mode http
   bind :80
   bind :443 ssl crt /srv/cert/ alpn h3,h2,http/1.1
   http-request redirect scheme https unless { ssl_fc }

   use_backend timo-web if { hdr(host) eq timo-brunn.de }
   use_backend timo-data if { hdr(host) eq data.timo-brunn.de }
   default_backend redirect_to_blank

backend redirect_to_blank
   mode http
   http-request redirect location https://www.youtube.com/watch?v=dQw4w9WgXcQ code 302


backend timo-web
  mode http
  server timo-web 192.168.43.12:80

backend timo-data
  mode http
  server timo-data 192.168.43.13:80

Die SSL Zertifikate lege ich hier im Beispiel einfach in dem Ordner /srv/cert/ ab.
Man muss nicht direkt auf das Zertifikat zielen, kann man aber.

alpn aktiviert bestimmte Protokolle auf dem Frontend. In diesem Beispiel:
– http/1.1 -> HTTP Version 1.1
– h2 -> HTTP/2
– h3 -> HTTP/3 (ohne QUIC)

IP Forwarding

IP Forwarding unter HAProxy ist so simple das selbst ein Baby das schafft 😉
Hierfür setzt man einfach die Option „forwardfor“.

frontend default
   mode http
   bind :80
   bind :443 ssl crt /srv/cert/ alpn h3,h2,http/1.1
   http-request redirect scheme https unless { ssl_fc }

   use_backend timo-web if { hdr(host) eq timo-brunn.de }
   use_backend timo-data if { hdr(host) eq data.timo-brunn.de }
   default_backend redirect_to_blank

backend redirect_to_blank
   mode http
   http-request redirect location https://www.youtube.com/watch?v=dQw4w9WgXcQ code 302


backend timo-web
  mode http
  option forwardfor
  server timo-web 192.168.43.12:80

backend timo-data
  mode http
  option forwardfor
  server timo-data 192.168.43.13:80

Das kann auch unter „default“ geschehen.
Ich mache es im backend :).

Danach noch einmal die Konfiguration prüfen:

sudo haproxy -f /etc/haproxy/haproxy.cfg -c

Und danach den HAProxy einmal aktivieren und neu starten (ein reload reicht auch):

sudo systemctl enable --now haproxy
sudo systemctl restart haproxy

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert