Cloudflare Tunnel : exposer proprement
Mettre un service en ligne sur votre propre domaine, en HTTPS, sans ouvrir un seul port sur votre box. Le tunnel sort de chez vous, il n'entre pas.
Sur cette fiche
Fiche vérifiée il y a 3 mois : certaines commandes ont pu changer. Signalez-le si c’est le cas.
En bref
Cloudflare Tunnel met une appli de votre mini-PC en ligne sur votre propre domaine, en HTTPS, sans ouvrir de port sur votre box ni révéler votre adresse IP : le programme cloudflared ouvre une connexion sortante vers Cloudflare, et le trafic public redescend par ce tunnel. Il faut un domaine géré par Cloudflare, dont l'offre gratuite suffit. Réservez-le aux applis web pensées pour le public, protégez le reste avec Cloudflare Access, et gardez SSH, Ollama ou une base de données sur Tailscale.
À faire avant : Tailscale : votre réseau privéSécuriser les accès
Tailscale règle un problème : vous, depuis vos appareils, vous atteignez votre machine de partout, en privé. Parfait pour bosser. Mais parfois vous voulez l’inverse : que le public atteigne une appli que vous venez de monter. Une démo à montrer à un collègue, un dashboard pour l’équipe, une page que vous voulez partager par un simple lien. Tailscale ne sait pas faire ça, il est privé par nature.
La réponse classique, c’est l’ouverture de port sur la box. C’est fragile (votre IP change, la box redémarre, la config saute), et surtout ça expose l’adresse IP de votre maison au monde entier. Mauvaise idée. Cloudflare Tunnel résout tout ça d’une façon plus maligne.
Le truc qui change tout : le tunnel sort, il n’entre pas
Voici l’idée à bien avoir en tête. Un petit programme, cloudflared, tourne sur votre mini-PC et ouvre une connexion vers Cloudflare, comme votre navigateur ouvre une connexion vers un site. Le trafic public qui arrive sur monapp.ton-domaine.com redescend ensuite par ce même tunnel jusqu’à votre appli locale.
Conséquences concrètes, et elles sont belles :
- Aucun port ouvert sur votre box. Rien à configurer côté Freebox/Livebox.
- Votre IP maison reste cachée. Le monde voit Cloudflare, jamais votre adresse.
- HTTPS gratuit et automatique. Le certificat, c’est Cloudflare qui le gère.
- Protection anti-DDoS incluse, parce que tout passe par leur réseau d’abord.
Le tunnel nommé, la méthode qui dure
Il existe un tunnel express (on y revient à la fin), mais pour un service qui doit tenir dans le temps, on crée un tunnel nommé. Il survit aux redémarrages, garde la même config, et se branche proprement en service système. Voici la marche complète, en ligne de commande, avec une config écrite dans un fichier que vous pouvez relire et versionner.
0 étape sur 6 faite Vos cases cochées restent dans ce navigateur.
-
Installer cloudflared sur le mini-PC
On passe par le dépôt apt officiel de Cloudflare, pour avoir les mises à jour automatiquement :
# Ajoute la clé GPG de Cloudflare sudo mkdir -p --mode=0755 /usr/share/keyrings curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \ | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null # Ajoute le dépôt echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main" \ | sudo tee /etc/apt/sources.list.d/cloudflared.list # Installe sudo apt update && sudo apt install cloudflared -
Connecter cloudflared à votre compte
cloudflared tunnel loginÇa ouvre votre navigateur. Vous choisissez le domaine à autoriser, et Cloudflare dépose un certificat dans
~/.cloudflared/. C’est ce qui prouve que ce tunnel a le droit d’agir sur votre domaine. -
Créer le tunnel nommé
cloudflared tunnel create miniÇa crée un tunnel appelé
miniet écrit un fichier de credentials en JSON (un truc du genre~/.cloudflared/<un-long-id>.json). Notez bien l’identifiant affiché : on en a besoin juste après. -
Écrire le fichier de config
Créez
~/.cloudflared/config.yml. C’est lui qui dit : « le trafic du tunnelminiarrivant sur tel domaine va vers tel service local ».tunnel: <ton-tunnel-id> credentials-file: /home/ton-user/.cloudflared/<ton-tunnel-id>.json ingress: # monapp.ton-domaine.com → l'appli qui tourne en local sur le port 8099 - hostname: monapp.ton-domaine.com service: http://localhost:8099 # Tout le reste reçoit un 404, obligatoire en fin de liste - service: http_status:404Le bloc
ingressse lit de haut en bas. La dernière lignehttp_status:404est un fourre-tout obligatoire : sans elle,cloudflaredrefuse de démarrer. Vous pouvez ajouter d’autreshostnameau-dessus pour exposer plusieurs applis par le même tunnel. -
Router le DNS
cloudflared tunnel route dns mini monapp.ton-domaine.comCette commande crée l’enregistrement DNS chez Cloudflare qui fait pointer votre sous-domaine vers le tunnel. Une seule fois par hostname.
-
Tester, puis installer en service
Lancez le tunnel à la main pour vérifier que tout répond :
cloudflared tunnel run miniOuvrez
https://monapp.ton-domaine.comdans un navigateur. Si votre appli locale répond, c’est gagné. Coupez avec Ctrl+C, puis installez-le en service pour qu’il survive aux redémarrages :# Avec sudo, ~ désigne /root : on indique donc le chemin complet de votre config sudo cloudflared --config /home/ton-user/.cloudflared/config.yml service install # Démarre le service et vérifie qu'il tourne sudo systemctl start cloudflared systemctl status cloudflaredLe piège classique est là : lancé avec
sudomais sans--config,cloudflaredcherche sa config dans le dossier derootet ne trouve rien. Après chaque modification deconfig.yml, unsudo systemctl restart cloudflaredapplique les changements.
Une chose exposée est une chose publique
Le risque est réel. Dès que vous routez un hostname, n’importe qui sur Internet peut frapper à cette porte. Donc :
- Mettez de l’authentification devant tout ce qui est sensible. Cloudflare Access sait filtrer par e-mail (seuls les comptes que vous autorisez passent), c’est gratuit pour un petit groupe (l’offre Zero Trust gratuite va jusqu’à 50 utilisateurs) et ça vous évite d’exposer un dashboard d’admin au tout-venant.
- Ne tunnelez jamais vos services bruts : SSH, l’API d’Ollama (port 11434), une base de données. Ceux-là restent sur Tailscale, point. Cloudflare Tunnel, c’est pour des applis web pensées pour être publiques.
La règle mentale : Tailscale pour vous, Cloudflare Tunnel pour le monde. Avant d’exposer quoi que ce soit, faites un tour par Sécuriser les accès pour savoir quoi verrouiller.
Le tunnel express, pour une démo de cinq minutes
Vous n’avez pas besoin d’un tunnel permanent ? Une seule commande, sans config, sans domaine :
cloudflared tunnel --url http://localhost:8099
Cloudflare vous crache une URL aléatoire en trycloudflare.com que vous pouvez partager tout de suite. Idéal pour montrer un truc à un collègue en réunion. Mais c’est éphémère : l’URL change à chaque lancement et disparaît quand vous coupez la commande. Cloudflare réserve d’ailleurs ce mode aux tests et aux démos, sans garantie de disponibilité (sa doc). Pour un service qui doit rester, repassez par le tunnel nommé ci-dessus.
Toutes les commandes de cette fiche
Questions fréquentes
Peut-on utiliser Cloudflare Tunnel sans nom de domaine ?
Oui, pour une démo rapide. La commande cloudflared tunnel --url http://localhost:8099 donne une adresse aléatoire en trycloudflare.com, à partager tout de suite. Elle est éphémère : elle change à chaque lancement et disparaît quand vous coupez la commande, et Cloudflare réserve ce mode aux tests, sans garantie de disponibilité. Pour un service qui doit durer, il faut un domaine et un tunnel nommé.
Comment confier son nom de domaine à Cloudflare ?
Achetez le domaine chez n'importe quel registrar, ou directement chez Cloudflare ; un .com coûte une dizaine d'euros par an. Pointez ensuite ses serveurs de noms (nameservers) vers Cloudflare, une étape guidée dans leur tableau de bord qui prend une dizaine de minutes. Une fois le domaine actif chez eux, vous pouvez créer le tunnel.
Faut-il créer le tunnel en ligne de commande ou depuis le tableau de bord Cloudflare ?
Les deux marchent. Depuis le tableau de bord, vous déclarez le tunnel et ses adresses à la souris, puis vous copiez sur le mini-PC une commande d'installation accompagnée d'un jeton, mais la configuration vit alors chez Cloudflare. En ligne de commande, elle tient dans un fichier config.yml chez vous, que vous pouvez relire et versionner.
Peut-on exposer plusieurs applis avec un seul tunnel Cloudflare ?
Oui. Dans le bloc ingress du fichier config.yml, ajoutez une entrée hostname par appli, chacune pointant vers son port local, au-dessus de la ligne finale http_status:404. Cette dernière ligne est obligatoire : sans elle, cloudflared refuse de démarrer. Chaque nouveau sous-domaine se route une fois avec cloudflared tunnel route dns.
Pourquoi cloudflared ne trouve-t-il pas sa configuration une fois installé en service ?
Lancé avec sudo, cloudflared cherche sa configuration dans le dossier de root et ne trouve rien. Il faut donc lui donner le chemin complet du fichier au moment de l'installation, avec sudo cloudflared --config /home/ton-user/.cloudflared/config.yml service install. Après chaque modification de config.yml, un sudo systemctl restart cloudflared applique les changements.
Les termes de cette fiche : TailscaleAdresse IPCloudflare TunnelTerminal (ligne de commande)SSHAPIOllama
Une erreur ?
Une commande ne marche plus, un prix a changé ?
Les outils bougent tous les mois. Dites-moi ce qui cloche dans cette fiche, je corrige et je redate.