Problem lösen: Bei der mit 1Panel bereitgestellten Discourse werden alle Benutzer-IPs als von Cloudflare statt als echte Browser-IPs angezeigt

Ich habe 1Panel auf meinem VPS installiert, Discourse (Container-Bereitstellung) eingerichtet und OpenResty (Container-Bereitstellung) als Reverse-Proxy verwendet. Meine Domain ist bei Cloudflare gehostet, und der gelbe Wolken-CDN ist aktiviert. Im Folgenden habe ich ein Tutorial verfasst, um das Problem zu lösen, dass die IP-Adresse der Benutzer als von Cloudflare stammend angezeigt wird, anstatt die IP-Adresse des Browsers des Benutzers.

Schritt 1: Geplante Aufgabe in 1Panel erstellen, um wöchentlich die neueste Cloudflare-IP-Liste herunterzuladen und im Konfigurationsverzeichnis von OpenResty zu speichern.

  1. Klicken Sie im linken Menü von 1Panel auf “Geplante Aufgaben”.

  2. Klicken Sie oben rechts auf “Geplante Aufgabe erstellen”.

  3. Füllen Sie die folgenden Parameter aus (einfach kopieren und einfügen):

  • Aufgabentyp: Wählen Sie Shell-Skript.

  • Aufgabenname: Zum Beispiel Automatische Aktualisierung der Cloudflare-IP-Bereiche.

  • Ausführungszyklus: Empfohlen wird Wöchentlich (z. B. jeden Samstag um 03:00 Uhr nachts).

  • Skriptinhalt: Kopieren Sie den folgenden vollständigen Code direkt hinein (Hinweis: Ändern Sie zuerst den Container-Namen und den Pfad zum Konfigurationsverzeichnis ganz oben im Code):

#!/bin/bash
# Konfigurationsbereich
CONTAINER_NAME="Container-Name von OpenResty in 1Panel"
# Ändern Sie dies auf das spezifische proxy-Verzeichnis der Website
CONF_DIR="/opt/1panel/www/sites/www.ihre-website-domain/proxy"

echo "[$(date)] Starte das Abrufen der neuesten IP-Bereiche von der offiziellen Cloudflare-Website..."
TEMP_DIR=$(mktemp -d)

# Abrufen und Umwandeln der IP-Liste in ein von Nginx erkennbares Format
curl -fsS https://www.cloudflare.com/ips-v4 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v4.conf
curl -fsS https://www.cloudflare.com/ips-v6 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v6.conf

# Prüfen und Verschieben der Dateien
if [[ -s $TEMP_DIR/cf-ips-v4.conf ]] && [[ -s $TEMP_DIR/cf-ips-v6.conf ]]; then
    mv $TEMP_DIR/cf-ips-v4.conf $CONF_DIR/
    mv $TEMP_DIR/cf-ips-v6.conf $CONF_DIR/
    echo "[$(date)] Konfigurationsdateien wurden erfolgreich in $CONF_DIR aktualisiert."
else
    echo "[$(date)] Fehler: Abrufen der Cloudflare-IPs fehlgeschlagen!"
    rm -rf $TEMP_DIR
    exit 1
fi
rm -rf $TEMP_DIR

# Testen und Neuladen von Nginx
echo "[$(date)] Starte Konfigurationstest für Nginx..."
if docker exec $CONTAINER_NAME nginx -t; then
    docker exec $CONTAINER_NAME nginx -s reload
    echo "[$(date)] Erfolg! Konfiguration von OpenResty wurde erfolgreich neu geladen."
else
    echo "[$(date)] Fehler! Konfigurationstest für Nginx nicht bestanden."
    exit 1
fi

Nachdem die Aufgabe erstellt wurde, müssen Sie nicht bis Samstag warten. Sie können sofort testen: Suchen Sie in der Liste der “Geplanten Aufgaben” nach der gerade erstellten Aufgabe.

Klicken Sie rechts auf die Schaltfläche “Bericht”. Überprüfen Sie das erscheinende Protokollfenster. Wenn die letzten Zeilen Erfolg! Konfiguration von OpenResty wurde erfolgreich neu geladen anzeigen, bedeutet dies, dass der gesamte Prozess in 1Panel einwandfrei funktioniert!

Schritt 2: Zusätzliche realip-Konfiguration für OpenResty

Erstellen Sie im Verzeichnis /opt/1panel/www/sites/www.ihre-website-domain/proxy/ auf dem Host-System eine neue Datei (beliebiger Dateiname, muss mit .conf enden und wird automatisch durch include *.conf in der Hauptkonfiguration geladen): realip.conf

real_ip_header CF-Connecting-IP;
real_ip_recursive on;

Schritt 3: OpenResty neu laden

docker exec Container-Name-von-OpenResty-in-1Panel nginx -t
docker exec Container-Name-von-OpenResty-in-1Panel nginx -s reload

Schritt 4: Überprüfen, ob OpenResty die echte IP-Adresse erhalten hat

Überprüfen Sie das access-Log von OpenResty:

tail -f /opt/1panel/www/sites/www.ihre-website-domain/log/access.log

Wenn die Konfiguration korrekt ist, sollte die erste IP-Adresse im Protokoll Ihre echte öffentliche IP-Adresse sein und nicht ein Bereich von Cloudflare wie 173.245.x.x.

Schritt 5: Hinweise für Discourse

Das Hinzufügen von - "templates/cloudflare.template.yml" in der app.yml von Discourse ist nur dann wirksam, wenn Discourse direkt mit Cloudflare verbunden ist. Da OpenResty als Reverse-Proxy dazwischen geschaltet ist, sieht der Discourse-Container die Quell-IP tatsächlich als Docker-Gateway (z. B. 172.17.0.1 oder 172.18.0.1). Daher wird set_real_ip_from <CloudflareIP> in dieser Vorlage nicht übereinstimmen.

Aber solange Sie die Schritte oben befolgen, um die echte IP-Adresse auf der OpenResty-Ebene wiederherzustellen und ein sauberes X-Forwarded-For zu übermitteln, kann das Backend-Rails von Discourse die echte Benutzer-IP korrekt identifizieren, da Rails standardmäßig bereits private Docker-Netzwerkbereiche wie 172.x.x.x vertraut.

Daher ist es nicht erforderlich, - "templates/cloudflare.template.yml" in der app.yml von Discourse hinzuzufügen.