Cloudflare Tunnel (anciennement Argo Tunnel) est l'une des fonctionnalités les plus puissantes et sous-estimées de l'écosystème Cloudflare. Elle permet d'exposer n'importe quel service local sur Internet — serveur web, application, SSH, RDP, base de données — sans ouvrir le moindre port dans votre firewall, sans avoir d'adresse IP fixe, et sans modifier votre configuration réseau. Le principe repose sur un agent léger appelé cloudflared qui établit une connexion sortante chiffrée en mTLS vers les datacenters Cloudflare. Tout le trafic entrant est ensuite acheminé via ce tunnel sécurisé. Pour les équipes de cybersécurité, les développeurs qui hébergent des services personnels (homelab), ou les entreprises qui souhaitent exposer des APIs sans se soucier de la gestion des certificats et des règles NAT, Cloudflare Tunnel représente une révolution architecturale. Ce guide complet couvre l'installation, la configuration, les cas d'usage avancés et la sécurisation du tunnel en 2026, que vous soyez sur Linux, Windows ou Docker. Nous aborderons également les implications en termes de sécurité pour les infrastructures critiques et la manière d'intégrer Cloudflare Tunnel dans une stratégie Zero Trust globale incluant Cloudflare Access pour le contrôle d'accès granulaire.
Qu'est-ce que Cloudflare Tunnel et pourquoi l'utiliser
\n\nCloudflare Tunnel résout un problème fondamental de la mise en réseau moderne : comment exposer un service local sur Internet de manière sécurisée sans modifier la configuration du réseau sous-jacent. Traditionnellement, exposer un serveur web nécessitait d'ouvrir des ports dans le firewall (80, 443), de configurer des règles NAT sur le routeur, et de gérer des certificats SSL. Cloudflare Tunnel inverse ce paradigme.
\n\nL'agent cloudflared établit une ou plusieurs connexions sortantes vers les datacenters Cloudflare les plus proches, utilisant le protocole QUIC ou HTTP/2 selon la disponibilité. Ces connexions sont chiffrées avec mTLS (mutual TLS), ce qui signifie que les deux parties s'authentifient mutuellement. Le trafic entrant des utilisateurs est reçu par Cloudflare, filtré par le WAF et les règles de sécurité, puis acheminé via ce tunnel vers votre service local.
Les avantages concrets sont nombreux :
\n- \n
- Aucun port ouvert : votre firewall peut bloquer toutes les connexions entrantes \n
- Pas d'IP fixe nécessaire : idéal pour les connexions ADSL/fibre résidentielle ou les hébergements cloud éphémères \n
- HTTPS automatique : Cloudflare gère les certificats TLS côté public \n
- Protection DDoS intégrée : le trafic passe par le réseau Cloudflare avant d'atteindre votre service \n
- Intégration Zero Trust : combiné avec Cloudflare Access, vous pouvez exiger une authentification avant d'atteindre votre tunnel \n
Pour les équipes de sécurité qui gèrent des audits d'infrastructure, Cloudflare Tunnel simplifie considérablement l'exposition temporaire de services de reporting ou de dashboards internes sans compromettre la posture de sécurité globale.
\n\nPrérequis avant l'installation
\n\nAvant de configurer Cloudflare Tunnel, vous avez besoin des éléments suivants :
\n\nCompte et domaine Cloudflare
\nUn compte Cloudflare gratuit suffit pour utiliser Cloudflare Tunnel. Votre domaine doit être géré par Cloudflare (nameservers pointant vers Cloudflare). Le plan gratuit inclut un tunnel actif avec une bande passante illimitée pour les services HTTP/HTTPS. Pour SSH et RDP via le navigateur, un plan Zero Trust est nécessaire (gratuit jusqu'à 50 utilisateurs).
\n\nMachine hôte
\nL'agent cloudflared est compatible avec :
- \n
- Linux : x86_64, ARM64, ARMv6 (Raspberry Pi inclus) \n
- Windows : x86_64, ARM64 \n
- macOS : x86_64, Apple Silicon \n
- Docker : image officielle
cloudflare/cloudflared\n
Accès réseau sortant
\nLa machine hôte doit pouvoir établir des connexions sortantes vers les IP Cloudflare sur les ports 443 (HTTPS/QUIC) et 7844 (QUIC/UDP alternatif). Dans la plupart des environnements d'entreprise, le port 443 sortant est toujours ouvert.
\n\nService à exposer
\nLe service que vous souhaitez exposer doit écouter localement sur un port (par exemple, un serveur web sur localhost:8080). Il peut s'agir de n'importe quel protocole HTTP, HTTPS, SSH, RDP ou TCP.
Installation de cloudflared
\n\nL'installation de cloudflared varie selon le système d'exploitation. Voici les méthodes recommandées pour chaque plateforme.
Linux — Installation via le dépôt officiel
\n\nPour les distributions basées sur Debian/Ubuntu :
\n\n# Ajouter la clé GPG et le dépôt Cloudflare\ncurl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null\necho '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\n\n# Installer cloudflared\nsudo apt-get update && sudo apt-get install cloudflared\n\n# Vérifier l'installation\ncloudflared --version\n\nPour les distributions basées sur RPM (CentOS, RHEL, Fedora) :
\n\ncurl -L https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo\nsudo yum install cloudflared\n\nInstallation en tant que service systemd
\n\nPour que le tunnel démarre automatiquement au boot :
\n\n# Authentification (ouvre un navigateur pour autoriser)\ncloudflared tunnel login\n\n# Créer le tunnel\ncloudflared tunnel create mon-tunnel\n\n# Configurer le service systemd\nsudo cloudflared service install\n\nWindows — Service Windows
\n\n# Télécharger l'exécutable depuis GitHub Releases\n# Ou via winget :\nwinget install Cloudflare.cloudflared\n\n# Authentification\ncloudflared.exe tunnel login\n\n# Installer comme service Windows\ncloudflared.exe service install\n\nDocker
\n\ndocker run -d --name cloudflared -v ~/.cloudflared:/etc/cloudflared cloudflare/cloudflared:latest tunnel --config /etc/cloudflared/config.yml run\n\nLa documentation officielle d'installation est disponible sur developers.cloudflare.com — Get Started with Cloudflare Tunnel.
\n\nCréer et configurer un tunnel
\n\nUne fois cloudflared installé et authentifié, la création d'un tunnel se fait en quelques commandes.
Authentification
\n\ncloudflared tunnel login\n\nCette commande ouvre votre navigateur pour vous connecter à votre compte Cloudflare et sélectionner le domaine à utiliser. Un fichier de certificat cert.pem est sauvegardé dans ~/.cloudflared/.
Création du tunnel
\n\n# Créer un nouveau tunnel\ncloudflared tunnel create mon-service-web\n\n# Résultat : un UUID est généré (ex: a1b2c3d4-e5f6-7890-abcd-ef1234567890)\n# Un fichier credentials est créé : ~/.cloudflared/a1b2c3d4-....json\n\nFichier config.yaml
\n\nCréez le fichier de configuration à ~/.cloudflared/config.yml :
tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890\ncredentials-file: /home/user/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json\n\ningress:\n - hostname: monservice.example.com\n service: http://localhost:8080\n - hostname: api.example.com\n service: http://localhost:3000\n - service: http_status:404\n\nCréer l'enregistrement DNS
\n\n# Créer un CNAME DNS automatiquement\ncloudflared tunnel route dns mon-service-web monservice.example.com\n\nDémarrer le tunnel
\n\n# Test (foreground)\ncloudflared tunnel run mon-service-web\n\n# Ou via la config\ncloudflared tunnel --config ~/.cloudflared/config.yml run\n\nRouter un service web vers le tunnel
\n\nCloudflare Tunnel supporte plusieurs types de services backend. La configuration ingress dans config.yml permet de router différents sous-domaines vers différents services locaux.
Service HTTP simple
\n\ningress:\n - hostname: web.example.com\n service: http://localhost:80\n originRequest:\n noTLSVerify: false\n connectTimeout: 30s\n\nService HTTPS avec certificat auto-signé
\n\ningress:\n - hostname: secure.example.com\n service: https://localhost:443\n originRequest:\n noTLSVerify: true # Si certificat auto-signé en local\n\nAccès SSH via le tunnel
\n\ningress:\n - hostname: ssh.example.com\n service: ssh://localhost:22\n\nPour SSH, le client doit également avoir cloudflared installé et utiliser une commande ProxyCommand spéciale (voir section dédiée ci-dessous).
Accès RDP
\n\ningress:\n - hostname: rdp.example.com\n service: rdp://localhost:3389\n\nRègles avancées avec path-based routing
\n\ningress:\n - hostname: app.example.com\n path: /api/.*\n service: http://localhost:8080\n - hostname: app.example.com\n path: /static/.*\n service: http://localhost:9000\n - hostname: app.example.com\n service: http://localhost:3000\n - service: http_status:404\n\nCette configuration permet de router les requêtes /api/ vers un backend Node.js, les assets statiques vers un serveur de fichiers, et le reste vers votre frontend React — le tout via un seul domaine et un seul tunnel.
Tunnel avec Docker Compose
\n\nPour les environnements conteneurisés, intégrer Cloudflare Tunnel dans un stack Docker Compose est la méthode recommandée. Cela permet de démarrer l'ensemble de votre infrastructure applicative en une seule commande.
\n\nversion: '3.8'\n\nservices:\n app:\n image: nginx:alpine\n volumes:\n - ./html:/usr/share/nginx/html:ro\n networks:\n - internal\n\n cloudflared:\n image: cloudflare/cloudflared:latest\n restart: unless-stopped\n command: tunnel --config /etc/cloudflared/config.yml run\n volumes:\n - ./cloudflared:/etc/cloudflared:ro\n networks:\n - internal\n depends_on:\n - app\n environment:\n - TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}\n\nnetworks:\n internal:\n driver: bridge\n\nAvec la variable d'environnement TUNNEL_TOKEN (obtenue depuis le dashboard Cloudflare Zero Trust), vous n'avez même pas besoin de fichier de credentials. Le token contient tout ce dont cloudflared a besoin pour s'authentifier et établir le tunnel.
Obtenir le token de tunnel
\n\n# Via CLI\ncloudflared tunnel token mon-service-web\n\n# Ou depuis le dashboard :\n# Cloudflare Zero Trust > Networks > Tunnels > [votre tunnel] > Configure > Docker\n\nDans le fichier .env de votre projet Docker Compose :
CLOUDFLARE_TUNNEL_TOKEN=eyJhIjoiM...\n\nConfiguration réseau dans Docker
\n\nLorsque cloudflared et votre application sont dans le même réseau Docker, utilisez le nom du service comme hostname :
ingress:\n - hostname: monapp.example.com\n service: http://app:80 # 'app' = nom du service Docker\n - service: http_status:404\n\nAccès SSH sécurisé via Cloudflare Tunnel
\n\nL'un des cas d'usage les plus intéressants de Cloudflare Tunnel pour les équipes de cybersécurité est l'accès SSH sans exposer le port 22. C'est particulièrement utile pour les serveurs de production où le port SSH ne doit jamais être accessible directement depuis Internet.
\n\nLa gestion des accès SSH est directement liée à la stratégie d'audit d'infrastructure et à la conformité avec les référentiels comme NIS 2, qui exigent un contrôle strict des accès administratifs.
\n\nConfiguration côté serveur
\n\n# config.yml sur le serveur\ntunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890\ncredentials-file: /root/.cloudflared/a1b2c3d4-....json\n\ningress:\n - hostname: ssh.mondomaine.com\n service: ssh://localhost:22\n - service: http_status:404\n\nConfiguration côté client
\n\nSur la machine client, installez cloudflared puis ajoutez dans ~/.ssh/config :
Host ssh.mondomaine.com\n ProxyCommand cloudflared access ssh --hostname %h\n User votre-utilisateur\n IdentityFile ~/.ssh/id_ed25519\n\nLa connexion SSH se fait ensuite normalement :
\n\nssh ssh.mondomaine.com\n\ncloudflared intercepte la commande, établit une session HTTPS courte durée (short-lived certificate) via Cloudflare Access, puis proxifie la connexion SSH. Le port 22 n'est jamais exposé sur Internet.
Authentification avec certificats short-lived
\n\nEn combinant avec Cloudflare Access et les certificats SSH éphémères, vous pouvez éliminer complètement la gestion des clés SSH :
\n\n# Générer un certificat CA SSH depuis Cloudflare Access\n# Dashboard > Access > Service Auth > SSH\n\n# Sur le serveur, configurer sshd pour accepter les certificats Cloudflare\n# /etc/ssh/sshd_config :\nTrustedUserCAKeys /etc/ssh/cloudflare-ca.pub\n\nSurveillance et rotation des credentials
\n\nLa gestion des credentials d'un tunnel Cloudflare est un aspect critique de la sécurité opérationnelle.
\n\nFichiers de credentials
\n\nChaque tunnel possède un fichier JSON de credentials contenant un token JWT signé par Cloudflare. Ce fichier est stocké dans ~/.cloudflared/ (ou le répertoire de configuration spécifié). Il doit être protégé avec des permissions restrictives :
chmod 600 ~/.cloudflared/*.json\nchown root:root ~/.cloudflared/*.json\n\nSurveiller les connexions actives
\n\n# Lister tous les tunnels\ncloudflared tunnel list\n\n# Voir les connexions actives d'un tunnel\ncloudflared tunnel info mon-service-web\n\n# Métriques en temps réel (port 2000 par défaut)\ncurl http://localhost:2000/metrics\n\nLogs et monitoring
\n\n# Journaux systemd\njournalctl -u cloudflared -f\n\n# Niveau de log détaillé\ncloudflared tunnel --loglevel debug run mon-service-web\n\nRotation des credentials
\n\nEn cas de compromission suspectée des credentials :
\n\n# Supprimer les credentials existants\ncloudflared tunnel delete mon-service-web\n\n# Recréer le tunnel (nouveau UUID, nouveaux credentials)\ncloudflared tunnel create mon-service-web-v2\ncloudflared tunnel route dns mon-service-web-v2 monservice.example.com\n\nCette procédure est cohérente avec les exigences de conformité DORA qui impose des processus de gestion des incidents et de rotation des secrets.
\n\nAlertes Cloudflare
\n\nDans le dashboard Cloudflare, configurez des notifications pour :
\n- \n
- Tunnel déconnecté (tunnel health alert) \n
- Erreurs de connectivité répétées \n
- Utilisation anormale de la bande passante \n
Cas d'usage avancés : Kubernetes, homelab, self-hosted
\n\nCloudflare Tunnel s'adapte à des architectures de plus en plus complexes.
\n\nKubernetes Ingress Controller
\n\nCloudflare propose un contrôleur Ingress natif pour Kubernetes qui crée et gère automatiquement des tunnels basés sur les ressources Ingress :
\n\n# Installer le contrôleur via Helm\nhelm repo add cloudflare https://cloudflare.github.io/helm-charts\nhelm install cloudflare-tunnel-ingress-controller cloudflare/cloudflare-tunnel-ingress-controller --set cloudflare.apiToken="your-api-token" --set cloudflare.accountId="your-account-id" --namespace cloudflare-system\n\n# Créer un Ingress standard\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: mon-app\n annotations:\n kubernetes.io/ingress.class: cloudflare-tunnel\nspec:\n rules:\n - host: monapp.example.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: mon-app-service\n port:\n number: 80\n\nPour les équipes qui pratiquent le pentest cloud, cette configuration est un bon exemple de surface d'attaque à évaluer : les permissions du token API Cloudflare doivent être minimales (scope limité aux Tunnels).
\n\nHomelab et self-hosted applications
\n\nPour un homelab, Cloudflare Tunnel permet d'exposer des services comme :
\n- \n
- Home Assistant (domotique) \n
- Nextcloud (stockage personnel) \n
- Jellyfin/Plex (streaming media) \n
- Grafana (monitoring) \n
- Applications développées en local \n
La configuration multi-service dans un seul fichier config.yml permet de gérer toute une infrastructure domestique :
\n\ningress:\n - hostname: home.example.com\n service: http://192.168.1.100:8123 # Home Assistant\n - hostname: cloud.example.com\n service: https://192.168.1.101:443 # Nextcloud\n originRequest:\n noTLSVerify: true\n - hostname: media.example.com\n service: http://192.168.1.102:8096 # Jellyfin\n - service: http_status:404\n\nIntégration avec Cloudflare Access
\n\nPour ajouter une couche d'authentification devant vos services exposés via tunnel, Cloudflare Access est l'outil complémentaire naturel. Il permet de restreindre l'accès selon :
\n- \n
- Adresse email (liste blanche) \n
- Fournisseur d'identité (Google, Azure AD, Okta, GitHub) \n
- Règles IP \n
- Certificats mTLS \n
Cette combinaison Tunnel + Access constitue la base d'une architecture Zero Trust conforme aux exigences NIS 2 pour les accès à distance sécurisés.
\n\nPour aller plus loin sur la sécurisation des accès web, consultez notre article sur la sécurisation WordPress qui aborde des problématiques similaires d'exposition de services.
\n\nFAQ — Cloudflare Tunnel
\n\nCloudflare Tunnel est-il vraiment gratuit ?
\nOui, Cloudflare Tunnel est gratuit pour les cas d'usage HTTP/HTTPS. Le plan gratuit Zero Trust inclut jusqu'à 50 utilisateurs pour Cloudflare Access. Les fonctionnalités avancées comme l'accès SSH via navigateur (SSH Rendered in Browser), les certificats SSH short-lived, et les politiques d'accès complexes nécessitent un plan payant (Teams Standard ou Enterprise). La bande passante reste illimitée sur tous les plans pour les tunnels HTTP/HTTPS.
\n\nCloudflare peut-il lire le trafic qui passe par mon tunnel ?
\nCloudflare voit le trafic HTTP/HTTPS non chiffré entre son réseau et votre serveur (c'est-à-dire après déchiffrement TLS côté Cloudflare). C'est inhérent au modèle de CDN/proxy. Si vous avez des exigences de confidentialité absolue (données médicales HIPAA, données financières), utilisez le mode "No TLS Termination" ou évaluez si Cloudflare Tunnel est adapté à votre contexte réglementaire. Pour les services critiques soumis à des réglementations strictes, consultez les certifications de Cloudflare (ISO 27001, SOC 2 Type II).
\n\nQue se passe-t-il si cloudflared tombe en panne ?
\nSi le processus cloudflared s'arrête, le service exposé devient inaccessible depuis Internet — mais aucune connexion entrante non souhaitée n'est possible pour autant. En mode service systemd, le processus redémarre automatiquement (directive Restart=on-failure). Pour une haute disponibilité, vous pouvez exécuter plusieurs instances de cloudflared pointant vers le même tunnel : Cloudflare équilibrera automatiquement la charge entre elles et basculera en cas de panne d'une instance.
Cloudflare Tunnel peut-il exposer des protocoles autres que HTTP ?
\nOui, cloudflared supporte HTTP, HTTPS, SSH, RDP et les protocoles TCP arbitraires (via Cloudflare Spectrum sur les plans payants). Pour SSH et RDP, le client doit également avoir cloudflared installé pour la partie proxy. Pour les protocoles TCP bruts (MySQL, Redis, etc.), Cloudflare Spectrum est nécessaire et facturé séparément. Une alternative est d'utiliser un tunnel SSH comme bastion et de tunneliser les connexions TCP à travers SSH.
Comment sécuriser un tunnel Cloudflare contre les abus ?
\nPlusieurs couches de sécurité sont recommandées : (1) Combinaison avec Cloudflare Access pour l'authentification des utilisateurs, (2) Activation du WAF Cloudflare pour filtrer les attaques applicatives, (3) Règles de rate limiting pour limiter les tentatives de force brute, (4) Restrictions d'IP si votre pool d'utilisateurs est connu, (5) Audit régulier des logs d'accès via Cloudflare Analytics ou Logpush. Pour les services critiques, l'audit régulier des vulnérabilités des services exposés est indispensable.
\n\nCloudflare Tunnel fonctionne-t-il avec IPv6 ?
\nOui, Cloudflare Tunnel supporte nativement IPv6. La connexion entre cloudflared et les datacenters Cloudflare utilise IPv4 ou IPv6 selon la disponibilité. Côté public, Cloudflare expose automatiquement votre service en IPv4 et IPv6 (dual-stack) si votre domaine est configuré en mode proxy (nuage orange) dans Cloudflare DNS. Votre backend local n'a pas besoin de supporter IPv6 — la traduction est gérée par Cloudflare.
Points clés à retenir
\n- \n
- Aucun port entrant nécessaire :
cloudflaredétablit des connexions sortantes uniquement — votre firewall peut rester totalement fermé aux connexions entrantes, réduisant drastiquement la surface d'attaque. \n - mTLS de bout en bout : la connexion entre
cloudflaredet Cloudflare est chiffrée et mutuellement authentifiée via mTLS, garantissant que seul votre agent légitime peut servir le trafic de votre tunnel. \n - TUNNEL_TOKEN pour Docker : en production conteneurisée, utilisez la variable d'environnement
TUNNEL_TOKENplutôt que les fichiers de credentials pour une gestion des secrets simplifiée et plus sécurisée. \n - Haute disponibilité native : lancez plusieurs instances de
cloudflaredpointant vers le même tunnel UUID pour une redondance automatique sans configuration supplémentaire de load balancer. \n - Combinaison Access + Tunnel = Zero Trust complet : Cloudflare Access ajoute l'authentification identitaire devant vos tunnels, permettant d'implémenter une architecture Zero Trust sans VPN traditionnel ni infrastructure PKI complexe. \n
- SSH sans port 22 exposé : l'utilisation de Cloudflare Tunnel pour SSH est la méthode la plus sécurisée d'accès administratif à distance, éliminant les attaques par force brute sur SSH et facilitant la conformité avec les exigences d'audit. \n
- Kubernetes natif : le contrôleur Ingress officiel de Cloudflare Tunnel s'intègre nativement dans les workflows Kubernetes, permettant une gestion déclarative des expositions de services via des annotations sur les ressources Ingress standard. \n
Cloudflare Tunnel s'inscrit dans une stratégie de sécurité en profondeur. Pour une protection complète de votre infrastructure, consultez également notre guide sur le scanner de sécurité WordPress et notre page dédiée au pentest cloud.
\n\nLa documentation complète de Cloudflare Tunnel est disponible sur developers.cloudflare.com — Connect Networks. Pour les configurations de routage avancées, consultez la documentation de routing Cloudflare Tunnel.
À propos de l'auteur
Ayi NEDJIMI
Auditeur Senior Cybersécurité & Consultant IA
Expert Judiciaire — Cour d'Appel de Paris
Habilitation Confidentiel Défense
ayi@ayinedjimi-consultants.fr
Ayi NEDJIMI est un vétéran de la cybersécurité avec plus de 25 ans d'expérience sur des missions critiques. Ancien développeur Microsoft à Redmond sur le module GINA (Windows NT4) et co-auteur de la version française du guide de sécurité Windows NT4 pour la NSA.
À la tête d'Ayi NEDJIMI Consultants, il réalise des audits Lead Auditor ISO 42001 et ISO 27001, des pentests d'infrastructures critiques, du forensics et des missions de conformité NIS2 / AI Act.
Conférencier international (Europe & US), il a formé plus de 10 000 professionnels.
Domaines d'expertise
Ressources & Outils de l'auteur
Testez vos connaissances
Mini-quiz de certification lié à cet article — propulsé par CertifExpress
Articles connexes
Un projet cybersécurité ? Parlons-en.
Pentest, conformité NIS 2, ISO 27001, audit IA, RSSI externalisé… nos experts répondent sous 24h pour évaluer votre besoin.
Commentaires
Aucun commentaire pour le moment. Soyez le premier à commenter !
Laisser un commentaire