Lorsque l'on met en place un reverse proxy, l'adresse ip du visiteur est remplacée par celle du reverse proxy.
C'est dommage pour les logs, pour les authentifications, mais aussi pour une géolocalisation.
En PHP, REMOTE_ADDR contiendra toujours l’adresse IP du proxy.
Il est possible de récupérer l'adresse IP réelle en utilisant le module rpaf de Apache.
Mise en place :
- Notre reverse proxy est appelé
serveur A
- Notre serveur d'application sur notre réseau interne
serveur B
Configuration du reverse proxy (serveur A) :
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://www.server_b.com/
ProxyPassReverse / http://www.server_b.com/
Configuration à réaliser sur le serveur B :
1) Installation du module :
aptitude install libapache2-mod-rpaf
Le module est automatiquement configuré avec
l’adresse IP comme adresse de reverse proxy.
Il faut modifier cette valeur dans le fichier :
/etc/apache2/mods-enabled/rpaf.conf. Il suffit de remplacer devant
RPAFproxy_ips le 127.0.0.1 par l’adresse IP de votre reverse proxy (serveur A).
Dans
le cas, où il y aurait plusieurs adresses IP de reverse proxy, vous
devez séparer les adresses IP par un espace.
Il faut ensuite redémarrer apache :
/etc/init.d/apache reload
C'est tout !!!
Vos logs et les valeurs récupérer dans vos sites contiennent la bonne ip !
Vous pouvez vérifier en faisant en php la commande :
echo $_SERVER["REMOTE_ADDR"];
Et si votre serveur B est sous TOMCAT ?
Si le serveur B est sous tomcat c'est un peu plus compliqué, il va falloir ruser.
Après avoir cherché longtemps, voici la méthode qui fonctionne chez moi :
1. Téléchargez le jar suivant et copiez-le dans le $TOMCAT_HOME/lib
http://xebia-france.googlecode.com/files/xebia-tomcat-extras-1.0.0.jar (
http://xebia-france.googlecode.com/files/xebia-tomcat-extras-1.0.0-sources.jar)
2. Modifiez le fichier server.xml :
<Valve
className="org.apache.catalina.connector.RemoteIpValve"
internalProxies="192\.168\.20\.126"
remoteIPHeader="x-forwarded-for"
protocolHeader="x-forwarded-proto"
/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="%{X-Forwarded-For}i %l %u %t %r %s %b %{User-Agent}i
%{Referer}i" resolveHosts="false" / >
3. Rédémarrer Tomcat : vous pouvez accéder à l'adresse ip réelle par
servletRequest.getRemoteAddr()
C'est tout :)