HTTP-Forwarded-Header

Typ

Der Forwarded-Header ist ein Request-Header, der Informationen über Client, Protokoll und Host durch Proxy-Ketten und Load Balancer transportiert.

Syntax

Der Header enthält strukturierte Direktiven für Client-IP (for), verwendetes Protokoll (proto), Host-Ziel (host) und Proxy-Identität (by).

http
Forwarded: for=192.0.2.60;proto=https;host=api.example.com
Forwarded: for=198.51.100.17, for=203.0.113.43;proto=http

Direktiven

Der Forwarded-Header verwendet kommaseparierte Proxy-Hops mit Semikolon-getrennten Parametern, die jeweils spezifische Aspekte der Verbindungskette dokumentieren.

for
Identifiziert den Client, der die Anfrage initiiert hat (IP-Adresse oder obfuskierter Identifier).
proto
Spezifiziert das Protokoll der ursprünglichen Client-Anfrage (http oder https).
host
Definiert den Host-Header-Wert der ursprünglichen Anfrage.
by
Identifiziert die Proxy-Schnittstelle, die die Anfrage empfangen hat (optional).

Beispiele

Die folgenden Beispiele zeigen typische Anwendungsfälle in API-Gateway-Architekturen, Load-Balancer-Konfigurationen und Microservice-Szenarien.

API-Gateway mit HTTPS-Terminierung

Ein API-Gateway terminiert TLS und leitet die Anfrage an Backend-Services weiter, wobei die ursprünglichen Client-Informationen erhalten bleiben.

http
GET /api/v1/orders HTTP/1.1
Host: backend.internal
Forwarded: for=203.0.113.195;proto=https;host=api.example.com
X-Request-ID: a3f2b8c1-9e5d-4a7b-8c2e-1f3a4b5c6d7e

Multi-Proxy-Kette mit Load Balancer

Eine Anfrage durchläuft mehrere Proxies: CDN, Load Balancer und API-Gateway, wobei jeder Hop dokumentiert wird.

http
GET /api/v2/products/12345 HTTP/1.1
Host: product-service.internal
Forwarded: for=198.51.100.42;proto=https;host=api.example.com, for=192.0.2.100;by=192.0.2.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Microservice mit Client-IP-Extraktion

Ein Backend-Service extrahiert die Client-IP aus dem Forwarded-Header für Rate-Limiting und Audit-Logging.

http
POST /api/v1/transactions HTTP/1.1
Host: payment-service.internal
Forwarded: for=203.0.113.78;proto=https;host=api.example.com;by=_loadbalancer
Content-Type: application/json

{
  "amount": 99.99,
  "currency": "EUR"
}

Forwarded-Header-Flow

Der Forwarded-Header akkumuliert Proxy-Informationen durch die gesamte Infrastruktur-Kette, vom Client bis zum finalen Backend-Service.

plantuml
@startuml
!theme plain
skinparam BoxPadding 20
skinparam ParticipantPadding 20

participant "Client" as client
participant "CDN/WAF" as cdn
participant "Load\nBalancer" as lb
participant "API\nGateway" as gateway
participant "Backend\nService" as backend

client -> cdn: GET /api/orders\nHost: api.example.com
note right: Keine Forwarded-Header

cdn -> lb: GET /api/orders\nForwarded: for=203.0.113.195;\n  proto=https;host=api.example.com
note right: CDN fügt Client-Info hinzu

lb -> gateway: GET /api/orders\nForwarded: for=203.0.113.195;\n  proto=https;host=api.example.com,\n  for=192.0.2.100;by=192.0.2.1
note right: LB erweitert Chain

gateway -> backend: GET /api/orders\nForwarded: for=203.0.113.195;\n  proto=https;host=api.example.com,\n  for=192.0.2.100;by=192.0.2.1,\n  for=10.0.1.5;by=_gateway
note right: Gateway komplettiert Chain

backend --> gateway: 200 OK\n[Orders JSON]
gateway --> lb: 200 OK
lb --> cdn: 200 OK
cdn --> client: 200 OK

note over backend: Backend extrahiert\nClient-IP: 203.0.113.195\nProtokoll: https\nHost: api.example.com
@enduml

Vorteile für die Systemarchitektur

  • Standardisierte Alternative zu proprietären X-Forwarded-* Headers (RFC 7239)
  • Präzise Client-IP-Extraktion für Security-Policies, Rate-Limiting und Geo-Blocking
  • Proxy-Chain-Transparenz für Debugging und Security-Audits
  • Unterstützung für IPv6-Adressen und obfuskierte Identifiers
  • Protokoll-Awareness für HTTPS-Terminierung in API-Gateways

Spezifikation

RFC 7239 definiert die Syntax und Semantik des Forwarded-Headers als standardisierte Lösung für Proxy-Informationen in HTTP/1.1 und HTTP/2.

Weitere Spezifikationen

X-Forwarded-For Header, X-Forwarded-Host Header, X-Forwarded-Proto Header