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.

\n\n

Qu'est-ce que Cloudflare Tunnel et pourquoi l'utiliser

\n\n

Cloudflare 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\n

L'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.

\n\n

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
\n\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\n

Prérequis avant l'installation

\n\n

Avant de configurer Cloudflare Tunnel, vous avez besoin des éléments suivants :

\n\n

Compte et domaine Cloudflare

\n

Un 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\n

Machine hôte

\n

L'agent cloudflared est compatible avec :

\n
    \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
\n\n

Accès réseau sortant

\n

La 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\n

Service à exposer

\n

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

\n\n

Installation de cloudflared

\n\n

L'installation de cloudflared varie selon le système d'exploitation. Voici les méthodes recommandées pour chaque plateforme.

\n\n

Linux — Installation via le dépôt officiel

\n\n

Pour 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\n

Pour les distributions basées sur RPM (CentOS, RHEL, Fedora) :

\n\n
curl -L https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo\nsudo yum install cloudflared
\n\n

Installation en tant que service systemd

\n\n

Pour 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\n

Windows — 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\n

Docker

\n\n
docker run -d --name cloudflared   -v ~/.cloudflared:/etc/cloudflared   cloudflare/cloudflared:latest   tunnel --config /etc/cloudflared/config.yml run
\n\n

La documentation officielle d'installation est disponible sur developers.cloudflare.com — Get Started with Cloudflare Tunnel.

\n\n

Créer et configurer un tunnel

\n\n

Une fois cloudflared installé et authentifié, la création d'un tunnel se fait en quelques commandes.

\n\n

Authentification

\n\n
cloudflared tunnel login
\n\n

Cette 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/.

\n\n

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\n

Fichier config.yaml

\n\n

Créez le fichier de configuration à ~/.cloudflared/config.yml :

\n\n
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\n

Créer l'enregistrement DNS

\n\n
# Créer un CNAME DNS automatiquement\ncloudflared tunnel route dns mon-service-web monservice.example.com
\n\n

Dé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\n

Router un service web vers le tunnel

\n\n

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

\n\n

Service HTTP simple

\n\n
ingress:\n  - hostname: web.example.com\n    service: http://localhost:80\n    originRequest:\n      noTLSVerify: false\n      connectTimeout: 30s
\n\n

Service HTTPS avec certificat auto-signé

\n\n
ingress:\n  - hostname: secure.example.com\n    service: https://localhost:443\n    originRequest:\n      noTLSVerify: true  # Si certificat auto-signé en local
\n\n

Accès SSH via le tunnel

\n\n
ingress:\n  - hostname: ssh.example.com\n    service: ssh://localhost:22
\n\n

Pour SSH, le client doit également avoir cloudflared installé et utiliser une commande ProxyCommand spéciale (voir section dédiée ci-dessous).

\n\n

Accès RDP

\n\n
ingress:\n  - hostname: rdp.example.com\n    service: rdp://localhost:3389
\n\n

Règles avancées avec path-based routing

\n\n
ingress:\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\n

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

\n\n

Tunnel avec Docker Compose

\n\n

Pour 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\n
version: '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\n

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

\n\n

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\n

Dans le fichier .env de votre projet Docker Compose :

\n
CLOUDFLARE_TUNNEL_TOKEN=eyJhIjoiM...
\n\n

Configuration réseau dans Docker

\n\n

Lorsque cloudflared et votre application sont dans le même réseau Docker, utilisez le nom du service comme hostname :

\n\n
ingress:\n  - hostname: monapp.example.com\n    service: http://app:80  # 'app' = nom du service Docker\n  - service: http_status:404
\n\n

Accès SSH sécurisé via Cloudflare Tunnel

\n\n

L'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\n

La 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\n

Configuration 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\n

Configuration côté client

\n\n

Sur la machine client, installez cloudflared puis ajoutez dans ~/.ssh/config :

\n\n
Host ssh.mondomaine.com\n    ProxyCommand cloudflared access ssh --hostname %h\n    User votre-utilisateur\n    IdentityFile ~/.ssh/id_ed25519
\n\n

La connexion SSH se fait ensuite normalement :

\n\n
ssh ssh.mondomaine.com
\n\n

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

\n\n

Authentification avec certificats short-lived

\n\n

En 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\n

Surveillance et rotation des credentials

\n\n

La gestion des credentials d'un tunnel Cloudflare est un aspect critique de la sécurité opérationnelle.

\n\n

Fichiers de credentials

\n\n

Chaque 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 :

\n\n
chmod 600 ~/.cloudflared/*.json\nchown root:root ~/.cloudflared/*.json
\n\n

Surveiller 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\n

Logs 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\n

Rotation des credentials

\n\n

En 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\n

Cette 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\n

Alertes Cloudflare

\n\n

Dans 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
\n\n

Cas d'usage avancés : Kubernetes, homelab, self-hosted

\n\n

Cloudflare Tunnel s'adapte à des architectures de plus en plus complexes.

\n\n

Kubernetes Ingress Controller

\n\n

Cloudflare 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\n

Pour 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\n

Homelab et self-hosted applications

\n\n

Pour 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
\n\n

La configuration multi-service dans un seul fichier config.yml permet de gérer toute une infrastructure domestique :

\n\n
ingress:\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\n

Intégration avec Cloudflare Access

\n\n

Pour 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
\n\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\n

Pour 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\n

FAQ — Cloudflare Tunnel

\n\n

Cloudflare Tunnel est-il vraiment gratuit ?

\n

Oui, 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\n

Cloudflare peut-il lire le trafic qui passe par mon tunnel ?

\n

Cloudflare 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\n

Que se passe-t-il si cloudflared tombe en panne ?

\n

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

\n\n

Cloudflare Tunnel peut-il exposer des protocoles autres que HTTP ?

\n

Oui, 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.

\n\n

Comment sécuriser un tunnel Cloudflare contre les abus ?

\n

Plusieurs 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\n

Cloudflare Tunnel fonctionne-t-il avec IPv6 ?

\n

Oui, 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.

\n\n
\n

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 cloudflared et 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_TOKEN plutô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 cloudflared pointant 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
\n
\n\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\n

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