Discourse mostra IP del server/localhost come IP dell'utente

Ciao, ho distribuito Discourse sul mio server, tutto funziona normalmente tranne il rilevamento dell’indirizzo IP dell’utente, ho persino creato uno script PHP (fuori dal container Docker) per ottenere tutte le intestazioni in cui può trovarsi l’IP:

REMOTE_ADDR: 212.58.xxx.xxx
SERVER_PORT: 80
SERVER_ADDR: 85.25.xxx.xxx
SERVER_SOFTWARE: Apache:
HTTP_CF_CONNECTING_IP: 212.58.xxx.xxx
HTTP_CDN_LOOP: cloudflare
HTTP_X_REAL_IP: 162.158.xxx.xxx

Dettagli:
Il server ha installato il pannello BrainyCP con Apache e Nginx (attualmente il sito web utilizza Nginx, che funge da reverse proxy per il container Docker)
HTTP_CF_CONNECTING_IP restituisce 127.0.0.1 all’interno del container Docker, ma all’esterno hanno valori normali
Senza modificare l’intestazione utilizzando comandi personalizzati, Discourse visualizza l’IP del server.

(Presto aggiungerò maggiori dettagli poiché la mia istanza di Discourse è in fase di ricostruzione)

Non sono molto sicuro della tua configurazione, ma ho notato Cloudflare nel tuo post. Hai aggiunto il template CloudFlare al tuo file app.yml?

  - "templates/cloudflare.template.yml"

MODIFICA: ho usato le virgolette sbagliate " "

No, l’ho aggiunto all’elenco dei modelli, ora attendo la ricompilazione.

1 Mi Piace

Ricostruito, ma mostra ancora l’IP del server (ho commentato i comandi personalizzati

## Qualsiasi comando personalizzato da eseguire dopo la compilazione
run:
  - exec: echo "Inizio dei comandi personalizzati"
  ## Se desideri impostare l'indirizzo email 'Da' per la tua prima registrazione, decommenta e modifica:
  ## Dopo aver ricevuto la prima email di iscrizione, ri-commenta la riga. Deve essere eseguita solo una volta.
  - exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
  #- replace:
  #   filename: /etc/nginx/conf.d/discourse.conf
  #   from: "types {"
  #   to: |
  #     set_real_ip_from 85.25.134.45;
  #     real_ip_header CF-Connection-IP;
  #     real_ip_recursive on;
  #     types {
  #- replace:
  #   filename: /etc/nginx/conf.d/discourse.conf
  #   from: $proxy_add_x_forwarded_for
  #   to: $send_http_cf_connection_ip;
  #   global: true
  - exec: echo "Fine dei comandi personalizzati"

Devo decommentarli? (voglio anche notare che non hanno funzionato nemmeno prima che aggiungessi il template cloudflare a app.yml))

Non commentato, $sent_http_cf_connection_ip restituisce 127.0.0.1
image

Nginx sta probabilmente segnalando 127.0.0.1 e non Discourse stesso, probabilmente dovrai configurare realip in nginx

Ho già aggiunto cloudflare.template.yml che aggiunge direttive realip, ma non funziona ancora.
Ho persino rimosso comandi personalizzati che cambiano in header personalizzato e ora Discourse segnala l’IP del server per tutti gli utenti invece di localhost.

Inoltre, questa è la configurazione Nginx per il dominio zeronet.space generata dal pannello stesso

server {
	listen 85.25.xxx.xx:443 ssl http2;
	server_name  zeronet.space www.zeronet.space;
	root  /home/ay0ks/workspace/sites/zeronet.space;
	
	# ssl on;
	ssl_certificate  /etc/certs/ay0ks/zeronet.space_1655753906.crt;
	ssl_certificate_key /etc/certs/ay0ks/zeronet.space_1655753906.key;
	#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	#ssl_ciphers  "HIGH:!RC4:!aNULL:!MD5:!kEDH";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
	ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT;
	ssl_prefer_server_ciphers on;
	
	add_header Strict-Transport-Security 'max-age=604800';
	
	access_log /etc/nginx/vhost_logs/zeronet.space_access;
	error_log /etc/nginx/vhost_logs/zeronet.space_error;
	
	location ~ /.well-known {
		allow all;
	}
	
	location ~ /\\.ht {
		deny all;
		access_log off;
		log_not_found off;
	}

	location / {
		root /home/ay0ks/workspace/sites/zeronet.space;
		proxy_pass http://85.25.xxx.xx:31080; # Discourse è distribuito sulle porte 31080/31443
		proxy_redirect     off;
		proxy_force_ranges on;
		proxy_set_header   Host $host;
		proxy_set_header   X-Real-IP $remote_addr;
		proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header   X-Forwarded-Proto $scheme;
		proxy_set_header   HTTPS $scheme;
		
		proxy_cache off;
		proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
		#access_log /etc/nginx/vhost_logs//home/ay0ks/workspace/sites/zeronet.space;
		
		proxy_cache_valid 3s;
		proxy_cache_min_uses 2;
		# proxy_cache_lock on;
		# proxy_cache_use_stale error timeout;
		# proxy_cache_use_stale updating http_502 http_504;
		limit_conn lone 100;
		# limit_req zone=ltwo burst=10;
		
		client_body_buffer_size    128k;
		client_max_body_size       1024m;
		proxy_connect_timeout      180;
		proxy_send_timeout         180;
		proxy_read_timeout         180;
		send_timeout               180;
		
		proxy_buffer_size          4k;
		proxy_buffers              8 32k;
		proxy_busy_buffers_size    68k;
		proxy_temp_file_write_size 10m;
	}

	# error_page  404              /404.html;
	# error_page   500 502 503 504  /50x.html;
}

Inoltre, vorrei segnalare il “percorso” della richiesta:
Utente -> Cloudflare -> Server(Nginx -> Docker -> Discourse)
E nota che l’IP dell’utente è visibile all’esterno di docker nell’header di Cloudflare CF-Connecting-IP

Non so molto su come funzionano le cose relative all’IP reale di Cloudflare, ma il mio sospetto è che il tuo Discourse nginx avrà bisogno di set_real_ip_from all’indirizzo IP che vede come il tuo proxy nginx. 127.0.0.1? Un altro indirizzo interno? L’indirizzo pubblico? Non sono sicuro di quale vedrebbe.

Una volta che sai quale indirizzo è, penso che quello che farei sarebbe lasciare il template di Cloudflare lì, quindi aggiungere un nuovo replace solo per set_real_ip_from.

In aggiunta a ciò, il tuo proxy nginx dovrà essere configurato per passare l’header CF-Connecting-IP se non è già configurato per farlo o non lo fa già per impostazione predefinita. Non posso davvero aiutarti con questa parte.

Stesso percorso mio, il mio problema era che nginx non era configurato per accettare l’IP di docker come intervallo per impostare il realip.

set_real_ip_from 172.18.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from 172.18.0.0/16;

Quindi vado Utente > Cloudflare > Server Nginx (SWAG Docker) > Discourse

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Real-IP $remote_addr;
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
#  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"
4 Mi Piace

Questa potrebbe essere la causa dei tuoi problemi. Prova a configurare Discourse su un server senza pannelli o proxy inversi installati e segnala se riscontri lo stesso problema.

Come primo passo, inizia modificando il blocco di posizione per Discourse in modo che corrisponda ai dettagli forniti qui: Run other websites on the same machine as Discourse

1 Mi Piace

Questa non è una soluzione a un problema, in pratica comprare un nuovo server dedicato da 30€/mese può risolvere qualsiasi cosa lol (questo thread non esisterà allora).

Proverò e pubblicherò i risultati qui

Devo aggiungere anche gli header nella configurazione Nginx di Discourse? (all’interno di docker) Perché mi mostra ancora l’indirizzo del server invece di quello degli utenti.

In base al tuo percorso, non ha senso per me.

Il tuo nginx va a discourse a docker, perché il tuo discourse dovrebbe usare anche il proprio nginx?

Non lo so, ho aggiunto le tue direttive Nginx alle mie tramite il pannello (controllato anche da ssh), ma mostra ancora l’IP del server.

Questo è il mio app.yml:

## questo è il modello di container Docker Discourse tutto in uno e autonomo
##
## Dopo aver apportato modifiche a questo file, DEVI ricompilare
## /var/discourse/launcher rebuild app
##
## FAI MOLTA ATTENZIONE QUANDO MODIFICHI!
## I FILE YAML SONO ESTREMAMENTE SENSIBILI A ERRORI DI SPAZIATURA O ALLINEAMENTO!
## visita http://www.yamllint.com/ per convalidare questo file secondo necessità

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/cloudflare.template.yml"
## Decommenta queste due righe se desideri aggiungere Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP dovrebbe esporre questo container?
## Se desideri che Discourse condivida una porta con un altro webserver come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "31080:80"   # http
  - "31443:443" # https

params:
  db_default_text_search_config: "pg_catalog.russian"

  ## Imposta db_shared_buffers a un massimo del 25% della memoria totale.
  ## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, o puoi sovrascriverlo
  db_shared_buffers: "4096MB"

  ## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
  #db_work_mem: "40MB"

  ## Quale revisione Git dovrebbe utilizzare questo container? (predefinito: tests-passed)
  #version: tests-passed

env:
  LC_ALL: ru_RU.UTF-8
  LANG: ru_RU.UTF-8
  LANGUAGE: ru_RU.UTF-8
  DISCOURSE_DEFAULT_LOCALE: ru

  ## Quante richieste web concorrenti sono supportate? Dipende da memoria e core CPU.
  ## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, o puoi sovrascriverlo
  UNICORN_WORKERS: 8

  ## TODO: Il nome di dominio a cui risponderà questa istanza di Discourse
  ## Obbligatorio. Discourse non funzionerà con un semplice numero IP.
  DISCOURSE_HOSTNAME: 'zeronet.space'

  ## Decommenta se desideri che il container venga avviato con lo stesso
  ## hostname (-h opzione) specificato sopra (predefinito "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgole che diventeranno amministratori e sviluppatori
  ## alla prima registrazione esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'contact@zeronet.space'

  ## TODO: Il server di posta SMTP utilizzato per convalidare nuovi account e inviare notifiche
  # INDIRIZZO SMTP, nome utente e password sono obbligatori
  # ATTENZIONE il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: smtp.zeronet.space
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: noreply@zeronet.space
  DISCOURSE_SMTP_PASSWORD: "xxxxxxx"
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_AUTHENTICATION: login
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@zeronet.space"
  #DISCOURSE_SMTP_DOMAIN: "zeronet.space"

  ## Se hai aggiunto il template Lets Encrypt, decommenta qui sotto per ottenere un certificato SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## L'indirizzo CDN http o https per questa istanza di Discourse (configurato per il pull)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## La chiave dell'indirizzo IP di geolocalizzazione maxmind per la ricerca dell'indirizzo IP
  ## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Il container Docker è stateless; tutti i dati sono memorizzati in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Qualsiasi comando personalizzato da eseguire dopo la compilazione
run:
  - exec: echo "Inizio dei comandi personalizzati"
  ## Se desideri impostare l'indirizzo email 'Da' per la tua prima registrazione, decommenta e modifica:
  ## Dopo aver ricevuto la prima email di registrazione, ri-commenta la riga. Deve essere eseguita solo una volta.
  - exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
  - exec: echo "Fine dei comandi personalizzati"

La risposta è stata collegata sopra. Hai bisogno di qualcosa del genere.

4 Mi Piace

Questo ha risolto i problemi con il rilevamento dell’IP (ora tutto funziona normalmente) ma ora alcune immagini non vengono caricate

MODIFICA: questo era un problema di cache, ora funziona tutto! Grazie a tutti!

2 Mi Piace

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.