Nach dem Update
wurde die letzte verwendete IP-Adresse aller Benutzer zur Docker-Gateway-Adresse, z. B. 172.17.0.1.
Mein Setup sieht wie folgt aus:
Cloudflare → VPS Nginx → Discourse Docker Nginx → Discourse
Nach dem Update
wurde die letzte verwendete IP-Adresse aller Benutzer zur Docker-Gateway-Adresse, z. B. 172.17.0.1.
Mein Setup sieht wie folgt aus:
Cloudflare → VPS Nginx → Discourse Docker Nginx → Discourse
Ich habe eine ähnliche Einrichtung wie du. Hier ist, was ich meiner Host-Nginx-Konfiguration hinzugefügt habe, damit die IP-Adresse des Benutzers weitergeleitet wird:
location / {
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header X-Forwarded-For;
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
Hallo @CLOUD_PHT – willkommen bei Meta ![]()
Ich nehme an, du betreibst mehrere Websites auf derselben Serverkonfiguration? (z. B. eine WordPress-Seite + Discourse)
Das Problem ist, dass du den Traffic über das interne Docker-Netzwerk (Port-Mapping) leitest, wodurch alle eingehenden Anfragen als Docker-Gateway-IP (172.17.0.1) maskiert werden. Da der interne Nginx 172.17.0.1 nicht als Cloudflare-IP erkennt, wird aus Sicherheitsgründen der CF-Connecting-IP-Header verworfen.
Um dies zu beheben, musst du deine Konfiguration auf einen Unix-Socket umstellen – dies ermöglicht es deinem äußeren Nginx, den Traffic (und die Header) direkt an Discourse weiterzuleiten, ohne dass das Docker-Netzwerk die IP-Adressen verfälscht.
Folge dieser offiziellen Anleitung und stelle sicher, dass du cloudflare.template.yml in deiner app.yml-Datei behältst, wenn du neu aufbaust.
Dieser Commit hat einen Konfigurationsfehler behoben, auf den du dich verlassen hast, aber der es möglicherweise auch jedem Endbenutzer ermöglicht hätte, seine IP-Adresse zu fälschen, indem er diesen Header gesetzt hat.
Es gibt tatsächlich einen einfacheren Weg, der keinen Socket erfordert – ich habe gerade einen Leitfaden geschrieben, wie man das macht.
Für deine Einrichtung @CLOUD_PHT solltest du Folgendes zu deiner Container-Definition hinzufügen (wenn bereits ein run-Abschnitt existiert, füge diese Direktiven dort hinzu, sonst füge den run-Abschnitt hinzu):
run:
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header x-forwarded-for;
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-host.conf
chmod: 644
contents: |
set_real_ip_from 172.17.0.1;
Möglicherweise benötigst du auch Folgendes:
- file:
# wir müssen rekursiv aktivieren, da wir mindestens zwei Einträge haben werden; einen vom Host, einen von CloudFlare
path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
chmod: 644
contents: |
real_ip_recursive on;
je nachdem, ob der auf deinem Server laufende nginx den Cloudflare-Header selbst verarbeitet, um die echte IP des Endbenutzers zu bestimmen (dies wird empfohlen), oder einfach nur seinen eigenen Header darüber legt. Siehe https://meta.discourse.org/t/handling-the-chain-of-trust-of-the-end-users-real-ip/406372#p-2001772-more-than-one-proxy-7 für weitere Details.
Andere Leser: Seid euch bewusst, dass diese Direktive
run:
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-host.conf
chmod: 644
contents: |
set_real_ip_from 172.17.0.1;
nicht für alle Einrichtungsarten geeignet ist. Mache dies nur, wenn alle Verbindungen zum Discourse-Container von dieser IP vertrauenswürdig sind.
Insbesondere ist ein bekanntes Problem bei IPv6-Einrichtungen, dass IPv6-Verbindungen zum Server von Docker über IPv4 weitergeleitet werden – die Art und Weise, wie dies geschieht, lässt alle Verbindungen so aussehen, als kämen sie von der docker0-IP-Adresse des Hosts. Wenn du die obige Direktive auf deine Einrichtung anwendest, ermöglicht es allen Benutzern, die über IPv6 verbinden, ihre IP-Adresse nach Belieben zu fälschen.