Risoluzione del problema in cui tutti gli IP utente su Discourse distribuito con 1Panel mostrano Cloudflare invece dell'IP reale del browser

Ho installato 1Panel su un VPS, ho configurato Discourse (deploy containerizzato) e ho impostato un reverse proxy utilizzando OpenResty (anch’esso deployato tramite container). Il dominio è gestito su Cloudflare con l’attivazione della CDN (la nuvoletta gialla). Di seguito riporto una guida per risolvere il problema per cui gli indirizzi IP degli utenti vengono mostrati come provenienti da Cloudflare invece che dal browser reale dell’utente.

I. Creare un’attività pianificata in 1Panel per scaricare settimanalmente l’elenco aggiornato degli IP di Cloudflare e salvarlo nella directory di configurazione di OpenResty.

  1. Nel menu laterale sinistro di 1Panel, clicca su “Attività pianificate”.

  2. Clicca sul pulsante “Crea attività pianificata” in alto a destra.

  3. Compila i parametri come segue (puoi copiare e incollare direttamente):

  • Tipo di attività: seleziona Script Shell.

  • Nome attività: ad esempio Aggiornamento automatico degli IP di Cloudflare.

  • Ciclo di esecuzione: si consiglia di impostare su Settimanale (ad esempio ogni sabato alle 03:00 di notte).

  • Contenuto dello script: copia e incolla l’intero codice sottostante (Nota: modifica prima il nome del container e il percorso della directory di configurazione all’inizio dello script):

#!/bin/bash
# Area di configurazione
CONTAINER_NAME="Nome del container openresty in 1Panel"
# Modifica con la directory proxy specifica del sito
CONF_DIR="/opt/1panel/www/sites/www.tuodominio/proxy"

echo "[$(date)] Inizio recupero degli ultimi IP da Cloudflare..."
TEMP_DIR=$(mktemp -d)

# Recupera e converti la lista IP nel formato riconosciuto da Nginx
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

# Verifica e sposta i file
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)] File di configurazione aggiornati con successo in $CONF_DIR."
else
    echo "[$(date)] Errore: impossibile recuperare gli IP di Cloudflare!"
    rm -rf $TEMP_DIR
    exit 1
fi
rm -rf $TEMP_DIR

# Testa e ricarica Nginx
echo "[$(date)] Esecuzione test configurazione Nginx..."
if docker exec $CONTAINER_NAME nginx -t; then
    docker exec $CONTAINER_NAME nginx -s reload
    echo "[$(date)] Successo! Ricarica configurazione OpenResty completata."
else
    echo "[$(date)] Fallito! Il test della configurazione Nginx non è andato a buon fine."
    exit 1
fi

Una volta creata l’attività, non è necessario attendere il sabato; puoi testarla immediatamente: trova l’attività appena creata nell’elenco delle “Attività pianificate”.

Clicca sul pulsante “Report” a destra. Controlla la finestra dei log che appare. Se nelle ultime righe compare Successo! Ricarica configurazione OpenResty completata, significa che l’intero processo è stato eseguito correttamente all’interno di 1Panel!

II. Configurazione aggiuntiva realip in OpenResty

Nella directory /opt/1panel/www/sites/www.tuodominio/proxy/ sulla macchina host, crea un nuovo file (il nome è a tua scelta, purché termini con .conf; verrà caricato automaticamente dalla configurazione principale tramite include *.conf): realip.conf

real_ip_header CF-Connecting-IP;
real_ip_recursive on;

III. Ricarica OpenResty

docker exec Nome_del_container_openresty_in_1Panel nginx -t
docker exec Nome_del_container_openresty_in_1Panel nginx -s reload

IV. Verifica se OpenResty ha recuperato l’IP reale

Controlla il file access log di OpenResty:

tail -f /opt/1panel/www/sites/www.tuodominio/log/access.log

Se la configurazione è corretta, il primo IP nei log dovrebbe essere il tuo vero IP pubblico, e non un indirizzo della rete 173.245.x.x di Cloudflare.

V. Note per la configurazione di Discourse

L’aggiunta di - "templates/cloudflare.template.yml" nel file app.yml di Discourse è efficace solo se Discourse è esposto direttamente a Cloudflare. Poiché è stato inserito un reverse proxy OpenResty intermedio, il container di Discourse vede come IP di origine l’indirizzo del gateway Docker (ad esempio 172.17.0.1 o 172.18.0.1), quindi le direttive set_real_ip_from <CloudflareIP> presenti in quel template non verranno abbinati.

Tuttavia, seguendo i passaggi sopra descritti per ripristinare l’IP reale a livello di OpenResty e trasmettere un header X-Forwarded-For pulito, il backend Rails di Discourse sarà in grado di identificare correttamente l’IP reale dell’utente, poiché Rails riconosce di default come attendibili gli indirizzi della rete privata Docker del tipo 172.x.x.x.

Di conseguenza, non è necessario aggiungere - "templates/cloudflare.template.yml" nel file app.yml di Discourse.