Apache2 : récupérer les IP derrière un reverse proxy

Par défaut, lorsqu’Apache se trouve derrière un reverse proxy, l’adresse source telle qu’il la voit est celle du reverse. Donc 127.0.0.1 ou ::1 si le reverse est en local. Si votre applicatif a besoin de récupérer les ip, c’est l’adresse qu’il verra (exemple $_SERVER['REMOTE_ADDR'] en php… Pas très pratique donc.

Il existe bien entendu des headers spécifiques que les reverses ajoutent (ou peuvent ajouter) pour indiquer l’ip source de la requête. Il faut cependant indiquer à Apache2 de le prendre en compte. Voyons comment faire cela.

Deux en-tête HTTP sont utilisées pour transmettre cette information. Il s’agit de X-Real-IP et de X-Forwarded-For. Peu de doc au sujet de la première est dispo sur le web. D’après ce que j’en comprends, X-Forwarded-For peut contenir plusieurs ip si la requête est forwardé plusieurs fois, tandis que X-Real-IP a plutôt vocation à contenir l’ip d’origine (mais une fois de plus, vu le peu de doc dispo, je m’abstiendrai d’être trop affirmatif).

Quoi qu’il en soit, les deux sont souvent renseignés et, dans le cas où l’on a la maîtrise du reverse, on le configure bien comme on l’entend.

Pour le petit exemple, dans NGINX, ma conf est la suivante :

location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass  http://localhost:8080;
    proxy_pass_header Content-type;
}

Apache peut donc lire l’ip d’origine depuis n’importe laquelle des deux deux en-tête. Pour se faire, à partir d’Apache 2.4 nous utiliserons le mod_remoteip. Ce module permet simplement d’indiquer à Apache de prendre en compte l’une des en-têtes précitées comme ip d’origine.

On commence par activer le module, puis on spécifie sa configuration car il n’en possède pas d’office. Enfin, on fini par charger la configuration et on redémarre le serveur. Easy!

# active le mode remoteip
a2enmod remoteip

# dans /etc/apache2/conf-available/remoteip.conf
# on utilise ici X-Forwarded-For 
# libre à vous de remplacer par X-Real-IP
RemoteIPHeader X-Forwarded-For

# ici les adresse distantes auxquelles on fait confiance pour présenter une valeur RemoteIPHeader
RemoteIPTrustedProxy 127.0.0.1 ::1

# on charge la conf nouvellement créée
a2enconf remoteip

# on redémarre apache pour que tout soit pris en compte
service apache2 restart

Et voilà, sans plus d’effort, Apache prend maintenant automatiquement en compte la vraie source des requêtes au lieu de celle de votre proxy !

Déjà 2 réponses, rejoignez la discussion !

    • Buzut

      dit :

      Yes exactement. Je cherchais justement récemment à mettre cela en place et toute la doc que je trouvais concernait rpaf… qui ne fonctionne pas avec Apache >= 2.4
      Voilà donc ma pierre à l’édifice pour ceux qui chercheront à faire de même :)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *