Utiliser Apache comme proxy

Le module mod_proxy d'Apache permet de rendre visible des serveurs Web d'un réseau privé aux clients d'un autre réseau (publique par exemple).

La situation classique est d'avoir un serveur A dans une DMZ et un serveur B dans un réseau privé ; un client venant d'Internet (par exemple) ne pourra pas voir le serveur B et devra passer par A (qui fera office de proxy) pour voir le contenu de B.

 Client ------ Serveur A ------ Serveur B

Cas où le serveur A peut avoir plusieurs enregistrements DNS

Dans ce cas, le serveur A portera 2 noms différents (configuré sur la même IP) et renverra le contenu associé aux noms.

Par exemple : * l'adresse IP de A est 123.456.789.123 * l'adresse IP de B est 192.168.0.1 * 2 noms pointent sur cette adresse : a.exemple.org et b.exemple.org

Si le client demande le contenu de a.exemple.org alors le serveur A renverra le contenu local, si le client demande le contenu de b.exemple.org alors le serveur A servira de proxy et renverra le contenu fournit par B.

Configuration du serveur A

La différenciation se fait sur la directive ServerName. On déclare des hôte virtuel sur l'IP du serveur A, et pour chaque hôte on associe un ServerName différent. Les ServerName doivent être de vrais noms renseigné dans le DNS, avec lesquels un client peut se connecter sur le sevreur A.

NameVirtualHost 123.456.789.123:80

<VirtualHost 123.456.789.123:80>
        ServerName a.exemple.org
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>

<VirtualHost 123.456.789.123:80>
        ServerName b.exemple.org
        ProxyRequests           Off
        ProxyPreserveHost       Off
        ProxyPass              /       http://192.168.0.1/
        ProxyPassReverse       /       http://192.168.0.1/

        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>
</VirtualHost>

Cas où l'on ne souhaite rediriger qu'une partie de l'URL

Dans ce cas l'ensemble du contenu de B sera visible par une URL spéciale, dédié à B, par exemple a.exemple.org/b.

Dans notre exemple : * l'adresse IP de A est 123.456.789.123 * l'adresse IP de B est 192.168.0.1

Configuration du serveur A

NameVirtualHost 123.456.789.123:80
<VirtualHost 123.456.789.123:80>
        ServerName a.exemple.org
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        # Suppresses the Via header
        ProxyVia Off
        ProxyRequests Off
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyPass /b/ http://192.168.0.1/
        ProxyPassReverse /b/ http://192.168.0.1/
</VirtualHost>