Jan 302013
 

Quando si ha un server web dietro un reverse proxy o acceleratore HTTP, come ad esempio Varnish i log del server visualizzeranno l’IP del proxy (di solito 127.0.0.1) anziché l’IP dell’utente finale.
Questo è un problema quando si dispone di un software come webalizer , awstats o simili programma di analisi dei file di log, perché si perde una delle informazioni più importanti: “Chi è il richiedente di una pagina? “, inoltre avendo tutti gli accessi provenienti dallo stesso IP (127.0.0.1) si perdono informazioni come “Qual è il modello di navigazione dei visitatori? “, “Qualcuno sta cercando di fare qualcosa di brutto?”

In questo piccolo how-to vi mostrerò come mettere questa informazione nei vostri file di logs di Nginx in 2 modi diversi.

1) Rendere nginx consapevole del fatto che siete dietro un proxy

Nginx è abbastanza intelligente da avere un modulo dedicato per questa funzione: Real Ip
Questo modulo permette di cambiare l’indirizzo IP del client al valore dell’header della richiesta (es. X-Real-IP o X-Forwarded-For), è utile se nginx funziona dietro proxy di L7 di bilanciamento del carico, e quindi la richiesta proviene da un IP locale, ma il proxy aggiunge un header con IP del client.

La configurazione è molto semplice, basta aggiungere queste 2 righe nel file /etc/nginx/nginx.conf (sezione: http) o direttamente nel vostro file che definisce il virtual host (sezione: server)

set_real_ip_from   127.0.0.1; #Put the Ip of your varnish/proxy here
real_ip_header      X-Forwarded-For; #Put the Header that your varnish/proxy set

E fate ripartire Nginx.
Bisogna anche modificare il file vcl (di solito /etc/varnish/default.vcl ), nella sezione vcl_recv aggiungere questa regola:

set req.http.X-Forwarded-For = client.ip;

E fate ripartire Varnish, questo imposterà l’header X-Forwarded-For correttamente.

Svantaggio:

Questo modulo è di solito non è attivato come impostazione predefinita, è possibile attivarlo ricompilando nginx con l’opzione di configurazione:

--with-http_realip_module

Se si utilizza Nginx da un pacchetto binario verificare la descrizione del pacchetto, o semplicemente eseguire dal teminale nginx -V che darà un output dettagliato come questo:

nginx -V
nginx version: nginx/1.2.6
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-file-aio --with-http_gzip_static_module --with-http_ssl_module --with-ipv6 --without-http_browser_module --without-http_geo_module --without-http_limit_req_module --without-http_limit_zone_module --without-http_memcached_module --without-http_referer_module --without-http_scgi_module --without-http_split_clients_module --with-http_stub_status_module --without-http_ssi_module --without-http_userid_module --without-http_uwsgi_module --add-module=/usr/src/nginx/source/nginx-1.2.6/debian/modules/nginx-echo

in questo esempio il modulo non è integrato nel server web Nginx, quindi questa soluzione non funzionerebbe, passiamo quindi alla soluzione 2:

2) Modificare il formato dei file di log di Nginx

Anche questa soluzione utilizza l’intestazione X-Forwarded-For, quindi è necessario impostare su Varnish come fatto nella prima soluzione affinchè lo configuri. L’idea alla base di questa soluzione è che Nginx ha tutte le informazioni sull’IP remoto, solo in una diversa intestazione, quindi è solo una questione di un uso da parte di nginx di quella variabile nel suo log di accesso al posto della variabile predefinita che definisce l’IP del visitatore.
Modificare quindi il file nginx.conf e nella sezione http aggiungere questa riga:

log_format varnish_log '$http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' ;

È inoltre necessario modificare la direttiva access_log del vostro host virtuale, per fargli utilizzare il formato varnish_log:

access_log /var/log/nginx/access.log varnish_log;

Nota: log_format controlla come nginx registra le richieste, in questo esempio abbiamo aggiunto un nuovo formato di log chiamato “varnish_log”, dove il primo campo è l’intestazione $http_x_forwarded_for e non lo standard $remote_addr, in questo modo potrete registrare correttamente l’IP remoto dei vostri visitatori.

Svantaggio

Se si dispone di molti host virtuali, è necessario cambiare per ognuno di loro la direttiva access_log per utilizzare il nuovo log_format.

Popular Posts:

Flattr this!

  One Response to “Come registrare l’IP corretto avendo Varnish e Nginx”

  1. Hi,

    Thanks that works fine in the access log, but the error log still shows the local host IP. Do you know how I can change that?

    Thanks,

    David

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*