LightcodeSysadmin Open Source

Les reverse proxies

Dans l’article précédent, nous parlions de Squid, un serveur proxy que nous avons utilisé pour faire passer les requêtes du site Internet Youtube par un autre réseau afin d’améliorer son débit. Dans cet article, nous allons voir comment faire un proxy sécurisé sur le port 80 et garder son serveur web sur ce même port.

Introduction

Avant de parler de l’architecture que nous allons mettre en place, nous allons rappeler ce qu’est un proxy. Un serveur proxy a pour rôle de casser la connexion entre un client et le serveur. Un proxy peut être installé avec différents protocoles, nous allons nous concentrer sur les proxies HTTP. Nous allons utiliser deux types de serveurs proxies :

Les reverse proxies : ils sont installés côté serveur. Ils permettent essentiellement de faire du cache, de la répartition de charge ou encore ils permettent de rediriger les requêtes vers d’autres serveurs web. Il existe plusieurs serveurs fonctionnant dans ce mode : Apache, Nginx, Squid, Varnish…

Les forward proxies : ils sont utilisés dans plusieurs cas : soit dans une entreprise, les utilisateurs sont obligés de passer par un proxy pour aller sur Internet. Soit dans les cas où les utilisateurs veulent faire passer le trafic par un autre endroit (comme pour Youtube) ou pour traverser les proxies ou pare-feux un peu trop gênant.

Les forward proxies peuvent être utilisé dans deux cas :

  • Pour faire un proxy “web”, c’est-à-dire que les requêtes vers le serveur proxy sont redirigées vers le bon serveur distant ;
  • Pour faire des requêtes CONNECT qui permettent d’utiliser le proxy pour faire passer d’autres protocoles que le HTTP comme par exemple du SSH.
  • Dans les entreprises, ils sont également utilisés pour faire du filtrage.

L’architecture que j’ai choisi de mettre en place se base sur :

  • un serveur Varnish qui servira à rediriger les requêtes entrantes soit vers notre serveur Web, soit vers notre serveur proxy ;
  • un serveur Apache configurer comme proxy transparent et autorisant les requêtes CONNECT sur le port SSH ;
  • un serveur Nginx qui sera utilisé en tant que serveur web ;

Il est tout à fait possible d’utiliser une configuration plus simple. L’intérêt de cette configuration est d’utiliser un autre serveur web qu’Apache pour servir les pages de notre site. On aurait également pu utiliser Squid + Nginx, mais la configuration de Squid est moins flexible que celle de Varnish.

Un reverse proxy avec Varnish

Configuration du daemon

La configuration de Varnish se fait en deux temps. D’abord nous allons configurer le daemon, son fichier se situe dans /etc/default/varnish :

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

Cette partie indique à Varnish que nous voulons écouter le port 80.

Configuration du proxy

Le fichier de configuration du proxy correspond au fichier que vous avez précisé lors de la configuration du daemon, ici nous utilisons le fichier /etc/varnish/default.vcl :

backend nginx {
    .host = "127.0.0.1";
    .port = "8080";
}

backend apache {
    .host = "127.0.0.1";
    .port = "8081";
}

sub vcl_recv {
    if (req.request == "CONNECT") {
        set req.backend = apache;
        return (pipe);
    }
    if (req.http.host ~ "lightcode\.fr(:\d+)?$") {
        set req.backend = nginx;
    }
    else {
        set req.backend = apache;
        return (pipe);
    }
    /* ... */
}

D’abord le mot clé backend permet de définir les serveurs vers lesquels seront redirigées les requêtes. Ici, il y en a deux : nginx sur le port 8080 et apache sur le port 8081. Vous pouvez bien entendu changer ces ports.

La première condition permet de rediriger les requêtes de type CONNECT vers Apache. Ces requêtes permettent d’utiliser SSH à travers le proxy SSH. La seconde condition permet de rediriger les requêtes HTTP classiques, qui auront comme host le nom de domaine de vos sites. Je les redirige vers le backend Nginx car je l’utilise comme serveur web.

Enfin, le else gère tous les cas où le host est différent des sites que vous hébergez, on les redirige également vers Apache, notre serveur proxy.

Je vous conseille de vous pencher d’avantage sur la configuration de Varnish qui est un outil très puissant.

Un proxy transparent avec Apache

D’abord, il faut activer le mod proxy dans Apache :

cp /etc/apache2/mods-available/proxy* /etc/apache2/mods-enabled/

La configuration du module se situe dans le fichier /etc/apache2/mods-enabled/proxy.conf, nous allons le modifier :

ProxyVia Block

ProxyRequests On
AllowConnect 22

<Proxy *>
Order deny,allow
AuthType Basic
AuthUserFile /etc/apache2/.passwords
AuthName "Password required"
Require valid-user
</Proxy>

La première ligne permet d’activer le proxy web, c’est ce qui est utilisé pour transmettre les requêtes HTTP vers le bon serveur.

On active les requêtes CONNECT sur le proxy, elles permettent d’utiliser le proxy pour se connecter à d’autres services. AllowConnect 22 autorise les connexions sur le port 22 (SSH). Tous les logiciels ne supportent pas ce type de connexion et nécessite d’être configuré pour fonctionner.

La partie entre balise <Proxy> permet de configurer des droits sur le proxy. Ceux-ci sont valables pour se servir du proxy web mais également pour les requêtes CONNECT. J’ai ajouté une authentification, les fichiers contenant les mots de passe (ici /etc/apache2/.passwords) peut être généré grâce à la commande htpasswd :

htpasswd -c /etc/apache2/.passwords nom_utilisateur

Conclusion

La configuration présentée permet d’avoir un proxy et un serveur web écoutant le même port. Cette configuration peut-être utile lorsque votre connexion Internet ne vous permet pas d’utiliser d’autres port que le 80.

Toutefois, celle-ci possède quelques limitations : par exemple, les connexions entre le client et le proxy ne sont pas chiffrées. L’authentification au serveur proxy est très légère, les mots de passe sont envoyés en clair.