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.
- 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 einzelnesbind :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
oderCONNECT
- Schutz vor überlangen URLs (
- 🔧 Einfache Erweiterbarkeit
- Whitelist/Blacklist über Map-Dateien (
whitelist.map
/blacklist.map
) - Weitere Domains & Zertifikate können per SNI eingebunden werden
- Whitelist/Blacklist über Map-Dateien (
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
Schreibe einen Kommentar