====== Allgemeine Konfiguration ======
[[http://cbonte.github.io/haproxy-dconv/]]
Konfiguration verifizieren
/usr/sbin/haproxy -c -V -f /etc/haproxy/haproxy.cfg
====== Aktuelle Versionen ======
https://haproxy.debian.net/
(Standard Focal hat nur V. 2.0)
====== HAPROXY als SSL Accelerator ======
Vorteil: **keine separaten IP Adressen nötig!** Konzept: HAPROXY horcht auf 80 und 443, der Webserver horcht nur auf localhost, z.B: 127.0.0.1:82, 83, 84… HAPROXY erkennt Requests über den Host Header und leitet auf den entsprechenden Port auf localhost um. Zertifikate werden durch haproxy bereitgestellt
===== frontend =====
frontend default
bind *:80
# Add multiple certificates, one for each domain.tld
bind *:443 ssl crt /etc/ssl/haproxy/devel.netzwissen.de.pem crt /etc/ssl/haproxy/passbolt.netzwissen.de.pem crt /etc/ssl/haproxy/amrae.d$
mode http
# global redirect to https
redirect scheme https code 301 if !{ ssl_fc }
===== ACL und Weiterleitung =====
## ACL for each Subdomain to terminate
acl devel-acl hdr(host) -i devel.netzwissen.de
acl le-acl path_beg /.well-known/acme-challenge/
acl passbolt-acl hdr(host) -i passbolt.netzwissen.de
acl amrae-acl hdr(host) -i amrae.de
acl gruenerheiner-acl hdr(host) -i gruenerheiner.netzwissen.de
acl freifunk-esslingen-acl hdr(host) -i freifunk-esslingen.de
## BACKEND: Use Backend Section
use_backend devel if devel-acl
use_backend le-backend if le-acl
use_backend passbolt if passbolt-acl
use_backend amrae if amrae-acl
use_backend gruenerheiner if gruenerheiner-acl
use_backend freifunk-esslingen if freifunk-esslingen-acl
===== Backend Beispiel =====
backend passbolt
mode http
server passbolt.netzwissen.de 127.0.0.1:83 check
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
====== Lets Encrypt und HAPROXY ======
[[https://serversforhackers.com/c/letsencrypt-with-haproxy|https://serversforhackers.com/c/letsencrypt-with-haproxy]]
===== Konfiguration HAPROXY =====
**frontend**
frontend le-frontend
bind *:80
# Test URI to see if its a letsencrypt request
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend le-backend if letsencrypt-acl
default_backend devel
**backend**
backend le-backend
mode http
server letsencrypt 138.201.52.38:8888
===== Neue Zertifikate bestellen =====
certbot certonly --standalone -d zammad.netzwissen.de --non-interactive --agree-tos --email admin@netzwissen.de --http-01-port=8888
* ''-standalone'' - Create a stand-alone web server to listen for the cert authorization HTTP request
* ''-d [domain]'' - The domain we're creating a cert for. You can use multiple ''-d'' flags for multiple domains for a single certificate. The domain(s) must route to the server we're creating a cert for (DNS must be setup for the domain).
* ''–non-interactive –agree-tos –email admin@example.com'' - Make this non-interactive by saying as much, agreeing to the TOS, and informing LetsEncrypt of the email to use to send "YOUR CERT IS EXPIRING" notifications.
* ''–http-01-port=8888'' - The Magic™. This tells the stand-alone server to listen on port 8888. Note that LetsEncrypt will //still// send the authorization HTTP request over port **80** and haproxy with redirrect requests over port 8888. The flag is ''http-01'' because it expects an ''HTTP'' request, NOT an ''HTTPS'' request.
===== Zertifikate zusammenbinden =====
cert und key müssen in **einer Datei **vorliegen:
''cat /etc/letsencrypt/live/demo.scalinglaravel.com/fullchain.pem \
/etc/letsencrypt/live/demo.scalinglaravel.com/privkey.pem \
| sudo tee /etc/ssl/demo.scalinglaravel.com/demo.scalinglaravel.com.pem''
===== Erneuern =====
Zertifikate werden über –force-renewal einmal pro Monat per cron über ein Shellscrip aktualisiert und neu zusammengebunden
#!/usr/bin/env bash
# Renew the certificate
certbot renew --force-renewal --tls-sni-01-port=8888
# Concatenate new cert files, with less output (avoiding the use tee and its output to stdout)
bash -c "cat /etc/letsencrypt/live/forum.netzwissen.de/fullchain.pem /etc/letsencrypt/live/forum.netzwissen.de/privkey.pem> /etc/ssl/haproxy/forum.netzwissen.de.pem"
bash -c "cat /etc/letsencrypt/live/zammad.netzwissen.de/fullchain.pem /etc/letsencrypt/live/zammad.netzwissen.de/privkey.pem> /etc/ssl/haproxy/zammad.netzwissen.de.pem"
# Reload HAProxy
service haproxy reload
====== Domain Umleitung (301) ======
acl demoredirect hdr_dom(host) -i demofolder.com
acl demoredirect hdr_dom(host) -i www.demofolder.com
http-request redirect location https://briansnelson.com/demofolder/ code 301 if demoredirect