TL;DR — Kurzzusammenfassung
Vollständiger Leitfaden zu Traefik Middlewares: HTTP-Routing, Rate Limiting, Sicherheits-Header, Authentifizierung und Circuit Breaker für Produktion.
Traefik Middlewares: HTTP-Routing, Rate Limiting und Sicherheit
Traefik Middlewares sind der zentrale Mechanismus zur Transformation von HTTP-Anfragen und -Antworten zwischen dem Edge und Ihren Upstream-Diensten. Ob Sie Rate Limits durchsetzen, Sicherheits-Header injizieren, Pfad-Präfixe entfernen oder die Authentifizierung an einen externen Dienst delegieren möchten — jedes Verhalten ist ein diskretes Middleware-Objekt, das Sie an einen Router anhängen. Dieser Leitfaden behandelt alle wichtigen Middleware-Kategorien mit Konfigurationsbeispielen, einem Vergleich mit Alternativen und einem vollständigen Docker Compose-Beispiel für die Produktion.
Voraussetzungen
- Traefik v2.x oder v3.x als Docker-Container oder auf einem Host ausgeführt
- Grundlegende Kenntnisse mit Docker Compose Labels
- Eine registrierte Domain mit DNS, die auf Ihren Server zeigt
- Optional: Authelia oder OAuth2-Proxy für ForwardAuth-Flows
Traefik-Architektur: Die Request-Pipeline
Traefik organisiert den Datenverkehr durch vier Primitive:
- Entrypoints — Netzwerkports, auf denen Traffic ankommt (
:80,:443) - Router — ordnen eingehende Anfragen nach Host, Pfad oder Headern zu und leiten sie an einen Dienst weiter
- Middlewares — transformieren die Anfrage oder Antwort (oder lehnen sie ab), bevor sie den Dienst erreicht
- Services — die Upstream-Container oder -Server, die die endgültige Anfrage erhalten
Traefik erkennt diese Objekte automatisch aus Docker-Labels, Datei-Providern oder Kubernetes CRDs.
Middleware-Konfigurationsprovider
Docker-Labels
labels:
- "traefik.http.middlewares.meine-header.headers.stsSeconds=31536000"
- "traefik.http.routers.meineapp.middlewares=meine-header"
Datei-Provider (dynamisches YAML)
# dynamic/middlewares.yml
http:
middlewares:
meine-header:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
Sicherheits-Header-Middleware
Die Headers-Middleware injiziert oder modifiziert HTTP-Header in beiden Richtungen.
http:
middlewares:
sichere-header:
headers:
customRequestHeaders:
X-Forwarded-Proto: "https"
customResponseHeaders:
X-Powered-By: ""
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
forceSTSHeader: true
frameDeny: true
contentTypeNosniff: true
browserXssFilter: true
referrerPolicy: "strict-origin-when-cross-origin"
permissionsPolicy: "camera=(), microphone=(), geolocation=()"
contentSecurityPolicy: "default-src 'self'; script-src 'self' 'unsafe-inline'"
accessControlAllowOrigin: "https://beispiel.de"
Ein Header mit leerem Wert wird aus der Antwort entfernt.
Rate Limiting
Die RateLimit-Middleware begrenzt die Häufigkeit, mit der ein Client Anfragen stellen kann.
http:
middlewares:
api-limit:
rateLimit:
average: 100
burst: 50
period: 1m
sourceCriterion:
requestHeaderName: "X-API-Key"
- average — zulässige Anfragen pro
period - burst — maximaler Spitzenwert über dem Durchschnitt
- period — gleitendes Zeitfenster (Standard
1s; unterstützt1m,1h) - sourceCriterion — identifiziert den “Client” per Header, Host oder IP-Strategie
Bei Deployments hinter einem CDN setzen Sie ipStrategy.depth: 1, damit Traefik die echte Client-IP verwendet.
BasicAuth und DigestAuth
Schützen Sie Routen mit HTTP-Authentifizierung, wenn kein SSO verfügbar ist.
http:
middlewares:
basis-auth:
basicAuth:
users:
- "admin:$apr1$xyz$hashedpassword"
usersFile: "/etc/traefik/.htpasswd"
realm: "Administrationsbereich"
removeHeader: true
Passwort-Hashes generieren mit:
htpasswd -nb admin meinpasswort
removeHeader: true entfernt den Authorization-Header vor der Weiterleitung, um Credential-Leaks zu verhindern.
ForwardAuth: SSO und OAuth2-Integration
ForwardAuth delegiert die Authentifizierungsentscheidung an einen externen Dienst wie Authelia oder OAuth2-Proxy.
http:
middlewares:
sso-auth:
forwardAuth:
address: "http://authelia:9091/api/verify"
trustForwardHeader: true
authResponseHeaders:
- "Remote-User"
- "Remote-Groups"
- "Remote-Email"
Traefik sendet jede eingehende Anfrage zuerst an address. Gibt dieser Dienst 2xx zurück, wird die ursprüngliche Anfrage fortgesetzt.
Pfad-Manipulations-Middlewares
StripPrefix
Entfernt ein Präfix vor der Weiterleitung, nützlich wenn der Upstream einen Root-Pfad erwartet.
http:
middlewares:
strip-api:
stripPrefix:
prefixes:
- "/api/v1"
forceSlash: true
Eine Anfrage an /api/v1/benutzer kommt als /benutzer beim Upstream an.
AddPrefix
Fügt ein Präfix hinzu. Nützlich wenn mehrere Routen auf denselben Dienst zeigen.
http:
middlewares:
v2-hinzufuegen:
addPrefix:
prefix: "/v2"
ReplacePathRegex
http:
middlewares:
legacy-umleitung:
replacePathRegex:
regex: "^/alt/(.*)"
replacement: "/neu/$1"
Komprimierung
http:
middlewares:
komprimieren:
compress:
excludedContentTypes:
- "image/jpeg"
- "image/png"
minResponseBodyBytes: 1024
Traefik unterstützt gzip und brotli. Brotli wird verwendet, wenn der Client Accept-Encoding: br sendet.
Retry und CircuitBreaker
Retry
http:
middlewares:
wiederholen:
retry:
attempts: 3
initialInterval: "100ms"
CircuitBreaker
http:
middlewares:
schaltkreis-unterbrecher:
circuitBreaker:
expression: "ResponseCodeRatio(500, 600, 0, 600) > 0.30"
checkPeriod: "10s"
fallbackDuration: "30s"
recoveryDuration: "10s"
Der Schaltkreis öffnet sich, wenn expression wahr ist, und blockiert den Traffic für fallbackDuration.
IPAllowList
Beschränkt den Zugriff auf eine Whitelist von IP-Bereichen.
http:
middlewares:
nur-intern:
ipAllowList:
sourceRange:
- "10.0.0.0/8"
- "172.16.0.0/12"
- "192.168.0.0/16"
ipStrategy:
depth: 2
Umleitungs-Middlewares
RedirectScheme (HTTP → HTTPS)
http:
middlewares:
https-umleitung:
redirectScheme:
scheme: "https"
permanent: true
RedirectRegex (www → ohne www)
http:
middlewares:
www-umleitung:
redirectRegex:
regex: "^https://www\\.(.+)"
replacement: "https://${1}"
permanent: true
Middleware-Ketten
Ketten ermöglichen die Zusammensetzung mehrerer Middlewares zu einer einzigen benannten Pipeline.
http:
middlewares:
sicherer-stack:
chain:
middlewares:
- sichere-header
- https-umleitung
- api-limit
- sso-auth
Hängen Sie die Kette mit einem einzigen Label an einen Router:
labels:
- "traefik.http.routers.meineapp.middlewares=sicherer-stack"
Vergleich: Traefik vs. Alternativen
| Funktion | Traefik | Nginx (Module) | Envoy (Filter) | Kong (Plugins) | Caddy (Handler) |
|---|---|---|---|---|---|
| Rate Limiting | Eingebaut | limit_req | ratelimit filter | Offizielles Plugin | rate_limit |
| Auth-Delegation | ForwardAuth | auth_request | ext_authz | OIDC-Plugin | forward_auth |
| Circuit Breaker | Eingebaut | Nicht nativ | Eingebaut | Erfordert Plugin | Nicht nativ |
| Pfad-Umschreibung | Eingebaut | rewrite | rewrite filter | Eingebaut | rewrite |
| Komprimierung | Eingebaut | gzip-Modul | compressor | Nicht nativ | Eingebaut |
| Dynamische Konfig | Auto (Labels/CRD) | Reload nötig | xDS API | Admin API | Auto (Caddyfile) |
Vollständiges Docker Compose-Beispiel für die Produktion
Sie haben einen API-Dienst in der Produktion, der HTTPS, Rate Limiting, Sicherheits-Header und BasicAuth auf dem Admin-Pfad benötigt.
services:
traefik:
image: traefik:v3.1
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entryPoint.to=websecure
- --entrypoints.web.http.redirections.entryPoint.scheme=https
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.email=ops@beispiel.de
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.tlschallenge=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- edge
api:
image: ghcr.io/beispiel/api:latest
restart: unless-stopped
networks:
- edge
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.beispiel.de`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=le"
- "traefik.http.routers.api.middlewares=sicherer-stack"
- "traefik.http.services.api.loadbalancer.server.port=8080"
- "traefik.http.middlewares.hdrs.headers.stsSeconds=31536000"
- "traefik.http.middlewares.hdrs.headers.frameDeny=true"
- "traefik.http.middlewares.rl.rateLimit.average=120"
- "traefik.http.middlewares.rl.rateLimit.burst=40"
- "traefik.http.middlewares.rl.rateLimit.period=1m"
- "traefik.http.middlewares.compress.compress=true"
- "traefik.http.middlewares.sicherer-stack.chain.middlewares=hdrs,rl,compress"
networks:
edge:
external: true
Fallstricke und Sonderfälle
- Dollarzeichen in BasicAuth-Hashes müssen in Docker-Labels verdoppelt werden (
$$), da Docker Compose$als Variable interpoliert. - Die Reihenfolge der Middlewares in einer Kette ist wichtig. Wenden Sie Umleitungen vor der Authentifizierung an; Komprimierung kommt zuletzt.
- Die Latenz von ForwardAuth fügt pro Anfrage einen zusätzlichen Round-Trip hinzu. Nutzen Sie Entscheidungs-Caching in Authelia oder OAuth2-Proxy.
- RateLimit-Zähler sind pro Replikat. Bei drei Traefik-Replikas wird die erlaubte Rate mit drei multipliziert.
- CircuitBreaker verwendet eine eigene Ausdruckssprache, nicht PromQL. Konsultieren Sie die offizielle Traefik-Dokumentation für
ResponseCodeRatioundLatencyAtQuantileMS.
Zusammenfassung
- Traefik Middlewares hängen an Routern und transformieren Anfragen, bevor sie Upstream-Dienste erreichen
- Verwenden Sie
Headersfür HSTS, CSP und CORS; entfernen Sie immer sensible Header Richtung Upstream RateLimitmitsourceCriterionverwaltet API-Throttling; konfigurieren SieipStrategy.depthhinter CDNsForwardAuthintegriert Authelia und OAuth2-Proxy für SSO ohne Anwendungscode zu ändernChain-Middlewares komponieren wiederverwendbare Sicherheitspipelines, die mit einem Label an jeden Router gehängt werden