HAProxy

Siehe auch

Anweisungen alphabetisch in Config-Files zu implementieren funktioniert nur teilweise. use_backend-Regeln werden der Reihe nach abgearbeitet; die erste zutreffende Regel gewinnt, und Anfragen werden an das dazugehörige Backend weitergeleitet.

Erweiterte Features bedingen teils LUA-Scripting, welches in den RHEL-/CentOS-Binaries nicht hineincompiliert ist.

Versionen Stand 2020-11:

  • CentOS 7: 1.5 (ohne LUA-Support)

  • CentOS 8: 1.8 (ohne LUA-Support)

  • Fedora Server 33: 2.2.6 (inkl. LUA-Support)

Links

Installation

yum -y install haproxy

# show version info
haproxy -vv

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig

SELinux - wenn HAProxy zu anderen Ports als 80/443 verbinden soll:

setsebool -P haproxy_connect_any on
/etc/haproxy/haproxy.cfg

Konfiguration prüfen/checken:

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

systemctl enable haproxy
systemctl start haproxy

X.509-Zertifikate (SSL/TLS)

Ein Zertifikat muss in folgender Reihenfolge zusammengebaut werden:

  1. CA

  2. Intermediates

  3. Server-Cert

  4. Private Key

Logging

UDP-Empfang konfigurieren:

/etc/rsyslog.conf
# older versions
$ModLoad imudp
$UDPServerRun 514

# newer versions
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
/etc/rsyslog.d/haproxy.conf
local2.* /var/log/haproxy.log
systemctl restart rsyslog
tail -f /var/log/haproxy.log

Stats

Statistiken analog Apaches „server-status“:

#---------------------------------------------------------------------
# stats http://myip:9000/server-status
#---------------------------------------------------------------------
listen stats # Define a listen section called "stats"
    bind :9000 # Listen on localhost:9000
    mode http
    stats enable  # Enable stats page
    stats hide-version  # Hide HAProxy version
    stats realm HAproxy\ Statistics  # Title text for popup window
    stats uri /server-status  # Stats URI
    stats auth haproxy-stats:mypassword  # Authentication credentials

Aufruf: http://:9000/server-status; maschinenlesbar mit http://:9000/server-status;csv.

Was die einzelnen Werte bedeuten siehe https://www.haproxy.com/blog/exploring-the-haproxy-stats-page/.

Redirect HTTP > HTTPS

frontend frontend-http
    mode http
    bind :80
    http-request redirect scheme https code 301 unless { ssl_fc }

Header-Modifikation

frontend www
    bind :80

    # Add a response header
    http-response add-header X-XSS-Protection "1; mode=block"

    # Remove a response header
    http-response del-header X-Powered-By

    # Change a response header
    http-response set-header Via "HTTP/2.0 haproxy1"
    default_backend webservers

CORS

Bei Meldungen der Art Access to fetch at ‘http://api.example.com/dothing’ from origin ‘http://example.com’ has been blocked by CORS policy. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. muss eine CORS-Policy eingerichtet werden. CORS definiert das Whitelisting von Domains, die sonst von der Same-Origin-Policy des Browsers blockiert werden würden. Das geschieht per Access-Control-Allow-Origin Header.

Um das im HAProxy umzusetzen, wird ein LUA-Modul benötigt. Unglücklicherweise sind die alten HA-Proxy-Versionen auf RHEL/CentOS 7+ nicht mit LUA-Support compiliert - hier hilft aber der Einsatz eines Fedora-Servers.

CORS LUA-Modul laden und aktivieren:

cd /tmp
VER=2.2
wget https://github.com/haproxytech/haproxy-lua-cors/archive/v$VER.tar.gz
tar xf v$VER.tar.gz
cp haproxy-lua-cors-$VER/lib/cors.lua /etc/haproxy
/etc/haproxy/haproxy.cfg
global
    # LUA-module implementing CORS
    lua-load /etc/haproxy/cors.lua

Anschliessend das Abfangen der Request- und Response-Headers durch das LUA-Script in der frontend oder listen-Section einfügen. Die Konfigurationsangaben benötigen ab v2.0 des Moduls die Parameter allowed_methods, allowed_origins, allowed_headers.

v2.0+:

/etc/haproxy/haproxy.cfg
listen api
    bind :80
    http-request lua.cors "GET,PUT,POST" "example.com,localhost,localhost:8080" "X-Custom-Header1,X-Custom-Header2"
    http-response lua.cors

listen api
    bind :80
    http-request lua.cors "*" "*" "*"
    http-response lua.cors

v1.0:

/etc/haproxy/haproxy.cfg
listen api
    bind :80
    http-request lua.cors
    http-response lua.cors "GET,PUT,POST" "example.com,localhost,localhost:8080"

Siehe auch

Keycloak (OAuth)

HAProxy ist nicht in der Lage, wie der Apache eine Authentifizierung via OAuth (per Modul, LUA etc.) vorzunehmen. Hier muss man sich anderweitig behelfen, z.B. mit Hilfe des Programms oauth2-proxy.

Built on 2022-06-03