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 à :
- Ouvrir le port dans le firewall (UFW, iptables…)
- Configurer un reverse proxy (Nginx, Caddy…)
- Obtenir un certificat SSL (Let's Encrypt…)
- Gérer le renouvellement du certificat
- 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 :
cloudflared(le client tunnel) tourne sur votre VPS- Il établit une connexion sortante vers Cloudflare
- Cloudflare route le trafic entrant vers votre tunnel
- Votre service reste sur
localhost— aucun 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.
cloudflaredconsomme 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
ingressdoit toujours être un catch-all sanshostname. 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 :
- Allez dans Cloudflare Dashboard → Zero Trust → Access → Applications
- Créez une application :
- Type : Self-hosted
- Subdomain :
admin.mondomaine.com - 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 Trust → Networks → Tunnels, 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
- Qu'est-ce qu'OpenClaw ? — Comprendre l'agent IA qui peut gérer vos services
- Installer OpenClaw sur un VPS — Déployer votre agent sur un serveur dédié
- Sécuriser OpenClaw — Bonnes pratiques de sécurité pour votre agent
- Configurer OpenClaw — Personnaliser votre installation
- Hébergement VPS Hostinger — VPS performants à prix réduit (-20%)
- Automatiser sa vie avec l'IA — Aller plus loin dans l'automatisation