Définition

un reverse-proxy est comme son nom l'indique un proxy à l'envers. Un proxy (ou serveur mandataire) est un logiciel qui se place entre votre navigateur et le web. Il possède divers fonction, de cache, de filtrage, d'authentification, etc... . Un reverse proxy est un logiciel qui se place entre tous les navigateurs et les sites web que vous voulez. Il peut avoir les mêmes fonctions qu'un proxy, mais sont principal intérêt (dans mon cas) est qu'il permet d'avoir sur une IP publique, plusieurs sites web hébergé sur d'autre machines (virtuelles ou non), dans mon cas des VM dans un réseau local privé.

Apache

Mon premier choix va se porté naturellement vers apache. Je dis naturellement car apache possède tous ce qu'il faut pour çà et dès qu'on parle de site web, je pense tout de suite à apache ; de plus c'est généralement un apache qui sert le service web sur la machine virtuelle. il faut chargé le module mod_proxy (commande a2enmod mod_proxy)

le seul problème avec apache en tant que reverse-proxy c'est la configuration, exemple de configuration d'un proxy :

<VirtualHost *:80>
ServerName NOMDNS
ProxyRequests Off

<Proxy *> AuthType Basic AuthName "Banière d'authentification" AuthUserFile /etc/apache2/passwords Options Indexes FollowSymLinks AllowOverride AuthConfig Require valid-user Order deny,allow Allow from all </Proxy>

ProxyPass /wiki/ http://192.168.0.20/ ProxyPassReverse /wiki/ http://192.168.0.20/ CustomLog /var/log/apache2/access_wiki.log combined
</VirtualHost>

De plus, si je veut aussi que mon site soit accessible en https il faut aussi que je rajoute une autre config :

NameVirtualHost *:443 <VirtualHost *:443>
ServerName NOMDNS
SSLEngine On
SSLCertificateKeyFile ssl/apache.pem
SSLCertificateFile ssl/apache.pem
ProxyRequests Off

<Proxy *>
AuthType Basic
AuthName "Banière d'authentification"
AuthUserFile /etc/apache2/passwords
Options Indexes FollowSymLinks
AllowOverride AuthConfig
Require valid-user Order deny,allow
Allow from all
</Proxy>


ProxyPass /wiki/ https://192.168.0.20/
ProxyPassReverse /wiki/ https://192.168.0.20/
CustomLog /var/log/apache2/access_wiki_https.log combined
</VirtualHost>

j'ai longtemps fonctionné avec cette configuration mais le fait de devoir maintenir 1 vhost proxy plus 1 vhost sur la machine applicative est lourd (en fait c'est la syntaxe d'apache qui est lourde).

lighttpd

Lighttpd fait aussi serveur reverse-proxy avec une config plus light (d'ailleurs la configuration de lighttpd me parait de plus en plus sympathique et naturel), un petit extrait de ce blog : https://blog.misc.ephaone.org/archives/reverse_lighty.html :

conf : $HTTP"host" =~ "NOMDNS" {

proxy-core.protocol = "http"
proxy-core.balancer = "carp"
proxy-core.backends = ( "192.168.0.20:80" )

} $SERVER"socket" == ":443" {

      protocol = "https://"
ssl.engine    = "enable"
ssl.pemfile   = "/etc/lighttpd/lighttpd.pem"

}

Je n'ai pas testé cette configuration, car même si je la trouve plus simple que celle d'apache j'ai trouvé mieux entre temps.

squid

Enfin mieux a mon sens, j'ai déjà utilisé squid au travail pour faire un proxy local chaînant sur un proxy authentifiant (comme ça je n'ai pas besoin de mettre de mot de passe à chaque connexion internet). Et un article sur le planet-libre m'a paru intéressant.  Même si je ne veut pas mettre 2 squid sur un même serveur (je préfère garder le principe d'une VM par service), la mise en place de squid comme reverse proxy est indiqué.

squid avec https

Mieux encore (enfin...) on peut utiliser squid3 en reverse proxy pour n'écouter que sur le port https, ou sur le port https et http, et redirigé tout le trafic vers un couple adresseip/port défini. Plusieurs avantage : si une application web (genre ajaxterm, mldonkey, webmin) ne sait parler que sur un port non standard, on peut redirigé vers ce port là toutes les connections https. Et voila une application qui ne sait pas parler ssl se trouve sécurisé et prêt a fonctionner a travers internet (à vos risques et péril).

Debian et squid

Squid est dans les dépots de debian, le seul problème c'est qu'il n'est pas présent avec le support de ssl... il faut donc le compiler depuis le paquet source

vous trouvez un howto pour compiler squid avec ssl depuis un paquet debian sur cette page

voila la méthode que j'ai utilisé :

#pré-requis : etre sur d'avoir les depots deb-src dans /etc/apt/sources.list
apt-get update apt-get install libssl-dev devscripts build-essential fakeroot libcppunit-dev libsasl2-dev cdbs
apt-get source squid3
apt-get build-dep squid3
vi squid3*/debian/rules #rajouter --enable-ssl \ à la variable DEB_CONFIGURE_EXTRA_FLAGS :=
cd squid3*
debuild -us -uc

Configuration de squid en reverse proxy :

dans le fichier /etc/squid3/squid3.conf :

#Configuration du reverse proxy squid 80/443
#le nom que l'on vera sur la page d'erreur de squid (entre autre)
visible_hostname frontal-web
#les ports sur lequel il écoute vhost etant là pour indiquer qu'il se base sur le nom DNS pour acheminé le requete
http_port 80 vhost https_port 443 cert=/etc/squid3/openid.crt key=/etc/squid3/openid.key vhost
#La configuration des services web sera faite dans un fichier indépendant pour chaque service dans le répertoire ci dessous :
include /etc/squid3/conf.d/*.conf

Configuration de d'un service web :

la configuration d'un service web dans squid est simple et tiens en 4 lignes et peut etre mis dans le fichier squid3.conf ou dans un autre fichier .conf du même répertoire

Contenu de /etc/squid3/conf.d/vhost1.conf :

cache_peer $IPAPPLIWEB parent $PORTAPPLI 0 no-query login=PASS originserver name=$NOMDNSAPPLI
acl vhost1 dstdomain $NOMDNSAPPLI
cache_peer_access $NOMDNSAPPLI allow vhost1
http_access allow vhost1

avec $IPAPPLIWEB = l'adresse ip sur le lan du serveur web
$PORTAPPLI = le port d'ecoute (80 pour les appli standard)
$NOMDNSAPPLI =  l'url de la ressource.

L'inconvénient avec cette méthode c'est qu'on doit mettre en place un DNS et qu'on ne peut pas avoir une url avec des sous répertoires (mais ca me convient bien).

Pour plus d'informations sur les options des fichiers de configuration de squid voir la documentation officielle