Ou : routage entre serveurs par nom de domaine
Et oui, c’est ce dont on va parler ici. Comme ce n’est peut être pas très clair pour tout le monde, je vais me permettre une toute petite digression pour expliquer ce qu’est le routage, et plus précisément ce que j’appelle le routage par noms de domaine.
Merci pour cette digression.
Mais de rien.
Qu’est ce que le routage ? Ca consiste à se servir d’une unique machine (comunément appelée “le routeur”) pour diriger des flux réseau vers différents autres matériels.
Ca sert le plus simplement du monde sur Internet, pour router les différents sous réseaux. Vous voulez joindre truc.truc.truc.truc, mais vous avez comme IP machin.machin.machin.machin, alors un routeur va pouvoir vous dire :
“Pour aller vers truc, c’est à gauche, mais si c’est pour aller vers bidule, c’est à droite. Quand à toi machin, tu es au milieu”.
Ok, c’est résumé très vite pour les puristes, mais l’idée est là 🙂
Il existe différents autres types de routage. On utilise ce terme parce que l’idée de donner des routes (ou des chemins) pour diriger des flux reste la même.
Une machine (routeur, PC, serveur, …) reçoit un flux, et à partir de différents critères choisit de rediriger ce flux vers un autre matériel du réseau, l’objectif final étant bien sûr que ce flux arrive à destination de manière sûre.
Ca suffit oui ?
On y arrive. 😉
Un nouvel article pour utiliser haproxy en tant que reverse-proxy, logiciel plus léger et plus adapté qu’apache à cet usage.
Or donc, si vous avez plusieurs serveurs web mais une seule connexion Internet, alors vous avez sans doute déjà eu cette problématique.
Comment joindre plusieurs sites web sur différents serveurs depuis les Internet ?
La solution qui s’impose directement, c’est du routage de port.
Ce routage particulier consiste à router différents flux reçus depuis Internet vers des machines à l’intérieur de votre réseau local en se basant sur les ports réseaux utilisés. Ce n’est pas le lieu pour décrire un port réseau. Voyez ça comme une porte. Vous rentrez dans la même maison, mais selon que vous utilisiez la porte d’entrée ou la véranda, vous êtes “redirigés” vers une pièce différente de la maison.
Ce type de routage présente un inconvénient certain : chacun de vos utilisateurs doit spécifier la porte qu’il veut utiliser pour joindre le bon serveur.
En général, ça consiste à taper nomdedomaine.tld:port dans votre navigateur, ce qui n’est pas très pratique, et difficile à expliquer à vos clients. (Et oubliez de suite expliquer ça à Google and co)
C’est là qu’intervient ce super outil, le reverse proxy, ou mandataire inverse. Nous allons voir ici comment l’utiliser avec Apache, un serveur web populaire. Il est sans doute possible de le faire également avec NGinX ou lightHTTPD, mais ce n’est pas le sujet 😀
Le mandataire inverse va regarder le site que vous voulez joindre, et vous rediriger vers le bon serveur directement. Il servira ensuite d’intermédiaire sur le réseau entre vous et le serveur.
On veut du concret !
Voila voila !
Pré-requis matériel
Pour commencer, il va falloir définir un serveur mandataire. C’est sur ce serveur que nous allons configurer le mandataire inverse.
Il peut héberger lui-même des sites Internet, ou vous pouvez l’utiliser uniquement comme mandataire, ça n’a pas d’importance. Si vous utilisez cette solution à des vues industrielles, mieux vaut prévoir un serveur robuste, puisqu’il supportera toutes les requêtes vers tous vos sites web.
Ensuite, il vous faut configurer votre routeur/machinbox© pour rediriger tout le flux web (port 80) vers le serveur mandataire. Ceci se fait grâce à un routage de port classique. Toutes les requêtes web arriveront maintenant sur ce serveur, qui va décider quoi en faire.
En théorie on devrait pouvoir faire la même chose pour l’HTTPS, mais vu qu’il y a quand même des contraintes de certificats et que je n’ai pas testé, je préfère ne pas dire de bêtises ici.
Prérequis logiciel
Là, c’est simple. Il vous faut un serveur Apache installé et fonctionnel sur votre serveur mandataire. C’est tout. Un système de pare-feu ne serait également pas de trop (ce serveur est l’unique point d’entrée d’Internet, rappelons le 🙂 )
Il vous faut également (bien evidemment ?) une connexion ssh vers votre serveur, ou à défaut un écran-clavier-souris.
Plongeons dans le cambouis
Activation du module proxy Apache
Connectez vous sur votre serveur (mandataire), puis tapez :
sudo a2enmod proxy
sudo a2enmod proxy_http
Redémarrez ensuite Apache un petit coup
sudo /etc/init.d/apache restart
Voila, c’est fait !
Configuration du routage
Ici, tout va se faire grâce au système d’hôte virtuel Apache.
Editez un fichier dans /etc/apache2/site-available/
sudo nano /etc/apache2/sites-available/monsite
Puis configurez votre hôte comme suit :
Cela va permettre de rediriger toutes les requêtes sur nomdedomaine.tld en http vers le serveur IPSERVEURWEBINTERNE
C’est simple et efficace. Vous pouvez créer toutes vos autres redirections dans ce fichier, ou créer un fichier par redirection (plus propre mais plus contraignant). A vous de voir.
Une fois ces fichier créés, il vous faut activer les hôtes virtuels.
Faites
sudo a2ensite monsite
pour chaque fichier que vous avez créé.
Ensuite, rechargez la configuration Apache (pas besoin de redémarrer)
sudo /etc/init.d/apache2 reload
Tadam !
Il ne vous reste plus qu’à tester. De l’exterieur, essayez de joindre nomdedomaine.tld, tout doit fonctionner 🙂
Et voila, vous avez économisé plein d’adresses IP publiques ! Mais pourquoi utiliser plusieurs serveurs Web derrière une seule IP petits coquinous ? Ça, ça vous regarde…
Si jamais j’ai la problématique un jour, je configurerai ça pour de l’HTTPS (mais honnêtement j’espère jamais 😀 )
Et dans ce cas je rajouterai ça sur le blog, promis ! Voir juste au dessous !
Edit : Comme promis, la version https
Et oui, car finalement j’ai du m’y mettre 🙂
Tout d’abord, les limitations. Je n’ai réussit jusqu’alors qu’à configurer une connexion HTTPS entre le client et le reverse proxy.
Je n’ai pas réussit à avoir ensuite de l’HTTPS entre le reverse proxy et le vrai serveur web, ce qui veut dire que, au moins sur le réseau local, les données transitent en clair.
De mon point de vue ce n’est qu’un problème conceptuel, étant donné que le “réseau local” est en fait une liaison directe entre machines virtuelles sur le même hyperviseur, donc bon. Mais quand même, ce n’est pas très propre. Si jamais quelqu’un a une suggestion à ce sujet, qu’il me fasse signe 🙂
L’idée donc du reverse proxy en HTTPS, c’est que c’est le proxy qui va contenir les certificats https. Celui-ci va alors répondre à la place du serveur web, avec la bonne URL puique c’est un proxy, et transmettre ensuite les requêtes vers le serveur.
On a donc un schéma dans cette idée :
<Client> ====https====<Proxy>—-http—-<serveur web>
Et en plus, c’est assez simple en fait.
On considérera ici que vous avez déja généré des certificats propres pour votre site (éventuellement auto-signés).
Il vous faudra activer le SSL sur votre reverse proxy :
sudo a2enmod ssl
$ sudo /etc/init.d/apache2 restart
Ensuite, placez vos certificats (clef publique, clef privée) dans le dossier /etc/apache2/ssl/.
sudo cp moncertificat.* /etc/apache2/ssl/
Créez l’hôte virtuel qui servira pour votre redirection :
sudo nano /etc/apache2/site-available/monproxySSL
Et remplissez le avec ceci :
N’oubliez pas bien sûr d’activer votre nouvel hôte virtuel :
Et voila, votre reverse proxy doit fonctionner en HTTPS 🙂