In Zeiten wachsender DDoS-Angriffe und automatisierter Bot-Scans ist es wichtig, den eigenen Webserver oder mehrere Webserver bereits auf der Netzwerk- und Proxy-Ebene abzusichern. HAProxy eignet sich dafür wirklich perfekt. Das Beste ist, man Traffic filtern, bevor es überhaupt den eigentlichen Webserver erreicht. Ich habe euch daher eine Konfiguration erstellt, die man sauber für den Start benutzen könnte.

Die hier vorgestellte Konfiguration vereint IPv4- und IPv6-Support, automatischen HTTPS-Redirect, SSL-Terminierung, sowie intelligente Schutzmechanismen gegen missbräuchliche Anfragen. Mit Hilfe von Stick Tables und General Purpose Counters (GPC) werden auffällige Clients identifiziert, mit Strikes versehen und bei wiederholtem Fehlverhalten automatisch blockiert.

Ich empfehle dringend auch noch vor dem HAProxy eine Firewall-Lösung zu implementieren, um unerwünschten Traffic auf OSI-Layer 1-4 direkt zu entfernen. Damit können dann viel effektiver SYN-Floods, UDP-Floods etc. erkannt und entfernt werden.
Stellt euch ein Barebone oder ähnliches davor, um den Traffic vorher zu filtern und direkt als IP zu blockieren.

MNBOXCONET S2 Mini PC N305 2x10gb SFP+, Firewall Appliance Hardware Micro Büro, DDR5 8GB RAM 128GB SSD, 2xi226V 2.5Gbit LAN, USB C, TF Card Slot, Support Proxmox OPNsense Win, SPK/MIC
  • Leistungsstarker CPU core i3 N305, mini pc mit Alder Lake-N 12th Gen low power N305 Prozessor (6MB cache, 8C/8T, up to 3.8GHz), TDP 15 W, energieeffizient und stromsparend. Vorinstalliertes Win 11 Pro, unterstützt OPNsense, Linux, Ubuntu, ESXi, OpenWrt, Unraid und ist mit den meisten gängigen Systemen kompatibel

Highlights dieser Beispiel HAProxy Konfiguration

  • 🌐 Dual-Stack Support (IPv4 & IPv6)
    Ein einzelnes bind :443 v4v6 sorgt dafür, dass sowohl IPv4- als auch IPv6-Verbindungen unterstützt werden.
  • 🔒 Automatischer Redirect auf HTTPS
    Anfragen auf Port 80 werden konsequent alle auf Port 443 weitergeleitet.
  • 📊 Stick Tables für Traffic-Analyse
    Speicherung von Request-Raten, Fehlerquoten, aktiven Verbindungen und Bytes pro Quell-IP – die Basis für smarte Rate-Limits.
  • 🚨 General Purpose Counters (GPC)
    Auffällige Clients sammeln automatisch „Strikes“ und werden bei Überschreiten eines Schwellenwertes für eine definierte Zeitspanne gebannt.
  • 🛡️ DDoS- & Abuse-Schutz
    • Limitierung gleichzeitiger Verbindungen pro IP
    • Blockierung bei zu hoher Request-Rate
    • Spezielle Regeln für sensible Endpunkte wie /login oder /api
    • Tarpit-Technik, um Bots gezielt auszubremsen. Beste Methode, um Angreifer zu verlangsamen
  • ⚖️ Smarte Reaktionsstufen
    • Soft-Limits mit HTTP 429 („Too Many Requests“)
    • Hard-Limits mit HTTP 403 („Forbidden“)
    • Sofortiges Reject bei massiven Angriffen
  • ✂️ Validierung von Requests
    • Schutz vor überlangen URLs (414 URI Too Long)
    • Blockade gefährlicher Methoden wie TRACE oder CONNECT
  • 🔧 Einfache Erweiterbarkeit
    • Whitelist/Blacklist über Map-Dateien (whitelist.map / blacklist.map)
    • Weitere Domains & Zertifikate können per SNI eingebunden werden

Diese HAProxy Konfiguration ist für die Version 3.0 gebaut.

global
    log stdout format raw local0
    master-worker
    maxconn 50000
    tune.bufsize 32768

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    option  http-buffer-request
    timeout connect 5s
    timeout client  30s
    timeout server  30s
    timeout http-request 10s

frontend stats
    mode http
    bind :8404
    stats enable
    stats refresh 10s
    stats uri /stats
    stats show-modules
    stats admin if TRUE
  
# ------------------------------------------------------------------------------
# Port 80 → Redirect auf HTTPS
# ------------------------------------------------------------------------------
frontend redirect_http
    bind :80 v4v6
    mode http
    http-request redirect scheme https code 301

# ------------------------------------------------------------------------------
# HTTPS-Frontend mit DDoS-/Abuse-Schutz via Stick Tables + GPC
# ------------------------------------------------------------------------------
frontend fe_https
    mode http
    bind :443 v4v6 ssl crt /etc/haproxy/certs/example.pem alpn h2,http/1.1

    # Stick Table: pro IP Statistiken + GPCs
    stick-table type ip size 1m expire 15m store conn_rate(10s),conn_cur,http_req_rate(10s),http_err_rate(10s),http_req_cnt,bytes_in_rate(10s),bytes_out_rate(10s),gpc0,gpc1

    # Client-IP tracken (TCP + HTTP)
    tcp-request connection track-sc0 src
    http-request  track-sc0 src

    # Basis-Header
    http-request set-header X-Forwarded-For %[src]
    http-request set-header X-Forwarded-Proto https

    # Whitelist / Blacklist
    acl src_allow  src,map_str(/etc/haproxy/maps/whitelist.map) -m int eq 1
    acl src_deny   src,map_str(/etc/haproxy/maps/blacklist.map) -m int eq 1
    tcp-request connection reject if src_deny
    http-request deny deny_status 403 if src_deny

    # Pfad-ACLs (für gezielte Limits)
    acl is_login  path_beg -i /login /wp-login.php /account /auth
    acl is_api    path_beg -i /api /graphql

    # --- BAN auf Basis von GPC (Strikes) ---
    # Ab 10 Strikes (innerhalb 'expire') gebannt
    acl src_is_banned sc_get_gpc0(0) gt 9
    tcp-request content reject if src_is_banned
    http-request deny deny_status 403 if src_is_banned

    # DDoS/Abuse-Schwellenwerte
    acl abuse_conn_rate   sc0_conn_rate       gt 200
    acl abuse_conn_cur    sc0_conn_cur        gt 100
    acl abuse_req_rate    sc0_http_req_rate   gt 400
    acl abuse_err_burst   sc0_http_err_rate   gt 50
	acl login_req_fast   sc_http_req_rate(0)  gt 40
    acl api_req_fast     sc_http_req_rate(0)  gt 200

    # --- Strikes vergeben, dann reagieren ---
    # Zu viele gleichzeitige Verbindungen (Whitelist ausgenommen via 'if !src_allow')
    tcp-request content sc-inc-gpc0() if !src_allow abuse_conn_cur
    tcp-request connection reject     if !src_allow abuse_conn_cur

    # Hohe Raten / Fehlerbursts
    http-request sc-inc-gpc0() if !src_allow abuse_conn_rate or !src_allow abuse_req_rate or !src_allow abuse_err_burst
	http-request tarpit        if !src_allow abuse_conn_rate or !src_allow abuse_req_rate or !src_allow abuse_err_burst
	
    # Login/API – Pfad + Rate-ACL kombinieren
    http-request sc-inc-gpc1()    if !src_allow is_login login_req_fast
    http-request deny deny_status 429 if !src_allow is_login login_req_fast

    http-request sc-inc-gpc1()    if !src_allow is_api api_req_fast
    http-request deny deny_status 429 if !src_allow is_api api_req_fast

    # Massive HTTP-Last: zusätzlicher Strike + 403
    http-request sc-inc-gpc0() if !src_allow abuse_req_rate
    http-request deny deny_status 403 if !src_allow abuse_req_rate

    # Überlange URLs & verbotene Methoden
    acl uri_too_long url_len gt 2048
    http-request sc-inc-gpc0() if uri_too_long
    http-request return status 414 if uri_too_long

    acl bad_methods method -i CONNECT TRACK TRACE
    http-request sc-inc-gpc0() if bad_methods
    http-request deny deny_status 405 if bad_methods

    default_backend be_app

# ------------------------------------------------------------------------------
# BACKEND(S)
# ------------------------------------------------------------------------------
backend be_app
    mode http
    timeout queue 10s
    option http-server-close
    # Health-Check optional: "option httpchk GET /healthz" + "check"
    server app1 192.168.10.5:8080

Selbst signiertes Zertifikat erstellen

# Verzeichnis anlegen
sudo mkdir -p /etc/haproxy/certs
cd /etc/haproxy/certs

# 1. Private Key erzeugen (2048 Bit RSA)
openssl genrsa -out example.key 2048

# 2. Self-Signed Zertifikat (gültig 365 Tage)
openssl req -new -x509 -key example.key -out example.crt -days 365 \
    -subj "/C=DE/ST=Berlin/L=Berlin/O=ExampleCompany/OU=IT/CN=example.com"

# 3. Key + Zertifikat zu einer PEM-Datei zusammenfügen
cat example.key example.crt > example.pem

# 4. Rechte setzen
sudo chmod 600 example.pem