Accéder à son serveur depuis internet avec NPM et Cloudflare

Accéder à son serveur multimédia depuis internet est essentiel pour de nombreux administrateurs. Si vous voulez accéder à votre serveur lors de déplacement, ou encore le partager à vos collègues ou amis. La sécurité et la facilité d’accès sont des éléments cruciaux, surtout lorsque vous gérez plusieurs services. Dans cet article, nous allons explorer comment utiliser Nginx Proxy Manager (NPM) et un tunnel Cloudflare pour configurer un accès distant sécurisé et fiable à votre serveur, à partir de n’importe quel navigateur.

Accéder à son serveur depuis internet : Prélude

Prérequis

Un nom de domaine est obligatoire pour pouvoir accéder à son serveur depuis internet. Vous pouvez en obtenir un pour environ 10 à 15 euros 10-15 euros par an chez de nombreux fournisseurs, mais il recommandé de le faire chez Cloudflare, car par la suite on utilisera leur tunnel. Pour plus d’info, cf. les prérequis pour un serveur multimédia.

Qu’est-ce que Nginx Proxy Manager (NPM) ?

Nginx Proxy Manager est une application qui permet de gérer facilement des proxies inverses via une interface utilisateur simple et intuitive. Il utilise Nginx en arrière-plan et propose des fonctionnalités comme le routage de requêtes HTTP/S, la gestion des certificats SSL, et bien plus encore.

Qu’est-ce qu’un tunnel Cloudflare ?

Un tunnel Cloudflare permet de sécuriser et de protéger votre trafic internet en faisant passer les connexions par les serveurs Cloudflare avant d’atteindre votre serveur. Cela ajoute une couche de sécurité en cachant l’adresse IP de votre serveur et en fournissant des fonctionnalités de pare-feu et de filtrage de trafic.

Mise en place du tunnel Cloudflare

Création du tunnel

Tout d’abord, connetez vous à votre compte cloudflare.

Sur la gauche, cliquez sur Zero Trust

Puis, sélectionner l’onglet Tunnels dans Networks

Cliquez sur Create a tunnel

Sélectionner le type Cloudflared (par défaut), puis Next

Donnez un nom à votre tunnel, exemple home server, puis Save Tunnel

Maintenant, copier la commande fournie pour y récupérer le token de votre tunnel, par exemple:

cloudflared.exe service install eyJhIjoiYTc1MDc3OWZmZDgwZjY0YzA1M2Q3NjA4ZmM5YzMwMzgiLCJ0IjoiNjdkZmMzZjMtMDA2MS00YmEwLWFmMTktYTE1ZTY1YmI0YjFkIiwicyI6Ik5HWm1PREZpTnpFdE5tUTNaQzAwTnpJeUxUbGxNMlV0TURKa1lUUTRaVEkzTm1aaSJ9

# Je récupère donc le token
eyJhIjoiYTc1MDc3OWZmZDgwZjY0YzA1M2Q3NjA4ZmM5YzMwMzgiLCJ0IjoiNjdkZmMzZjMtMDA2MS00YmEwLWFmMTktYTE1ZTY1YmI0YjFkIiwicyI6Ik5HWm1PREZpTnpFdE5tUTNaQzAwTnpJeUxUbGxNMlV0TURKa1lUUTRaVEkzTm1aaSJ9

Le token est montré qu’une seul fois, donc notez le. De plus, gardez le à l’abris des regards, car une personne qui le récupère pourra utiliser votre tunnel.

Puis Next, et maintenant dans Public Hostnames, ajoutez les informations suivantes:

  • Subdomain = *
  • Domain = votre-nom-de-domaine comme par exemple domain.com
  • Type = HTTPS
  • URL = nginx-proxy-manager:443

Ensuite, dans Additional application settings, puis TLS, ajoutez dans Origin Server Name l’url d’une page associé à un service de votre serveur qui sera tout le temps disponible. Par exemple la page d’accueil que l’on créera plus tard si vous avez déjà configurer Homepage: home.domain.com

Image d'exemple de configuration de tunnel

Cliquez sur Save tunnel, vous allez voir votre tunnel fraichement créé apparaitre dans la liste. Maintenant, copiez le Tunnel ID:

Le token et l’ID sont deux choses différentes, veillez à bien noter les deux.

Configuration des DNS

Retournez sur votre dashboard Cloudflare, sélectionnez votre nom de domaine, puis DNS et enfin Enrengistrements. On va maintenant ajoutez deux nouveaux enrengistrements:

  • Type = CNAME
  • Nom = Un avec * et un autre avec domain.com votre nom de domaine
  • Adresse IPv4 = tunnel-ID.cfargotunnel.com ici remplacer le tunnel-ID par l’actuel ID de votre tunnel

Installation du tunnel coté client

Pour cela on va utiliser le conteneur cloudflared qui va permettre de connecter l’autre partie de notre tunnel, la partie qui rejoint le serveur. Pour cela, rajoutez ce qui suit à votre stack:

  tunnel:
    container_name: cloudflared-tunnel
    image: cloudflare/cloudflared
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=le-token-de-votre-tunnel

Pensez bien à remplacez le-token-de-votre-tunnel par le vrai token, et NON l’ID.

Vérification de l’installation

Maintenant si vous essayer un URL au hasard, comme par exemple eeeee.domain.com , vous devrez voir apparaitre une page d’erreur Bad gateway, comme celle-ci :

Image d'exemple de bad gateway

Si au contraire vous voyer une page Error 1033, Argo Tunnel error, c’est que vous mal configuré votre tunnel du coté de cloudflare.

Image d'exemple d'error 1033

De plus, dans l’onglet de configuration de vos tunnels, vous devrez voire votre tunnel en status HEALTHY. Remarquez aussi qu’un identifiant est apparu en tant que Connector ID, c’est l’ID de votre machine:

Bravo! Vos avez configurer avec succé votre tunnel, maintenant il reste à mettre en place le lien entre le tunnel, les urls que vous allez créez et vos différents services.

Options de sécurité, cache et robots

Avant de passer à la suite, voici quelques options de sécurité qui va vous permettre de vous protéger des attaques, empêcher vos sites d’apparaître dans les recherches Google, désactiver le cache CDN pour un compte gratuit, en accord avec la mise à jour des règles de Cloudflare et plus encore.

Sécurité et bots

Image montrant les paramètres recommandés dans Cloudflare
Image montrant les paramètres de bots recommandés dans Cloudflare

On peut aussi créer des règles personalisés afin de sécuriser encore plus notre serveur:

Image montrant les règles personalisées dans Cloudflare
Image d'exemple de règle personalisée pour les menaces
Image d'exemple de règle personalisée pour les bots et bloquer l'indexing

CDN Cache

Ici, vous pouvez mettre seulement votre future adresse où vous lirez votre médiathéque Jellyfin, ou alors l’ensemble de votre domaine, comme par exemple domain.com. Mais le principale est que à chaque adresse de lecture de vidéo soit associé une règle, afin que vos vidéos ne soient pas mises sur le service de stockage et de livraison rapide de Cloudflare, c’est à dire, le CDN (Réseau de diffusion de contenu).

Image montrant les paramètres de pour bloquer le CDN cache

Maintenant votre serveur est pour la plupart protéger contre les attaques et autre. Mais le plus efficace reste un mot de passe fort sur chaque service afin de vous protéger.

Pour plus d’info sur les services de Cloudflare, les options gratuites comme payantes, des guides, ect …, rendez vous sur leur site.

Mise en place de NPM

Installation

Vous pouvez maintenant accéder à votre serveur depuis internet, mais il faut désormais configurer les applications. Pour cela, on va installer NPM. Rajoutez à notre stack le conteneur Docker de NPM:

  app:
    container_name: nginx-proxy-manager
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP

    # Uncomment the next line if you uncomment anything in the section
    # environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    volumes:
      - ./data/reverseproxy:/data
      - ./letsencrypt:/etc/letsencrypt

Vous pouvez maintenant accéder à NPM depuis le port 81

Les information d’identification de votre première connexion sont, Email: admin@example.com et Password: changeme

Configuration

Création des certificats SSL

Afin de servir vos services à partir de liens HTTPS, et donc de sécuriser les informations transmises, nous allons devoir avant toutes choses mettre en place la génération de certificat SSL automatique.

Pour cela, nous allons nous procurer un jeton API de Cloudflare, car c’est en réalité Cloudflare qui va nous fournir et renouveler nos certificats.

Rendez-vous dans votre dashboard Cloudflare

Puis cliquez sur l’icone de profil en haut à droite, puis mon profil

Ensuite, dans Jetons API, sélectionner créer un jeton.

Utilisez le modèle suivant, c’est le premier dans la liste: Modifier le DNS zone

Vous pouvez lui donner un nom si vous voulez, puis dans Ressources de la zone, sélectionner votre domaine, enfin cliquez sur Continuer vers le résumé

Créer un jeton

Enfin, copier votre jeton et notez le

Maintenant retournez sur NPM, SSL Certificates → Add SSL Certificate → Let’s Encrypt, et remplissez les informations comme ci-dessous:

Image montrant les paramètres pour créer un certificat SSL

Pensez à modifier:

  • Votre nom de domaine
  • Votre adresse mail, normalement déjà pré-définie
  • Votre jeton API

Vous allez voire votre certificat apparaitre:

Image d'exemple de certificat SSL valide

NPM, et donc par extension, Cloudflare, et Let’s Encrypt, le service de gestion des certificat, va automatiquement renouveler votre certificat avant qu’il arrive à éxpiration.

Gestion des proxy hosts

NPM, le tunnel Cloudflared, et vos autres services doivent être sur le même réseau pour pouvoir connecter entre eux, sinon cela ne marchera pas.

Maintenant, allons enfin créer nos pages de rédirection afin d’accéder à nos services depuis un url. Pour ça, allez dans Hosts → Proxy Hosts → Add Proxy Host, puis remplissez les informations suivantes:

  • Domain Names = les urls souhaités, exemple jellyfin.domain.com ou home.domain.com, ect
  • Forward Hostname / IP = le nom du conteneur du service souhaité, exemple jellyfin
  • Forward Port = le port interne du conteneur, exemple pour jellyfin, 8096
  • Activez Block Common Exploits et Websockets Support
  • Puis dans l’onglet SSl, dans SSL Certificate, sélectionnez le certificat créé précédemment
  • Activez HTTP/2 Support et HSTS Enabled
  • Enfin, Save
Image d'exemple de configuration de proxy host
Image d'exemple de configuration de SSL de proxy host

Maintenant, vous pouvez accéder à vos services depuis les urls que vous créés, à tout moment et depuis n’importe quelles connexions. En reprenant l’exemple précédant:

Image d'exemple de service accessible depuis internet

Bravo ! Vous pouvez enfin accéder à vos services en ligne. Vous avez plus qu’a répéter ce proccessus pour tous les services que vous voulez publiés.

Attention ! Même si on empeche l’indexion Google et autre, et que l’on bloque les robots mal attentionné, quiconque disposant du lien de votre service peut y accéder, alors il important de les sécuriser derière des mot de passe fort.

Autres options

Utiliser un VPN

Utiliser un VPN reste une solution aussi acceptable et pratique, même si moins configurable et souple. En effet, vous aurez une adresse IP dédié pour chaque utilisateur pour chaque appareil. Moins facilement partageable. Pour plus d’info sur des services de ce style, Tailscale est une référence.

Ouvrir vos ports de votre box

Vous pouvez aussi ouvrir vos ports de votre box, et donc accéder à vos services depuis l’adresse IP publique de votre machine.

Attention ! Si vous n’êtes pas expert, ne le faites pas car cela ouvre des grosses failles de sécurité, et donc n’est pas recommandé du tout comme solution.

Maintenant que vous savez comment accéder à son serveur depuis internet, vous pouvez installer Authentik pour sécuriser vos services que vous avez mis en ligne et pour gérer la gestion des comptes de façon global. De cette manière, avec un seul compte, vous pourrez vous connecter à tous les services que vous voulez, sans à avoir besoin de se connecter à chacun d’entre eux. Vous pourrez aussi automatiser la création d’utilisateur et bien plus encore: Comment sécuriser vos services grâce au Fournisseur d’Identité Authentik

5 réflexions au sujet de “Accéder à son serveur depuis internet avec NPM et Cloudflare”

  1. bonjour,
    je suis sur une configuration sur truenas scale 24.10.2, jai suivi votre configuration mais ca ne fonctionne pas . Votre aide serais le bienvenue.

    Répondre
    • Bonjour devigny,
      J’avoue ne pas être familier avec truenas, donc je ne serais pas forcément le mieux placé pour vous aider.
      Dans le doute, expliquez moi plus en détails ce qui ne fonctionne pas (type d’erreur, où, quand), si vous avez réussi à installer les outils, etc…
      Sinon, je peux vous conseiller de faire un post sur le forum nas fr (https://www.forum-nas.fr) où vous trouverez plus d’aide.

      Répondre
  2. Tutoriel suivi et mes sous-domaines fonctionnent parfaitement. Le seul problème que j’ai est avec la racine, je n’arrive pas à faire une redirection vers un simple nginx mais bon !
    Je me devais laisser un commentaire pour remercier ce tutoriel qui explique tout parfaitement 🙂 Prochaine étape : le media center !

    Répondre
    • Bonjour salvueg,
      Déjà merci pour votre retour ça fait toujours plaisir.
      C’est assez intriguant que vous ne puissiez pas faire une redirection avec la racine.
      Je regarderais ça en rentrant de vacances, ne pouvant pas le check actuellement.
      Bonne chance avec votre média-center, pas toujours évident la première fois. Si jamais vous rencontrez un problème ou avez des questions, faites moi signe.

      Répondre
    • Bonjour Salvueg,
      Après avoir regardé, c’est normal que cela ne marche pas, mais ce n’est pas compliqué à rajouter.
      J’avoue ne pas y avoir pensé étant donné que je n’utilise pas la racine.
      Je modifierai le guide en conséquence, mais voilà les étapes pour corriger :

      1. Dans Cloudflare, revenez sur votre tunnel et rajoutez un 2eme hôte public, sans sous-domaine cette fois-ci et avec, en serveur d’origine sous TLS, votre domain.com, sans http/https. Cloudflare va peut-être vous afficher une erreur « record already exists ». Pour ça, allez dans les enregistrements DNS de votre site et supprimez le record CNAME ayant pour nom domain.com. Cloudflare va le recréer automatiquement.

      2. Maintenant, dans NPM, allez dans l’onglet SSL Certificates et créez un certificat pour domain.com. Vous pouvez faire un certificat combiné pour *.domain.com et domain.com (et supprimer l’ancien), ou en rajouter un autre seulement pour la racine.

      Avec ces étapes, de mon côté la racine fonctionne parfaitement.

      Répondre

Laisser un commentaire