📑 Table des matières

Cloudflare Tunnel : exposer ses services sans ouvrir de ports

Self-Hosting 🟡 Intermédiaire ⏱️ 13 min de lecture 📅 2026-02-24

Vous avez déployé une API, un dashboard ou un webhook sur votre VPS… mais comment y accéder depuis Internet sans exposer vos ports ? La réponse tient en deux mots : Cloudflare Tunnel. Gratuit, sécurisé, et redoutablement efficace.

Dans ce guide complet, nous allons voir comment exposer n'importe quel service local à travers un tunnel chiffré, sans toucher à votre firewall, avec SSL automatique et protection DDoS incluse.

🤔 Le problème : exposer un service sans se mettre en danger

Quand vous lancez une application sur un VPS (une API FastAPI sur le port 8000, un dashboard admin sur le port 3000, un webhook sur le port 5000…), elle n'est accessible que localement.

Pour la rendre accessible depuis Internet, la méthode classique consiste à :

  1. Ouvrir le port dans le firewall (UFW, iptables…)
  2. Configurer un reverse proxy (Nginx, Caddy…)
  3. Obtenir un certificat SSL (Let's Encrypt…)
  4. Gérer le renouvellement du certificat
  5. Se protéger contre les attaques DDoS

Chaque étape ajoute de la complexité et des risques :

Risque Description
Ports ouverts Chaque port ouvert est une surface d'attaque potentielle
Mauvaise config Nginx Headers manquants, TLS mal configuré, fuite d'infos serveur
Certificat expiré Service inaccessible, erreurs navigateur
DDoS Un VPS standard ne résiste pas à une attaque volumétrique
Scan de ports Les bots scannent en permanence les IP publiques

Et si vous pouviez tout éviter ?

🚀 La solution : Cloudflare Tunnel (ex-Argo Tunnel)

Cloudflare Tunnel crée une connexion sortante depuis votre serveur vers le réseau Cloudflare. Aucun port entrant n'est nécessaire.

⚙️ Comment ça marche

[Utilisateur]  [Cloudflare Edge]  tunnel chiffré  [cloudflared sur votre VPS]  [localhost:8000]

Le flux est inversé par rapport à un serveur classique :

  1. cloudflared (le client tunnel) tourne sur votre VPS
  2. Il établit une connexion sortante vers Cloudflare
  3. Cloudflare route le trafic entrant vers votre tunnel
  4. Votre service reste sur localhostaucun port ouvert

✅ Avantages

Feature Classique (Nginx + Let's Encrypt) Cloudflare Tunnel
Ports à ouvrir 80, 443 + ports services Aucun (0)
SSL Let's Encrypt (config manuelle) Automatique
Protection DDoS Aucune (ou payante) Incluse gratuitement
Reverse proxy Nginx/Caddy à configurer Intégré
Difficulté Intermédiaire à avancé Débutant à intermédiaire
Coût Gratuit Gratuit
Zero Trust Non Oui (Access policies)

🛠️ Prérequis

Avant de commencer, vous aurez besoin de :

  • Un VPS avec Linux (Ubuntu/Debian recommandé) — Hostinger propose d'excellents VPS à partir de 3,99€/mois avec 20% de remise
  • Un nom de domaine pointé vers Cloudflare (nameservers Cloudflare)
  • Un compte Cloudflare (gratuit)
  • Un service local qui tourne (API, site, dashboard…)

💡 Astuce VPS : Pour un tunnel Cloudflare, même un petit VPS suffit. cloudflared consomme très peu de ressources (~20 Mo de RAM). Hostinger est idéal pour débuter avec un excellent rapport qualité/prix.

📥 Étape 1 : Installer cloudflared

🐧 Sur Ubuntu/Debian

# Ajouter le dépôt officiel Cloudflare
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list

sudo apt update && sudo apt install -y cloudflared

✔️ Vérifier l'installation

cloudflared --version
# cloudflared version 2025.x.x (built ...)

📦 Alternative : binaire direct

# Si le dépôt pose problème
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared

🔐 Étape 2 : Authentification

Connectez-vous à votre compte Cloudflare :

cloudflared tunnel login

Cette commande ouvre un lien dans le terminal. Copiez-le dans votre navigateur, sélectionnez le domaine à utiliser, et autorisez.

Un certificat sera sauvegardé dans ~/.cloudflared/cert.pem.

# Vérifier que le certificat existe
ls -la ~/.cloudflared/cert.pem

🏗️ Étape 3 : Créer le tunnel

# Créer un tunnel nommé
cloudflared tunnel create mon-tunnel

# Sortie attendue :
# Tunnel credentials written to /root/.cloudflared/<UUID>.json
# Created tunnel mon-tunnel with id <UUID>

📝 Important : Notez le UUID du tunnel. Vous en aurez besoin pour la configuration.

Listez vos tunnels :

cloudflared tunnel list

# ID                                   NAME        CREATED
# a1b2c3d4-e5f6-7890-abcd-ef1234567890 mon-tunnel  2026-02-24T10:00:00Z

⚙️ Étape 4 : Configurer le tunnel

Créez le fichier de configuration :

nano ~/.cloudflared/config.yml

📝 Configuration simple (un seul service)

tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json

ingress:
  - hostname: api.mondomaine.com
    service: http://localhost:8000
  - service: http_status:404

🔀 Configuration multi-services

tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json

ingress:
  # API FastAPI
  - hostname: api.mondomaine.com
    service: http://localhost:8000
    originRequest:
      connectTimeout: 10s
      noTLSVerify: true

  # Dashboard admin
  - hostname: admin.mondomaine.com
    service: http://localhost:3000
    originRequest:
      connectTimeout: 10s

  # Webhook receiver
  - hostname: webhook.mondomaine.com
    service: http://localhost:5000

  # Catch-all (obligatoire, doit être en dernier)
  - service: http_status:404

⚠️ Règle importante : La dernière entrée ingress doit toujours être un catch-all sans hostname. C'est obligatoire.

✅ Valider la configuration

cloudflared tunnel ingress validate
# OK

🌐 Étape 5 : Configurer le DNS

Pour chaque hostname dans votre config, créez un enregistrement DNS CNAME :

# Méthode automatique (recommandée)
cloudflared tunnel route dns mon-tunnel api.mondomaine.com
cloudflared tunnel route dns mon-tunnel admin.mondomaine.com
cloudflared tunnel route dns mon-tunnel webhook.mondomaine.com

Cela crée automatiquement des enregistrements CNAME dans votre zone Cloudflare :

Type Nom Contenu Proxy
CNAME api a1b2c3d4-...cfargotunnel.com ✅ Proxied
CNAME admin a1b2c3d4-...cfargotunnel.com ✅ Proxied
CNAME webhook a1b2c3d4-...cfargotunnel.com ✅ Proxied

▶️ Étape 6 : Lancer le tunnel

🧪 Test manuel

cloudflared tunnel run mon-tunnel

Vous devriez voir :

2026-02-24T10:30:00Z INF Starting tunnel tunnelID=a1b2c3d4-...
2026-02-24T10:30:00Z INF Connection registered connIndex=0 ...
2026-02-24T10:30:00Z INF Connection registered connIndex=1 ...
2026-02-24T10:30:01Z INF Connection registered connIndex=2 ...
2026-02-24T10:30:01Z INF Connection registered connIndex=3 ...

4 connexions = le tunnel est opérationnel ! Testez dans votre navigateur : https://api.mondomaine.com

🏭 En tant que service systemd (production)

# Installer le service
sudo cloudflared service install

# Vérifier
sudo systemctl status cloudflared

# Le service utilise la config dans /etc/cloudflared/config.yml
# Copiez votre config si nécessaire :
sudo cp ~/.cloudflared/config.yml /etc/cloudflared/config.yml
sudo cp ~/.cloudflared/*.json /etc/cloudflared/

# Redémarrer
sudo systemctl restart cloudflared
sudo systemctl enable cloudflared

Vérifiez que le service démarre au boot :

sudo systemctl is-enabled cloudflared
# enabled

🐍 Cas d'usage 1 : Exposer une API FastAPI

Imaginons que vous développez une API IA avec FastAPI :

# api.py
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(title="Mon API IA")

class Query(BaseModel):
    prompt: str
    max_tokens: int = 500

@app.get("/health")
def health():
    return {"status": "ok", "version": "1.0.0"}

@app.post("/generate")
async def generate(query: Query):
    # Votre logique IA ici
    return {
        "response": f"Réponse générée pour: {query.prompt}",
        "tokens_used": 42
    }

Lancez l'API :

uvicorn api:app --host 127.0.0.1 --port 8000

Configuration tunnel :

ingress:
  - hostname: api.mondomaine.com
    service: http://localhost:8000
    originRequest:
      connectTimeout: 30s  # Plus long pour les requêtes IA
  - service: http_status:404

Votre API est maintenant accessible sur https://api.mondomaine.com avec SSL automatique !

# Test depuis n'importe où
curl https://api.mondomaine.com/health
# {"status":"ok","version":"1.0.0"}

curl -X POST https://api.mondomaine.com/generate \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Hello IA", "max_tokens": 100}'

📊 Cas d'usage 2 : Dashboard admin protégé

Pour un dashboard admin (Streamlit, Grafana, ou custom), vous voulez une couche d'authentification supplémentaire.

Cloudflare Access (Zero Trust)

Cloudflare offre gratuitement (jusqu'à 50 utilisateurs) un système d'authentification :

  1. Allez dans Cloudflare DashboardZero TrustAccessApplications
  2. Créez une application :
  3. Type : Self-hosted
  4. Subdomain : admin.mondomaine.com
  5. Policy : Allow emails [email protected]

Maintenant, quand quelqu'un accède à admin.mondomaine.com, il doit d'abord s'authentifier via Cloudflare Access. Même si votre dashboard n'a pas de login, il est protégé.

# config.yml - le dashboard est sur localhost:8501 (Streamlit)
ingress:
  - hostname: admin.mondomaine.com
    service: http://localhost:8501
    originRequest:
      noTLSVerify: true
  - service: http_status:404

Vérifier le header JWT dans votre app

Cloudflare Access ajoute un header Cf-Access-Jwt-Assertion à chaque requête. Vous pouvez le vérifier côté serveur :

from fastapi import Request, HTTPException
import jwt
import requests

CLOUDFLARE_TEAM = "votre-team"
CERTS_URL = f"https://{CLOUDFLARE_TEAM}.cloudflareaccess.com/cdn-cgi/access/certs"

def verify_cloudflare_token(request: Request):
    token = request.headers.get("Cf-Access-Jwt-Assertion")
    if not token:
        raise HTTPException(status_code=403, detail="No access token")

    # Récupérer les clés publiques
    certs = requests.get(CERTS_URL).json()
    public_keys = certs["public_certs"]

    for key_data in public_keys:
        try:
            decoded = jwt.decode(
                token,
                key=jwt.algorithms.RSAAlgorithm.from_jwk(key_data["cert"]),
                algorithms=["RS256"],
                audience=f"https://admin.mondomaine.com"
            )
            return decoded
        except jwt.InvalidTokenError:
            continue

    raise HTTPException(status_code=403, detail="Invalid token")

🔗 Cas d'usage 3 : Webhook receiver

Les webhooks (GitHub, Stripe, Telegram…) nécessitent une URL publique HTTPS. Cloudflare Tunnel est parfait pour ça :

# webhook.py
from fastapi import FastAPI, Request
import hmac
import hashlib

app = FastAPI()
WEBHOOK_SECRET = "votre_secret_ici"

@app.post("/github")
async def github_webhook(request: Request):
    body = await request.body()
    signature = request.headers.get("X-Hub-Signature-256", "")

    # Vérifier la signature
    expected = "sha256=" + hmac.new(
        WEBHOOK_SECRET.encode(),
        body,
        hashlib.sha256
    ).hexdigest()

Pour aller plus loin sur ce sujet, consultez notre guide [VPS + IA : le setup complet pour tout auto-héberger](/article/vps-ia-setup-complet-self-hosting).

    if not hmac.compare_digest(signature, expected):
        return {"error": "Invalid signature"}, 403

Pour aller plus loin sur ce sujet, consultez notre guide [APIs IA : OpenRouter vs appels directs](/article/apis-ia-openrouter-vs-appels-directs).

    payload = await request.json()
    event = request.headers.get("X-GitHub-Event")

    print(f"GitHub event: {event}")
    # Traiter l'événement...

    return {"status": "ok"}

@app.post("/stripe")
async def stripe_webhook(request: Request):
    # Traiter les événements Stripe
    payload = await request.json()
    return {"received": True}
ingress:
  - hostname: webhook.mondomaine.com
    service: http://localhost:5000
    originRequest:
      connectTimeout: 10s
  - service: http_status:404

🔒 Sécurité avancée : verrouiller votre VPS

Maintenant que tout passe par Cloudflare Tunnel, vous pouvez fermer tous les ports sauf SSH :

# Politique par défaut : tout bloquer
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Garder SSH (important !)
sudo ufw allow 22/tcp

# C'est tout ! Pas de 80, pas de 443, pas de 8000...
sudo ufw enable
sudo ufw status

# Status: active
# To                         Action      From
# --                         ------      ----
# 22/tcp                     ALLOW       Anywhere

Votre VPS n'a plus qu'un seul port ouvert : SSH. Tout le reste passe par le tunnel.

Aller plus loin : restreindre SSH aussi

# SSH uniquement depuis votre IP
sudo ufw delete allow 22/tcp
sudo ufw allow from VOTRE_IP to any port 22 proto tcp

# Ou encore mieux : SSH via Cloudflare Tunnel aussi !

Configuration SSH via tunnel :

ingress:
  - hostname: ssh.mondomaine.com
    service: ssh://localhost:22
  - hostname: api.mondomaine.com
    service: http://localhost:8000
  - service: http_status:404

Puis côté client :

# ~/.ssh/config
Host mon-vps
    HostName ssh.mondomaine.com
    ProxyCommand cloudflared access ssh --hostname %h
    User root

🔍 Monitoring et debugging

Vérifier l'état du tunnel

# Status du service
sudo systemctl status cloudflared

# Logs en temps réel
sudo journalctl -u cloudflared -f

# Métriques (si activées)
cloudflared tunnel info mon-tunnel

Problèmes courants

Problème Cause Solution
502 Bad Gateway Service local arrêté Vérifiez que votre app tourne sur le bon port
ERR_CONNECTION_TIMED_OUT DNS mal configuré Relancez cloudflared tunnel route dns
error="connection refused" Mauvais port dans config.yml Vérifiez service: http://localhost:PORT
Tunnel se déconnecte Réseau instable Le service systemd redémarre auto
failed to connect to origin noTLSVerify manquant Ajoutez noTLSVerify: true si service en HTTPS local

Logs détaillés

# Lancer avec debug
cloudflared tunnel --loglevel debug run mon-tunnel

# Ou dans la config
# loglevel: debug

🔧 Configuration avancée

Timeouts et performances

Ajustez les timeouts selon le type de service :

# config.yml — configuration optimisée
tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json

# Options globales
originRequest:
  connectTimeout: 10s
  tlsTimeout: 10s
  tcpKeepAlive: 30s
  keepAliveConnections: 100
  keepAliveTimeout: 90s
  httpHostHeader: ""
  originServerName: ""

ingress:
  # API avec réponses rapides
  - hostname: api.mondomaine.com
    service: http://localhost:8000
    originRequest:
      connectTimeout: 10s
      noTLSVerify: false

  # Service IA (réponses lentes, streaming)
  - hostname: ai.mondomaine.com
    service: http://localhost:8080
    originRequest:
      connectTimeout: 120s   # 2 min pour les requêtes IA longues
      noTLSVerify: false

  # WebSocket (chat, notifications temps réel)
  - hostname: ws.mondomaine.com
    service: http://localhost:3001
    originRequest:
      connectTimeout: 10s
      # Les WebSockets sont supportés nativement

  # Fichiers statiques
  - hostname: static.mondomaine.com
    service: http://localhost:8888
    originRequest:
      connectTimeout: 5s

  - service: http_status:404

Headers personnalisés

Ajoutez des headers pour identifier le trafic tunnel :

ingress:
  - hostname: api.mondomaine.com
    service: http://localhost:8000
    originRequest:
      httpHostHeader: "api.mondomaine.com"
      # Headers ajoutés automatiquement par cloudflared :
      # Cf-Connecting-Ip: IP réelle du visiteur
      # X-Forwarded-For: IP du visiteur
      # X-Forwarded-Proto: https
  - service: http_status:404

Côté application, récupérez l'IP réelle :

from fastapi import FastAPI, Request

app = FastAPI()

@app.get("/info")
def info(request: Request):
    return {
        "real_ip": request.headers.get("cf-connecting-ip", "unknown"),
        "country": request.headers.get("cf-ipcountry", "unknown"),
        "protocol": request.headers.get("x-forwarded-proto", "http"),
    }

Métriques et observabilité

Activez les métriques Prometheus de cloudflared :

# Dans config.yml, ajoutez au niveau racine :
metrics: localhost:2000

# Puis accédez aux métriques :
# curl http://localhost:2000/metrics

Métriques disponibles :

Métrique Description
cloudflared_tunnel_total_requests Nombre total de requêtes
cloudflared_tunnel_request_errors Nombre d'erreurs
cloudflared_tunnel_concurrent_requests Requêtes en cours
cloudflared_tunnel_response_by_code Réponses par code HTTP
cloudflared_tunnel_request_duration Latence des requêtes

🐛 Troubleshooting avancé

Diagnostic étape par étape

Quand quelque chose ne marche pas, suivez cet arbre de décision :

Le site affiche une erreur ?
├── "502 Bad Gateway"
│   ├── Le service local tourne-t-il ?
│   │   └── curl http://localhost:PORT → Si erreur, redémarrez le service
│   ├── Le port est-il correct dans config.yml ?
│   │   └── Vérifiez : grep "service:" ~/.cloudflared/config.yml
│   └── Le service est-il en HTTPS local ?
│       └── Ajoutez noTLSVerify: true dans originRequest
│
├── "ERR_NAME_NOT_RESOLVED"
│   ├── Le DNS est-il configuré ?
│   │   └── dig api.mondomaine.com → Doit pointer vers *.cfargotunnel.com
│   └── Relancez : cloudflared tunnel route dns mon-tunnel api.mondomaine.com

├── "ERR_CONNECTION_TIMED_OUT"
│   ├── Le tunnel tourne-t-il ?
│   │   └── systemctl status cloudflared
│   ├── Les credentials sont-ils valides ?
│   │   └── Vérifiez /etc/cloudflared/ contient le bon .json
│   └── Le firewall bloque-t-il le trafic sortant ?
│       └── cloudflared a besoin de sortir vers *.cloudflare.com
│
├── "1033: Argo Tunnel error"
│   ├── Le tunnel existe-t-il encore ?
│   │   └── cloudflared tunnel list
│   └── Recréez si nécessaire : cloudflared tunnel delete + create
│
└── "Access denied" (avec Cloudflare Access)
    ├── Votre email est-il dans la policy ?
    └── Le cookie d'accès est-il expiré ? Reconnectez-vous.

Commandes de diagnostic utiles

# 1. Vérifier que cloudflared peut se connecter
cloudflared tunnel run --loglevel debug mon-tunnel 2>&1 | head -50

# 2. Vérifier le DNS
dig +short api.mondomaine.com
# Devrait retourner : a1b2c3d4-....cfargotunnel.com

# 3. Tester le service local
curl -v http://localhost:8000/health

# 4. Vérifier les connexions actives
ss -tlnp | grep cloudflared

# 5. Vérifier les logs du service
journalctl -u cloudflared --since "1 hour ago" --no-pager

# 6. Vérifier la config
cloudflared tunnel ingress validate

# 7. Lister les tunnels et leur état
cloudflared tunnel list

# 8. Informations détaillées sur un tunnel
cloudflared tunnel info mon-tunnel

Problèmes fréquents et solutions

Le tunnel se déconnecte régulièrement

# Vérifier la stabilité réseau
ping -c 100 1.1.1.1 | tail -5

# Si perte de paquets, vérifiez votre hébergeur
# Solutions :
# 1. Activer le retry automatique (natif dans le service systemd)
# 2. Ajouter un healthcheck
# Script de monitoring du tunnel
#!/bin/bash
# /root/scripts/check-tunnel.sh

if ! systemctl is-active --quiet cloudflared; then
    echo "$(date) - Tunnel DOWN, restart..." >> /var/log/tunnel-monitor.log
    systemctl restart cloudflared
    # Optionnel : alerte
    curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage"       -d "chat_id=$CHAT_ID"       -d "text=🚨 Tunnel cloudflared redémarré automatiquement"
fi
# Ajouter en cron (toutes les 5 minutes)
echo "*/5 * * * * /root/scripts/check-tunnel.sh" | crontab -

Latence élevée sur les requêtes

# Vérifier le datacenter Cloudflare utilisé
curl -s https://api.mondomaine.com/cdn-cgi/trace | grep colo
# colo=CDG  (Paris)

# Si le datacenter est loin, c'est un problème de routage Cloudflare
# Solution : contacter le support ou vérifier vos DNS settings

Migration vers un nouveau serveur

# Sur l'ancien serveur : exporter les credentials
cp ~/.cloudflared/cert.pem /tmp/
cp ~/.cloudflared/*.json /tmp/
cp ~/.cloudflared/config.yml /tmp/

# Sur le nouveau serveur :
# 1. Installer cloudflared
# 2. Copier les fichiers
mkdir -p ~/.cloudflared/
cp /tmp/cert.pem ~/.cloudflared/
cp /tmp/*.json ~/.cloudflared/
cp /tmp/config.yml ~/.cloudflared/

# 3. Installer et démarrer le service
sudo cloudflared service install
sudo systemctl start cloudflared

# Pas besoin de changer le DNS ! Le tunnel reprend automatiquement.

📋 Récapitulatif : la checklist complète

✅ 1. VPS avec Linux (Hostinger recommandé)
✅ 2. Domaine pointé vers Cloudflare (nameservers)
✅ 3. cloudflared installé
✅ 4. Authentification (cloudflared tunnel login)
✅ 5. Tunnel créé (cloudflared tunnel create)
✅ 6. config.yml rédigé
✅ 7. DNS configuré (cloudflared tunnel route dns)
✅ 8. Test manuel réussi
✅ 9. Service systemd installé et activé
✅ 10. Firewall verrouillé (UFW)
✅ 11. Cloudflare Access configuré (optionnel)

💡 Astuces et bonnes pratiques

1. Nommez vos tunnels intelligemment

# ❌ Mauvais
cloudflared tunnel create tunnel1

# ✅ Bon
cloudflared tunnel create prod-api-fastapi
cloudflared tunnel create staging-dashboard

2. Un tunnel par environnement

Séparez production et staging :

cloudflared tunnel create prod-services
cloudflared tunnel create staging-services

3. Utilisez les variables d'environnement

# Au lieu de hardcoder dans config.yml
export TUNNEL_ID="a1b2c3d4-..."
export TUNNEL_CRED="/root/.cloudflared/${TUNNEL_ID}.json"

4. Surveillez vos tunnels

Dans le dashboard Cloudflare → Zero TrustNetworksTunnels, vous pouvez voir :
- L'état de chaque tunnel (Healthy/Degraded/Down)
- Les connexions actives
- Le trafic en temps réel

5. Backup de vos credentials

# Les fichiers critiques
cp ~/.cloudflared/cert.pem ~/backup/
cp ~/.cloudflared/*.json ~/backup/

# Sans ces fichiers, vous devrez recréer le tunnel

🆚 Cloudflare Tunnel vs alternatives

Solution Ports ouverts SSL auto DDoS protection Coût Difficulté
Cloudflare Tunnel ❌ 0 Gratuit ⭐⭐
Nginx + Let's Encrypt ✅ 80, 443 Gratuit ⭐⭐⭐
Caddy ✅ 80, 443 Gratuit ⭐⭐
ngrok ❌ 0 Freemium
Tailscale Funnel ❌ 0 Freemium ⭐⭐

Cloudflare Tunnel gagne sur presque tous les critères pour un usage production.

🎯 Conclusion

Cloudflare Tunnel transforme radicalement la façon d'exposer des services :

  • Zéro port ouvert = surface d'attaque minimale
  • SSL automatique = plus jamais de certificats expirés
  • DDoS protection gratuite = tranquillité d'esprit
  • Configuration simple = un fichier YAML et c'est parti
  • Zero Trust = authentification moderne incluse

Combiné avec un VPS Hostinger (performant et abordable), vous avez une infrastructure de production solide pour quelques euros par mois.

La prochaine étape ? Combiner Cloudflare Tunnel avec OpenClaw pour exposer votre agent IA en toute sécurité. Votre agent peut même gérer le tunnel pour vous — bienvenue dans l'automatisation intelligente.

📚 Articles liés