Hintergrund
Discourse muss den echten IP-Adresse des Endbenutzers kennen.
Allerdings verbindet sich ein Endbenutzer nie direkt mit Discourse, da es immer einen oder mehrere vorgelagerte Webserver (nginx, die in dem Discourse-Container laufen) gibt. Daher benötigen wir eine Möglichkeit, diese Information auf vertrauenswürdige Weise an Discourse weiterzuleiten.
Der x-forwarded-for-Header ist die Lösung. In diesem Thema werde ich die spezifischen Mechanismen zur ordnungsgemäßen Handhabung dieser Informationen beschreiben und erläutern, wie wir deren Weitergabe erwarten.
Vorlagen
Die verschiedenen Vorlagen zum Vertrauen von vorgelagerten Proxys (z. B. cloudflare.template.yml oder fastly.template.yml) wurden aktualisiert, um in den Ausgabeeinheiten vorhersehbare Dateinamen zu verwenden, anstatt sich auf Textsubstitution zu verlassen (was fehleranfällig ist).
Dateinamen
server/real-ip-header.conf
Diese Datei enthält den Header, den nginx, das in dem Container läuft, als vertrauenswürdige Quelle verwenden wird, z. B.:
real_ip_header x-forwarded-for;
oder wie in der Cloudflare-Vorlage festgelegt:
real_ip_header cf-connecting-ip;
server/real-ip-recursive.conf
Wenn diese Datei existiert, steuert sie die Rekursion bei der Verarbeitung des „echten IP“-Headers. Sie müssen dies aktivieren, wenn mehr als ein Proxy vor dem Discourse-Container steht.
real_ip_recursive on;
Beispiel:
Cloudflare → Load Balancer → Discourse-Container (bestehend aus nginx + Discourse selbst)
Bei dieser Konfiguration empfängt nginx ein x-forwarded-for, das wie folgt aussieht:
x-forwarded-for: echte_endbenutzer_ip, cloudflare_ip
bei einer Verbindung von einer Load-Balancer-IP.
Um dies zu verarbeiten, bestimmt nginx zunächst, ob die Quelladresse der Verbindung (die Load-Balancer-IP) vertrauenswürdig ist (siehe set_real_ip_from) und verarbeitet gegebenenfalls die letzte IP des x-forwarded-for-Headers.
Da diese IP-Adresse cloudflare_ip ist, muss nginx dies noch einmal tun, indem es überprüft, ob cloudflare_ip vertrauenswürdig ist, und die nächste IP-Adresse verwendet, die real_end_user_ip ist.
server/set-real-ip-from-ENVIRONMENT.conf
Diese Datei enthält Direktiven, die nginx mitteilen, welche IP-Adressen vertrauenswürdig sind, und wir können so viele Dateien und Direktiven haben, wie erforderlich.
Die Vorlagen in discourse_docker erstellen diese Dateien bei Bedarf (z. B. set-real-ip-from-cloudflare.conf), und wenn Sie zusätzliche Anforderungen haben, können Sie Ihre eigenen hinzufügen.
Beispiel:
Wenn Sie in AWS laufen und einen ALB vor dem Discourse-Container haben, können Sie eine zusätzliche Datei hinzufügen, indem Sie Folgendes zu Ihrer Container-Definition hinzufügen (angepasst an Ihre Umgebung):
run:
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-aws.conf
chmod: 644
# AWS VPC ist 10.42.0.0/16, vertraue allen Verbindungen aus den ALB-Netzwerken
contents: |
set_real_ip_from 10.42.66.0/24;
set_real_ip_from 10.42.67.0/24;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header x-forwarded-for;