X-Forward est un header HTTP qui permet de conserver l’adresse IP d’origine des requêtes HTTP lors du passage à travers des proxy, reverse-proxy, load-balanceurs…
Il faut le configurer au sein des équipements intermédiaires et des serveurs web, et parfois dans les applications.
.
Equipements intermédiaires
Dans varnish, /etc/varnish/default.vcl :
sub vcl_recv { remove req.http.X-Forwarded-For; set req.http.X-Forwarded-For = client.ip; ... }
.
Dans Apache mod_proxy, ajouter :
ProxyPreserveHost On
.
Nginx, dans le vhost du proxy :
location / { proxy_pass http://localhost:8000; proxy_set_header X-Real-IP $remote_addr; }
.
OpenBSD PF :
protocol http { protocol http header append "$REMOTE_ADDR" to "X-Forwarded-For" header append "$SERVER_ADDR:$SERVER_PORT" to "X-Forwarded-By" header change "Connection" to "close" }
.
Dans F5 / Big-IP :
Local Traffic > Profiles > Services > HTTP
Créer / mettre à jour un profile avec l’option « Insert X-Forwarded For » activée et cochée
.
.
Serveurs HTTP
Nginx :
il faut le module realip compilé puis dans /etc/nginx/nginx.conf
# X-Forward set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For;
.
Apache :
Il faut définir un nouveau log_format dans /etc/apache2/apache2.conf
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_proxy
Et indiquer ce mode de log dans les fichiers de config des vhosts :
…
CustomLog ${APACHE_LOG_DIR}/access.log combined_proxy</pre>
.
.
Applications
.
Dans un code en PHP :
$headers = apache_request_headers(); $real_client_ip = $headers["X-Forwarded-For"];