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

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 :

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

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


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



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).

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:

Pensez à modifier:
- Votre nom de domaine
- Votre adresse mail, normalement déjà pré-définie
- Votre jeton API
Vous allez voire votre certificat apparaitre:

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


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:

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
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.
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.
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 !
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.
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.