14/11/2024

Apache

Mise en place d’un Reverse Proxy Apache avec mod_proxy

I. Présentation

Aujourd'hui nous allons étudier la mise en oeuvre d'Apache en tant que reverse proxy en premier-plan (Front-end) d'un autre serveur apache qui sera lui l'arrière-plan (back-end). Nous utiliserons pour cela le module mod_proxy et mod_proxy_http d'Apache. Nous allons juste chercher à rediriger les flux arrivant sur un serveur en destination d'un certain nom de domaine vers un serveur situé plus en amont dans l'architecture. Nous ne prendrons pas ici les sujets de répartition de charge ou de Load-Balancing que peut effectuer le rôle de reverse proxy. Le système de reverse proxy peut ici être schématisé comme suivant  :RProxy01

On a donc un premier serveur en front-end qui reçoit l'ensemble des requêtes et plusieurs serveurs web back-end qui contient chacun un site web différent (ou le même dans le cadre d'une répartition de charge). On va donc configurer le serveur reverse proxy pour rediriger chaque requêtes en fonction de l'URL et du contenu demandé. Cela peut s'opérer par dossier (rediriger juste /image vers un serveur spécifique par exemple) ou pour une URL complète, ce que nous allons voir ici.

II. Architecture

Pour illustrer la mise en place de notre reverse proxy Apache dans ce tutoriel, nous suivrons le schéma suivant :

RProxy02

 

J'ai donc un premier serveur avec l'IP publique 192.168.1.12 qui va recevoir l'ensemble des requêtes des clients. Il contient le www.site1.tuto. J'ai ensuite un second serveur qui lui contient le site www.site2.tuto. Nous allons donc configurer notre premier serveur Reverse Proxy afin qu'il redirige les requêtes www.site2.tuto par le second serveur, remplissant ainsi son rôle de reverse proxy. En revanche il continuera de répondre aux requêtes pour www.site1.tuto, ceci pour illustrer le fonctionnement pour un site normal et site utilisant un reverse proxy.

Je pars ici du principe que les machines sont en place au niveau OS, réseau et ont un service Apache fonctionnel avec un site web par machine répondant chacun aux bonnes URL.

III. Installation et configuration

Nous allons dans un premier temps activer le proxy_http sur le serveur reverse proxy. Celui-ci est le module mod_proxy spécifique au protocole HTTP avec lequel nous travaillons ici. Pour cela, on saisi la commande suivante :

a2enmod proxy_http

Le module "proxy" devrait s'activer en même temps :

RProxy03

On va ensuite redémarrer apache2 pour que les modules soient actifs :

service apache2 restart

Nous allons maintenant créer deux hôtes virtuels. Un qui dirigera les requêtes site1.tuto vers le contenu local, un autre qui aura le rôle du reverse proxy et qui dirigera les requête site2.tuto vers le second serveur avec une configuration standard.

touch /etc/apache2/sites-avaliable/site1.tuto
touch /etc/apache2/sites-avaliable/site2.tuto

On va maintenant remplir ces configurations, je mets volontairement uniquement les informations nécessaires pour garder l’essentiel en vu :

Voici la configuration du site1.tuto

< VirtualHost *:80 >
        ServerName www.site1.tuto
        DocumentRoot /var/www/site1
< /VirtualHost >

Voici la configuration du site2.tuto qui est celui sur lequel agira le reverse proxy :

< VirtualHost *:80 >
        ServerName www.site2.tuto
        ProxyPreserveHost On
        ProxyRequests On
        ProxyPass / http://192.168.248.131/
        ProxyPassReverse / http://192.168.248.131
< /VirtualHost >

Puis on pourra les activer :

a2ensite site1.tuto
a2ensite site2.tuto

On peut maintenant recharger la configuration d'Apache2 :

service apache2 reload

On va maintenant passer à la période de test.

Note : A ce stade, il faut également vérifier que les sites testés (ici site1.tuto et site2.tuto) soient bien résolus au niveau DNS pour amener ver le premier serveur ayant le rôle de reverse proxy.

Pour cela il suffit simplement d'aller sur chacun des deux sites, le plus important étant bien sûr d'avoir une réponse du second serveur qui se situe derrière le reverse proxy :

RProxy04

Nous avons donc un serveur reverse proxy en place.

IV. Aller plus loin

Pour aller plus loin, il est commun de trouver sur ce genre de serveur des fonctionnalités avancées de sécurité ou de cache. On peut par exemple utiliser le module de cache d'Apache pour alléger la charge des serveurs. On trouve également souvent le module mod_security qui permet de filtrer les requêtes et de les bloquer si elles semblent porter atteinte à la sécurité des sites web. De plus, on utilise souvent le reverse proxy pour des fonctions de répartition de charge et de load-balancing que nous verront probablement dans d'autres tutoriels 😉

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

9 commentaires sur “Mise en place d’un Reverse Proxy Apache avec mod_proxy

  • Revoir un peu les schémas, la notion d’ip publique/privée…

    Après l’article est sympa pour de la vulgarisation.

    Répondre
  • Bonjour,

    Une chose importante a ajouter pour le cas ou la liaison clientproxy est en https, c’est la possibilité pour le site web situé en aval du reverse proxy de savoir avec quel protocole il a été appelé (Par exemple pour générer correctement ses liens et éviter le mélange http/https)

    c’est

    RequestHeader set X-Forwarded-Proto "https" early

    Ce paramètre rajoutera les entêtes http nécessaire.

    c’est à dire:
    HTTP_X_FORWARDED_SERVER => l’url appellée
    HTTP_X_FORWARDED_PROTO => le protocole utilisé
    HTTP_X_FORWARDED_FOR => l’ip du client

    En tout cas merci pour cet article et d’une façon pour ce site, excellent.

    Cordialement
    Dominique

    Répondre
    • Merci pour le complément d’information Dominique ! 🙂

      Répondre
  • Merci pour l’article vraiment excellent travail,
    J’aurai besoin de votre expertise sur un sujet similaire:
    j’ai le même environnement cad un serveur apache2 en reverse-proxy et en mode SSL/TLSv1 front-end, et 2 serveurs apache2 back-end. l’authentification est via une carte à puce(gérer par un middleware) , sachant que je dispose d’un server de logs , je souhaite faire des redirections vers une page personnalisée en cas d’échec/certificat révoqué de connexion ssl au niveau front;
    j’ai déjà utilisé une solution SSLVerifyClient optional mais ça n a pas marché. ma question y a t il une autre alternative??
    merci d’avance

    Répondre
  • Bonsoir et merci pour ce tuto !

    Une petite précision qui évitera peut-être à d’autres de rencontrer le même problême que moi :

    la commande a2ensite ne fonctionne pas si le fichier contient deux points dans son nom (service.domaine.fr par exemple).

    J’ai résolu ce problème en renommant simplement mon fichier en service.conf, respectant ainsi les standard de nommage de ces fichiers sur Debian.

    Bonne continuation.

    Nicolas.

    Répondre
  • Salut,
    Merci pour le tuto il est exelent comment tout le reste =)

    Tu sais comment faire quand on veux que la redirection viens apres le /
    je m’explique :
    au lieu d’avoir site1.com et site2.com
    J’ai 0.0.0.0/service1 et 0.0.0.0/service2 qui redirige respectivement sur le service 1 et 2.

    Répondre
  • bonjour
    commet je peut configurer le serveur apache avec le serveur iis . comme reverse proxy

    Répondre
  • Bonjour

    Avec le reverse proxy, le site2.tuto est donc accessible depuis le reverse proxy et le site2.tuto lui même ?

    cdt

    Répondre
  • L’article est très ancien mais vous devriez vraiment retirer cette directive :
    ProxyRequests On
    C’est un danger ÉNORME puisque cela revient à créer un proxy ouvert.

    Répondre

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.