Quelques jours après avoir installé Varnish comme reverse proxy devant Apache, je me suis aperçu que tous les commentaires du site étaient enregistrés avec l’adresse IP 127.0.0.1.
Même problème dans les logs Apache : au lieu de voir l’adresse IP réelle du visiteur, je voyais uniquement l’adresse du reverse proxy.
127.0.0.1 - - [14/May/2011:08:54:47 +0200] "GET / HTTP/1.1" 200 12345Langage du code : JavaScript (javascript)
C’est logique : Apache ne reçoit plus directement la requête du visiteur. Il reçoit la requête depuis Varnish. Pour Apache, le client immédiat est donc Varnish, souvent en 127.0.0.1, ::1 ou sur une IP privée.
Pour retrouver la véritable IP du visiteur, il faut que le reverse proxy transmette cette IP dans un header HTTP, puis qu’Apache fasse confiance à ce header uniquement lorsqu’il provient d’un proxy connu.
Pourquoi Apache voit l’adresse du reverse proxy
Dans une architecture classique sans reverse proxy, le visiteur se connecte directement à Apache :
Visiteur → Apache
Apache voit donc l’IP du visiteur.
Avec Varnish, l’architecture devient :
Visiteur → Varnish → Apache
Apache voit alors l’IP de Varnish, car c’est Varnish qui établit la connexion vers Apache.
La vraie adresse du visiteur doit donc être transmise dans un header, le plus souvent :
X-Forwarded-For: 203.0.113.42Langage du code : CSS (css)
Varnish documente justement l’usage de X-Forwarded-For pour transporter l’adresse IP du client initial vers le backend.
Ancienne méthode : mod_rpaf
À l’époque, la solution consistait à installer mod_rpaf, pour Reverse Proxy Add Forward :
apt-get install libapache2-mod-rpaf
a2enmod rpafLangage du code : JavaScript (javascript)
Puis à configurer le module ainsi :
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-ForLangage du code : CSS (css)
Cette solution fonctionnait, mais elle n’est plus celle que j’utiliserais aujourd’hui sur Apache 2.4.
La méthode moderne consiste à utiliser le module officiel mod_remoteip.
Solution moderne : utiliser mod_remoteip
mod_remoteip permet à Apache de remplacer l’adresse IP apparente du client par l’adresse fournie dans un header comme X-Forwarded-For, à condition que la requête provienne d’un proxy déclaré comme fiable.
La documentation Apache explique que le module remplace l’adresse IP originale du client par l’adresse utilisateur présentée dans un header de requête, configuré avec RemoteIPHeader.
On active d’abord le module :
sudo a2enmod remoteip
On crée ensuite un fichier de configuration dédié :
sudo nano /etc/apache2/conf-available/remoteip.conf
Pour un Varnish local, ajoutez :
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1
RemoteIPTrustedProxy ::1Langage du code : CSS (css)
Activez ensuite la configuration :
sudo a2enconf remoteip
Testez Apache :
sudo apachectl configtest
Puis rechargez Apache :
sudo systemctl reload apache2
À partir de là, Apache peut utiliser la vraie IP du visiteur, transmise par Varnish via X-Forwarded-For.