Dopo l’aggiornamento
l’ultimo indirizzo IP utilizzato da tutti gli utenti è diventato quello del gateway Docker, come 172.17.0.1
La mia architettura è la seguente
Cloudflare → Nginx VPS → Nginx Docker Discourse → Discourse
Dopo l’aggiornamento
l’ultimo indirizzo IP utilizzato da tutti gli utenti è diventato quello del gateway Docker, come 172.17.0.1
La mia architettura è la seguente
Cloudflare → Nginx VPS → Nginx Docker Discourse → Discourse
Ho una configurazione simile alla tua, ecco cosa ho aggiunto alla mia configurazione nginx del server host per far passare l’IP dell’utente:
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;
}
ciao @CLOUD_PHT - benvenuto su Meta ![]()
immagino che tu stia facendo girare più di un sito web sulla stessa configurazione di macchina? (come un sito WordPress + Discourse)
il problema è che stai instradando il traffico attraverso la rete interna di Docker (mappatura delle porte), il che maschera tutte le richieste in entrata come provenienti dall’IP del gateway Docker (172.17.0.1). poiché Nginx interno non riconosce 172.17.0.1 come un IP di Cloudflare, scarta l’header CF-Connecting-IP per motivi di sicurezza.
per risolvere il problema, devi passare alla configurazione che utilizza un socket Unix: questo permette al tuo Nginx esterno di inoltrare il traffico (e gli header) direttamente a Discourse senza che la rete di Docker alteri gli indirizzi IP.
segui questa guida ufficiale e assicurati di mantenere cloudflare.template.yml nel tuo file app.yml quando esegui la ricostruzione.
Quellcode commit ha corretto un errore di configurazione su cui ti affidavi, ma che potrebbe anche aver consentito a qualsiasi utente finale di falsificare il proprio indirizzo IP impostando quella intestazione.
In realtà esiste un metodo più semplice che non richiede l’uso di una socket: ho appena scritto una guida su come procedere.
Per la tua configurazione @CLOUD_PHT dovresti aggiungere quanto segue alla definizione del container (se esiste già una sezione run, aggiungi queste direttive ad essa, altrimenti aggiungi la sezione run):
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;
Potrebbe essere necessario anche quanto segue:
- file:
# dobbiamo abilitare la ricorsività poiché avremo almeno due voci: una dall'host, una da CloudFlare
path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
chmod: 644
contents: |
real_ip_recursive on;
Dipende dal fatto che nginx in esecuzione sul tuo server elabori l’intestazione Cloudflare per determinare l’indirizzo IP reale dell’utente finale (come suggerito) o aggiunga semplicemente la propria sopra.
Altri lettori: tieni presente che questa direttiva
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;
non è adatta a tutte le configurazioni. Applicala solo se tutte le connessioni al container Discourse da questo indirizzo IP sono affidabili.
In particolare, un problema noto con le configurazioni IPv6 è che le connessioni IPv6 al server sono inoltate da docker tramite IPv4: il modo in cui viene fatto fa sì che tutte le connessioni sembrino provenire dall’indirizzo IP docker0 dell’host. Se applichi la direttiva sopra alla tua configurazione, consentirai a tutti gli utenti che si connettono tramite IPv6 di falsificare il proprio indirizzo IP a piacimento.