Comment héberger plusieurs service web en https sur le même serveur et sur le même port?

By Enzo
reverse proxy

Il est désormais fréquent de trouver de nombreux programmes qui proposent d'être utilisé, configuré depuis une interface web une fois installé.

Ces services par défaut sont bien souvent en HTTP, ou bien utilisent un certificat SSL autosigné. Également pour beaucoup d'entre eux ils utilisent des ports aléatoires qui doivent ainsi être précisé lorsque vous souhaitez accéder au service depuis votre navigateur (ex: http://127.0.0.1:8384)

Par exemple, Résilio utilisent le port 8888 par défaut lors de son installation, Syncthing lui utilise le port 8384. Donc comment faire lorsque l'on souhaite installer ces services sur le même serveur tout en les rendant facilement accessibles en HTTPS ?

Pour cela nous allons passer par un reverse proxy, un "reverse proxy", c'est un intermédiaire qui va écouter les requêtes sur le port 443 de votre serveur, port par défaut pour HTTPS, et qui va les transmettre aux services appropriés.

Le "reverse proxy" saura quel service contacté grâce au nom de domaine que vous utilisez dans votre navigateur.

Pour cela nous configurons, par exemple, nos enregistrements DNS pour que les deux domaines suivants pointent vers l'IP 192.168.1.10

  • res.gautier.it -> IP: 192.168.1.10
  • syn.gautier.it -> IP: 192.168.1.10

L'IP 192.168.1.10 est l'IP de notre serveur qui héberge à la fois les services que l'on veut rendre accessible, mais également notre reverse proxy qui écoutera sur le port HTTPS par défaut (port 443)

Notre solution de reverse proxy sera ensuite configuré pour associer les domaines avec un port différent sur le serveur.

  • res.gautier.it -> IP: localhost Port: 8888
  • syn.gautier.it ->IP: localhost Port: 8384
reverse proxy

Si je tape https://res.gautier.it ou bien https://syn.gautier, mon navigateur va contacter le même serveur. Cependant, le reverse proxy verra la requête pour le domaine res.gautier.it, ou bien syn.gautier.it et renverra votre requête au port local approprié et donc vous accéderez à un service différent.

Passons à la pratique...

Maintenant qu'on a vu la théorie, passons à la pratique avec un serveur qui serait hébergé chez nua.ge par exemple. Il existe de nombreuses solutions de "reverse proxy" et je voulais mettre en avant aujourd'hui un service qui cherche à simplifier la configuration pour les particuliers en mettant en avant une interface web facile à prendre en main : Nginx Proxy Manager

Pour mettre en place Nginx Proxy Manager, il faut tout d'abord installer docker et docker-compose. Rendez-vous ici si vous voulez plus d'informations : Comment installer docker et docker-compose ?

Déploiement du conteneur

Créons tout d'abord un nouveau dossier dans votre dossier /opt/

mkdir /opt/nginxproxymanager

Ensuite créons un nouveau fichier "docker-compose.yaml" et éditons-le avec nano:

nano /opt/nginxproxymanager/docker-compose.yaml

Dans ce fichier, copiez ce code :

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Finalement, lancer le déploiement du conteneur :

docker-compose up -d

À ce moment-là, vous êtes censé pouvoir vous connecter sur l'interface d'administration de "Nginx proxy manager" via "http://ip-de-votre-serveur:81".

Les identifiants par défaut sont :

  • email: admin@example.com
  • password: changeme

Configuration de "Nginx proxy manager"

L'une des premières chose à faire à mon sens, c'est de configurer "Nginx proxy manager" afin d'utiliser le domaine de votre choix en HTTPS pour accéder à "Nginx proxy manager".

Tout d'abord générons un certificat SSL :

  1. Allez dans "SSL Certificates".
  2. Puis "Add SSL Certificates" > Let's Encrypt.
  3. Le domaine que vous allez choisir doit déjà pointé vers l'IP publique de votre serveur.
  4. Le certificat une fois généré devrait apparaître dans la liste des certificats.

Configurer la redirection :

  1. Pour cela rendez-vous dans "proxy hosts".
  2. Cliquez sur "Add Proxy host".
  3. Dans "Domain Names", indiquez un nom de domaine similaire a celui du certificat généré précédemment.
    1. Dans "Forward Hostname/IP", indiquez l'IP privée de votre VM. (Je reviens sur ce point dans le paragraphe suivant)
    2. Dans "Forward port", indiquez le port 81.
  4. Dans le menu "SSL", vous pouvez choisir le certificat que vous avez généré ou bine profitez de cette étape pour en générer un nouveau.
  5. Cliquez sur Save.

Conclusion des étapes précédentes :

En suivant ces étapes nous avons fait en sorte que lorsque vous accéderez à https://domaine-de-votre-choix, le trafic sera redirigé vers l'IP interne de votre VM au port 81.

En reproduisant ces étapes et en changeant uniquement votre nom de domaine, vous pourrez héberger de nombreux services sur le même serveur, tout en y accédant de manière sécurisée. C'est-à-dire en utilisant HTTPS avec un certificat valide.

Spécificité à prendre en compte dû à Docker :

Dans l'exemple précédent j'indique d'utiliser l'IP privée de votre VM, je pars du principe que vous utilisiez un serveur cloud de type Azure/ Nua.ge/AWS et que donc votre serveur a à la fois une IP privée et une IP publique. De plus j'imagine que vous avez un firewall filtrant les ports ouverts sur votre serveur par défaut.

Dû à la manière dont "Docker" gère la partie réseau de votre conteneur, utilisez "localhost"ou bien "127.0.0.1", dans le champ "Forward Hostname/IP", ne fonctionnera pas. Car il essaiera de transférer le trafic à l'intérieur du conteneur. Vous devez donc préciser l'adresse IP privée de votre VM.

Par exemple sur nua.ge, ce sera l'IP affiché ici :

reverse proxy

Ceci était une première introduction à "Nginx Proxy Manager", j'espère que cela vous sera utile. Plus d'informations sur ce projet à cette adresse : https://nginxproxymanager.com

By Enzo

Je suis ingénieur système et je suis passionné par le monde de l’informatique et des technologies.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.