Indirizzo IP reale per Apache, Amazon ELB, CloudFlare (X-Forwarded-For)
da Massimo Della Rovere · pubblicato il 21 ottobre, 2017 · modificato il 21 ottobre, 2017

Apache come tutti gli altri web server ha un sistema di log in cui memorizza le informazioni che riguardano gli accessi degli utenti verso le nostre pagine web, in queste informazioni è contenuto l’indirizzo IP, un’informazione molto utile per diversi scopi. Purtroppo con i servizi moderni per il bilanciamento del traffico e la protezione DDOS questa informazione non sempre risulta esatta e i nostri log non riportano gli indirizzi IP corretti. In questo articolo vedremo una tecnica per poter risolvere questa limitazione in modo rapido e semplice.

Introduzione

Il server Apache nella sua configurazione di base esegue una funzione molto semplice, prende l’indirizzo IP di chi esegue la richiesta e lo memorizza nei file di LOG, purtroppo con i nuovi sistemi di difesa e di bilanciamento le cose si sono complicate e non è più il visitatore che si connette al nostro web server ma sono una serie di server che filtrano le richieste dei client per poi eseguire a loro volta gli accessi diretti al nostro server (funzioni di proxy), in questo modo finiamo per memorizzare gli indirizzi IP dei server proxy e no quello del navigatore.

Soluzione

Per risolvere il problema ci viene incontro un modulo standard di apache chiamato remoteip, attivando questo modulo, configurando il file di configurazione e modificando il comando per il logging di apache possiamo ripristinare il corretto funzionamento dell’indirizzo IP di origine anche se usiamo un servizio come quello di Amazon ELB o CloudFlare.

Creazione configurazione: prima di avviare il modulo dobbiamo creare un file di configurazione nella directory /etc/apache2/mods-available/ chiamato remoteip.conf, il quale dovrà contenere i seguenti comandi. Ho messo quello che serve, in realtà è possibile essere più restrittivi, per maggiori informazioni andate sulla documentazione ufficiale del modulo.

<IfModule mod_remoteip.c>
    RemoteIPHeader X-Forwarded-For
</IfModule>

Una volta creato il file di configurazione verificate se i permessi sono corretti. Con ubuntu ho usato il comando (vi) preceduto da sudo e non ho dovuto fare nessuna altra modifica.

Attivazione del modulo: il modulo remoteip risulta già installato con la versione base di apache quindi non bisogna aggiungere nessun software, almeno sulla versione 2.4 ho verificato questo, non so se sulle versioni precedenti le cose sono diverse e se il modulo già esisteva.

sudo a2enmod remoteip

Una volta attivato il modulo i file di caricamento e il nostro file di configurazione saranno linkati nella directory /etc/apache2/mods-enabled/ e saranno letti al prossimo avvio di apache.

Modifica formato del log: Apache può scrivere il log in modo personalizzato rispettando dei comandi e delle variabili che vengono inserite nella direttiva LogFormat, quindi cercate questa stringa sulla vostra configurazione e cambiate la variabile %h con %a.

LogFormat ”%h %l %u %t \”%r\” %>s %b” common // Originale
LogFormat ”%a %l %u %t \”%r\” %>s %b” common // Stringa modificata

Normalmente la direttiva si trova sul file apache2.conf o sui file di configurazione dei virtual host presenti nella directory /etc/apache2/sites-available/.

Riavviare Apache: adesso che avete eseguito tutte le operazioni indicate è arrivato il momento di riavviare il server web e controllare nei log se viene specificato l’indirizzo IP corretto.

sudo service apache2 restart

Per qualsiasi consiglio o problema che riscontrate nella procedura scrivete pure nei commenti presenti in fondo a questo articolo e vi risponderò il prima possibile. Alla prossima.

Guida completa su AWS

Questo articolo appartiene ad una serie di pubblicazioni che costituiscono una guida completa dedicata agli Amazon Web Services. Molti servizi che trattiamo in questo blog vengono anche spiegati con dei video che trovate nel nostro canale youtube. Se volete seguire questo percorso didattico iscrivetevi alla community Cloud AWS.

1 Commento

  1. Io usavo i comandi SetEnv per impostare una variabile indirizzo in base all'esistenza del FORWARD però avevo dei problemi in alcuni casi, con questo metodo la cosa è molto più semplice, oltretutto non sapevo che il modulo remoteip era installato di default su apache.

condividi