Nginx : récupérer les Ip derrière haproxy

Depuis que j’utilise let’s encrypt pour mes certificats la gestion de nginx en reverse proxy devient de plus en plus fastidieuse. Tous mes certificats sont éparpillés sur différents container lxc ce qui m’oblige à réaliser des opérations manuelles à chaque renouvellement. De ce fait impossible d’utiliser un script de renouvellement automatique et cela implique d’autres problèmes. C’est pourquoi j’ai décidé de déployer un vrai reverse proxy avec Haproxy qui m’a été chaudement recommandé par un ami.

J’ai récupéré cette configuration que j’ai adapté à mon infrastructure. Tout fonctionne à merveille depuis quelques mois. Je génère mes certificats directement du serveur concerné sans me soucier du reverse proxy. Mais je me suis aperçu en consultant les logs et mon piwik, que toutes les requêtes portaient l’ip locale du container qui héberge Haproxy.

Au final il s’avérait que ma configuration n’était pas complète, il manquait quelques paramètres sur haproxy et surtout configurer nginx en mode « real ip ».

Nginx

Le mode real ip n’est pas vraiment un mode mais plutôt un module qui doit être activé à la compilation de nginx. Pour le vérifier.

sudo nginx -V

Il faut ensuite chercher la ligne –with-http_realip_module, si elle est présente le module real ip est disponible. Pour info la version de nginx fournit par les dépôts officiels debian est déjà compilée avec le module. Il ne reste plus qu’à l’activer et le configurer.

sudo nano /etc/nginx/nginx.conf

On ajoute les lignes suivantes.

## #real ip mode ## set_real_ip_from 192.168.xxx.xxx; real_ip_header proxy_protocol; real_ip_recursive on;

Petite explication de texte :

- set_real_ip_from : Définit l’adresse de confiance celle du reverse proxy. - real_ip_header : Définit le champ d’en-tête de la requête dont la valeur sera utilisée pour remplacer l’adresse du client. - real_ip_recursive : Remplace la dernière adresse utilisée par une nouvelle.

Sur chaque Vhost concerné je rajoute le paramètre proxy_protocol comme indiquer :

sudo nano /etc/nginx/site-available/monsite

server { .... listen 80 proxy_protocol; ... } server { ... listen 443 ssl proxy_protocol; ... }

A partir de là nginx est capable d’afficher les IP réelles de chaque visiteurs.

Haproxy

La configuration de Haproxy est très simple il suffit de rajouter les directives suivantes :

send-proxy check check-ssl verify none

Par exemple pour que piwik affiche les IP réelles pour les visiteurs du blog :

 server blog 192.168.x.x send-proxy check check-ssl verify none weight 0

Je redémarre les deux services :

sudo systemctl restart haproxy sudo systemctl restart nginx

Maintenant chaque requête effectuée sur mes serveurs  est affichée avec sa véritable IP et non celle du reverse proxy.