mardi 18 février 2014

Récupérer l'adresse IP réelle d'un internaute malgré un proxy avec le module apache RPAF

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 :)

Aucun commentaire:

Enregistrer un commentaire