Le module “rpaf
” ne fonctionne plus exactement comme avant la version d'Apache 2.4 (qui vient avec Jessie).
~~READMORE~~
J'ai un proxy “nginx
” entre les Internets et les serveurs Apaches.
Par défaut, les serveurs Apaches ne devraient voir que l'IP du proxy comme celle du client, dans la variable d'environnement “REMOTE_ADDR
” et aussi dans les logs.
Exemple:
192.168.0.4 - - [15/Aug/2015:14:22:44 +0200] "GET /cgi-bin/hackme.py HTTP/1.0" 200 839 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/34.0" 192.168.0.4 - - [15/Aug/2015:14:22:45 +0200] "GET /cgi-bin/hackme.py HTTP/1.0" 200 839 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/34.0"
( Dans cet exemple, “192.168.0.4
” est l'adresse IP de mon proxy. )
Mais ce n'est pas ce qu'on veut généralement: on veut l'IP du vrai client dans la variable “REMOTE_ADDR
” et dans les logs.
C'est là qu'intervient le module “rpaf
”.
Il faut configurer dans le fichier /etc/apache2/mods-available/rpaf.conf
, en mettant dans mon cas:
<IfModule rpaf_module> RPAFenable On RPAFsethostname On RPAFproxy_ips 192.168.0.4 </IfModule>
Normalement, cela fonctionne parce que “nginx
” ajoute un header “X-Forwarded-For
” contenant la *vraie* adresse IP du client.
Et donc, les logs et “REMOTE_ADDR
” contiennent la *vrai* IP du client, et non pas du proxy intermédiare.
Mais voila: avec “Apache2 2.4
” , le “REMOTE_ADDR
” reste désespérément avec l'IP du Proxy !!!!
“Google
” ne m'aide pas trop, mais je découvre qu'un nouveau module vient avec Apache: remoteip
Après avoir désactivé “rpaf
” :
# a2dismod rpaf
Je prépare la conf de “remoteip
” :
# cd /etc/apache2/mods-available
Dans le fichier (que je créé) “remoteip.conf
” :
<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 192.168.0.4 </IfModule>
Activer le module:
# a2enmod remoteip
Et hop:
# apache2ctl graceful
Et maintenant: le “REMOTE_ADDR
” est correct, mais pas les logs !!!! ARRRRRRRRRRRGH !
On remarque aussi que l'entête “X-Forwarded-For
” disparaît … Pourquoi ???
Ma préférence:
Désactiver définitivement “rpaf
”.
# a2dismod rpaf
Faire en sorte que la conf de “remoteip.conf
” utilise l'entête “X-Forwarded-For
” .
Par exemple (adapté selon vos besoins) :
<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 127.0.0.1 </IfModule>
Activer le module “remoteip
” (si pas déjà fait)
# a2enmod remoteip
Modifier le format des logs !!
Dans mon cas, j'utilise le format “Combined” qui est décrit dans le fichier “apache2.conf
”.
Je transforme:
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
en:
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
( le “%a
” remplace le “%h
” )
Redémarrer Apache:
# apache2ctl graceful
Le “REMOTE_ADDR
” est cohérent et les logs aussi.
( Préférer la solution 1 , même si aucune des solutions ne me convient totalement )
En dehors de refaire un 3ieme module , on peut combiner les 2 modules.
Mais , le module “remoteip
” ayant la bonne idée de supprimer l'entête qu'il traite, il faut définir un nouvel entête dans la conf de Nginx !!!!!!
Donc, dans la conf de nginx je fais en sorte d'avoir 2 entêtes qui donnent la adresse IP:
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
On re-active rpaf
avec la même conf qu'initialement (revoir plus haut).
# a2enmod rpaf
Et on change la conf du “remoteip
” pour avoir:
... RemoteIPHeader X-Real-IP ...
On relance Apache:
# apache2ctl graceful
Voila: 2 modules et chacun son entête.
Maintenant ça remarche: Les logs et le variable “REMOTE_ADDR
” sont corrects.
… to be continued ?