Reverse proxy

Depuis la version 2.2 d’Apache, une fonctionnalité très intéressante est apparue. Il s’agit du module de reverse proxy. Celui-ci permet de définir un serveur Apache comme forwardant des requêtes HTTP vers un autre serveur, par exemple local. Ceci permet notamment de cacher vos sites derrière un ou plusieurs serveurs web frontaux, répondant à une problématique de sécurité. Nous allons ici voir comment se configure le reverse proxy.

Cette manière de fonctionner permet ainsi de pouvoir changer de serveur à chaud par exemple dans le cas d’une maintenance ou d’un upgrade de site (avec deux machines différentes). Ceci permet également dans le cas d’une attaque web de protéger le transit de données en protégeant le contenu derrière plusieurs passerelles et pare-feu (seul le serveur web peut aller sur le site proxifié).

Prérequis

Vous devez au préalable activer/installer le module _modproxy, _mod_proxyhttp, _mod_proxyftp (si vous forwardez du trafic FTP), _mod_proxyconnect (pour le trafic HTTPS), _mod_proxyajp (serveurs tomcat), _mod_proxybalancer (load balacing de serveurs), _modheaders (pour modifier les en-têtes forwardés), _moddeflate (compression), _mod_proxyhtml (réécriture).

A vous de voir quoi activer. Nous nous contenterons de HTTP et HTTPS dans l’immédiat.

Configuration simple

La configuration d’un reverse proxy se fait dans la configuration d’un VirtualHost. Vous pouvez définir qu’un répertoire se situe sur un autre serveur, ou bien encore toute la base de votre site. Voici le template de base d’un VirtualHost en reverse proxy

<Virtualhost *:80>
      ServerName publicserver.domain.tld
      ServerAlias publicserver.domain.tld
      ProxyRequests off
      ProxyPass / http://localserver.local/
      ProxyPassReverse / http://localserver.local/
</Virtualhost>

Attention: n’oubliez pas le / à la fin de l’URL vers laquelle vous redirigez, sinon il est probable que vous soyez vulnérable à une faille de type proxy bypass.

Lorsqu’un client va se connecter sur l’adresse publicserver.domain.tld, il sera envoyé sur l’Apache frontal qui ira chercher les données demandées sur le serveur connu localserver.local. Le serveur localserver.local peut être une adresse DNS locale non connue du net ou une adresse IP non routable sur le net (conseillé dans une optique de sécurité).

Configuration générique

Voici une petite configuration très intéressante qui permet de rediriger l’ensemble des requêtes vers something.domain.tld vers something.local. Il faut au préalable activer le mod_rewrite d’Apache. Ceci permet de cacher facilement tous vos sites vers un ensemble de serveurs locaux (site1.domain.tld vers site1.local, site2.domain.tld vers site2.local).

<VirtualHost *:80>
  ServerName server.domain.tld
  ServerAlias *.domain.tld
  Rewriteengine On
  ProxyRequests off
  RewriteCond %{HTTP_HOST} (.*).domain.tld
  RewriteRule (.*) $1 [E=WHERETO:%1.local]
  ProxyPassReverse / <a>http://%{ENV:WHERETO}/</a>
  RewriteRule ^/(.*) <a>http://%{ENV:WHERETO}/$1</a> [P]
</VirtualHost>

Nous vous déconseillons d’utiliser cette configuration bien qu’elle permette d’administrer facilement un ensemble de serveurs proxifiés locaux.

See Also