ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2015:08:20:apache_2.4_avec_les_modules_rpaf_et_remoteip

Apache 2.4 avec les modules rpaf et remoteip

Le module “rpaf” ne fonctionne plus exactement comme avant la version d'Apache 2.4 (qui vient avec Jessie).

~~READMORE~~

Mise en situation

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.

Apache2 2.4

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

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 ???

solution 1

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.

solution 2

( 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 ?

Sources

blog/2015/08/20/apache_2.4_avec_les_modules_rpaf_et_remoteip.txt · Dernière modification : 2015/08/20 14:40 de thierry