Cloudflare Tunnel (cloudflared) permet d’exposer un service hébergé sur votre VPS, dans un réseau privé, ou même sur votre laptop, sans IP publique ni port ouvert. Le service appelle Cloudflare en sortie et reçoit le trafic public via ce tunnel. Sécurité maximum, zero attack surface côté origin.
Voir notre guide Cloudflare.
Pourquoi Tunnel
- Pas d’IP publique exposée
- Pas de port 80/443 ouvert sur firewall
- Pas de besoin de DDNS pour IP dynamique (laptop, home server)
- Authentification Cloudflare Access (Zero Trust) facilement intégrable
- Gratuit dans le plan Free
Étape 1 — Installer cloudflared
# Linux
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
# macOS
brew install cloudflared
# Vérifier
cloudflared --version
Étape 2 — Login et créer un tunnel
# Login (ouvre le navigateur)
cloudflared tunnel login
# Créer un tunnel
cloudflared tunnel create mon-tunnel
# > Tunnel credentials saved in /home/user/.cloudflared/UUID.json
# Lister
cloudflared tunnel list
Étape 3 — Configurer ingress
# ~/.cloudflared/config.yml
tunnel: UUID
credentials-file: /home/user/.cloudflared/UUID.json
ingress:
- hostname: app.exemple.sn
service: http://localhost:3000
- hostname: db-admin.exemple.sn
service: http://localhost:8080
- service: http_status:404
Étape 4 — Route DNS et lancer
# Créer les CNAME automatiquement
cloudflared tunnel route dns mon-tunnel app.exemple.sn
cloudflared tunnel route dns mon-tunnel db-admin.exemple.sn
# Démarrer
cloudflared tunnel run mon-tunnel
# Service systemd
sudo cloudflared service install
sudo systemctl enable --now cloudflared
Étape 5 — Cloudflare Access (auth zero-trust)
Pour protéger un service interne, ajouter Cloudflare Access :
- Zero Trust dashboard → Applications → Add Application → Self-hosted
- Application domain :
db-admin.exemple.sn - Identity provider : Google, GitHub, OTP email, etc.
- Policy : « Allow only emails ending @exemple.sn »
Désormais, tout accès à db-admin.exemple.sn passe par auth Cloudflare. Plus besoin de VPN.
Cas d’usage typique
- Exposer Forgejo / NocoDB / Uptime Kuma sans port public
- Accéder à un home lab depuis l’extérieur
- Démos client sécurisées
- Accès admin à un VPS sans port 22 ouvert (alternative Tailscale SSH)
À lire ensuite
Tester ce setup sur votre propre serveur
Le moyen le plus rapide de tester ce tutoriel en conditions réelles : prendre un petit VPS Hostinger.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.
Etape 1 : pourquoi Cloudflare Tunnel pour un VPS au Senegal ou en Afrique de l’Ouest
Un VPS expose directement a Internet est cible par environ 1500 a 5000 tentatives de scan par jour, principalement sur les ports 22, 80, 443 et 3389. Cloudflare Tunnel (anciennement Argo Tunnel) supprime totalement le besoin d’IP publique : ton VPS initie une connexion sortante chiffree vers le reseau Cloudflare, et toutes les requetes legitimes arrivent par ce tunnel. Aucun port ouvert, aucun firewall a configurer, aucune adresse IP a divulguer.
Pour une PME basee a Dakar, Abidjan ou Cotonou qui heberge une application interne (Odoo, ERPNext, NextCloud, Gitea), c’est la solution la plus securisee et la plus economique : le service Cloudflare Tunnel est gratuit, meme sans plan payant. Seul le nom de domaine doit etre transfere ou delegue chez Cloudflare (gratuit, hors prix du domaine).
Etape 2 : preparer le compte Cloudflare et le domaine
Cree un compte sur dash.cloudflare.com avec un email professionnel et active la 2FA via TOTP. Ajoute ton domaine (par exemple entreprise-dakar.io) en plan Free et change les nameservers chez ton registrar (gandi.net, OVHcloud, Africaregistry, Namecheap). La propagation DNS prend 4 a 24 heures.
# Verifier que les NS Cloudflare sont actifs
dig NS entreprise-dakar.io +short
La sortie attendue contient deux noms du type ns-xxxx.cloudflare.com. Si tu vois encore les NS de l’ancien hebergeur, attends quelques heures avant de continuer. Sans cette etape, le tunnel ne pourra pas etre rattache a un sous-domaine.
Etape 3 : installer cloudflared sur le VPS
Le binaire cloudflared est l’agent qui maintient la connexion sortante. Sur un VPS Ubuntu 24.04 LTS chez Hostinger (4 EUR/mois, environ 2625 FCFA), Contabo ou Hetzner, on installe via le repo officiel pour beneficier des mises a jour automatiques.
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
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
cloudflared --version
La sortie indique « cloudflared version 2026.x.x » (la version evolue tous les mois). Si tu vois « command not found », verifie que /usr/local/bin est bien dans le PATH ou utilise le chemin complet /usr/bin/cloudflared.
Etape 4 : authentifier cloudflared avec ton compte
Lance la commande d’authentification : elle ouvre une URL a copier-coller dans ton navigateur (sur ta machine locale, pas le VPS). Si tu es en SSH sur un VPS sans navigateur, c’est normal : copie l’URL affichee et ouvre-la depuis ton laptop.
cloudflared tunnel login
Sur le navigateur, choisis le domaine entreprise-dakar.io et clique Authorize. Le binaire telecharge un certificat dans ~/.cloudflared/cert.pem. Ce fichier prouve que tu controles le domaine et permet de creer des tunnels rattaches. Garde-le secret, il est equivalent a une cle d’acces.
Etape 5 : creer un tunnel et obtenir le token UUID
Donne au tunnel un nom explicite, par exemple « vps-prod-dakar » :
cloudflared tunnel create vps-prod-dakar
cloudflared tunnel list
La sortie affiche l’UUID du tunnel et le chemin du fichier credentials JSON dans ~/.cloudflared/UUID.json. Ce JSON contient les secrets de connexion. Sauvegarde-le dans ton coffre-fort : sans lui, il faut recreer le tunnel et reconfigurer DNS, ce qui interrompt le service.
Etape 6 : ecrire le fichier de configuration ingress
cloudflared utilise un fichier YAML qui mappe chaque hostname a un service interne. Cree /etc/cloudflared/config.yml :
tunnel: UUID-DU-TUNNEL
credentials-file: /root/.cloudflared/UUID-DU-TUNNEL.json
ingress:
- hostname: app.entreprise-dakar.io
service: http://localhost:8080
- hostname: git.entreprise-dakar.io
service: http://localhost:3000
- hostname: admin.entreprise-dakar.io
service: http://localhost:8000
originRequest:
noTLSVerify: false
- service: http_status:404
La derniere ligne est un fallback obligatoire qui repond 404 a tout hostname non liste, ce qui evite que cloudflared crashe en cas de mauvaise config DNS. Verifie la syntaxe avec cloudflared tunnel ingress validate, qui doit afficher « Validation OK ».
Etape 7 : creer les enregistrements DNS Cloudflare
Pour chaque hostname du fichier ingress, cloudflared peut creer automatiquement un CNAME pointant vers le tunnel. C’est plus rapide et moins source d’erreur que la creation manuelle dans le dashboard.
cloudflared tunnel route dns vps-prod-dakar app.entreprise-dakar.io
cloudflared tunnel route dns vps-prod-dakar git.entreprise-dakar.io
cloudflared tunnel route dns vps-prod-dakar admin.entreprise-dakar.io
Chaque commande renvoie « Added CNAME … which will route to this tunnel ». Verifie dans le dashboard Cloudflare > DNS : les 3 entrees apparaissent en mode Proxied (nuage orange). Le proxy Cloudflare fournit automatiquement HTTPS valide via Let’s Encrypt et masque l’IP origine.
Etape 8 : lancer cloudflared en service systemd
Pour que le tunnel demarre automatiquement au boot et redemarre en cas de crash, on l’installe en service :
sudo cloudflared service install
sudo systemctl status cloudflared
sudo systemctl restart cloudflared
sudo journalctl -u cloudflared -f --since "5 min ago"
Le signal de reussite : les logs affichent « Connection registered » suivi de plusieurs lignes « Registered tunnel connection » avec des codes de region (par ex. cdg06 = Paris, jnb01 = Johannesburg). Cloudflared etablit 4 connexions simultanees pour la haute disponibilite. Si tu vois « failed to dial to edge », c’est generalement un firewall sortant qui bloque le port 7844 UDP.
Etape 9 : durcir avec Cloudflare Access (Zero Trust)
Le tunnel publie ton service sur HTTPS, mais il reste accessible a tout visiteur. Pour les services internes (admin, git), ajoute Cloudflare Access (gratuit jusqu’a 50 utilisateurs) qui exige une authentification SSO avant que la requete atteigne meme cloudflared.
Dans le dashboard Zero Trust > Access > Applications, ajoute une application « git.entreprise-dakar.io » avec une policy « Email ends in @entreprise-dakar.io » et un identity provider Google Workspace ou GitHub. Toute tentative d’acces depuis un email non whiteliste est bloquee avant meme d’atteindre Gitea, ce qui supprime quasiment toute la surface d’attaque sur les CVE applicatives.
Etape 10 : superviser et reagir aux alertes
Active dans Notifications > Add les alertes « Tunnel Health » qui t’envoient un email si un tunnel passe en degraded ou down pendant plus de 5 minutes. Pour un VPS a Hostafrica Senegal ou ARC Informatique a Dakar avec une connectivite occasionnellement instable, ajoute une seconde notification « Origin Error Rate » qui detecte les pics de 5xx (signe d’un service interne plante mais tunnel actif).
Lectures complémentaires, lis aussi WireGuard VPN sur VPS et Cloudflare Zero Trust pour PME.
Etape 11 : tests finaux et signal de mise en production
Trois tests valident le deploiement. D’abord, depuis un reseau exterieur (4G Orange ou Yas), ouvre https://app.entreprise-dakar.io et verifie que la page se charge en moins de 2 secondes avec un certificat Cloudflare Universal SSL valide. Ensuite, scanne le port 22 et 443 de ton VPS depuis nmap.online : aucun port ne doit etre ouvert (filtered/closed). Enfin, depuis le tunnel, mesure la latence avec curl -w « %{time_total}\n » et compare a un acces direct par IP : un overhead de 10 a 30 ms est normal et acceptable.
Si les trois tests passent, ton VPS est officiellement injoignable directement depuis Internet, tout en restant publiquement accessible via Cloudflare Tunnel. C’est l’architecture qu’utilisent aujourd’hui la majorite des PME africaines qui hebergent leur ERP, leur GitLab interne ou leur instance Odoo sans equipe SRE dediee.
Etape 12 : sauvegarder et versionner la config du tunnel
Le fichier credentials JSON et le config.yml constituent ton plan de reprise du tunnel. Place-les sous Git prive (par exemple un repo Gitea ou Codeberg dedie a l’infra), avec le JSON chiffre via SOPS ou git-crypt. En cas de panne du VPS, tu deploies un nouveau VPS, clones le repo, dechiffres et lances cloudflared : ton service est de retour en moins de 15 minutes, sans toucher au DNS.
# Exemple SOPS pour chiffrer le credentials JSON
sops --encrypt --age age1xxxxxxxxxxx UUID.json > UUID.json.enc
git add UUID.json.enc config.yml
git commit -m "Bootstrap tunnel vps-prod-dakar"
git push
Le signal de reussite : un nouveau collaborateur clone le repo, lance scripts/restore.sh, et voit son tunnel demarrer immediatement. C’est l’infra-as-code applique a la connectivite.
Etape 13 : ajouter un load balancer et plusieurs replicas
Quand ton trafic depasse 100 requetes/seconde ou que tu veux survivre a une panne du datacenter, deploie cloudflared sur 2 ou 3 VPS dans des regions differentes (par exemple Paris-OVH + Frankfurt-Hetzner + Johannesburg-Hostafrica). Tous referencent le meme tunnel UUID et la meme config ingress. Cloudflare distribue automatiquement le trafic vers le replica le plus proche du visiteur, et bascule en moins de 30 secondes en cas de chute d’un replica.
L’avantage geographique pour l’Afrique de l’Ouest : un visiteur a Dakar atteint le replica de Johannesburg avec environ 80-110 ms de latence, tandis qu’il atteindrait Paris avec 60-90 ms. Cloudflare optimise le routage selon la latence reelle, pas la distance geographique. C’est l’etape qui transforme un tunnel « petit projet » en infra prete pour la croissance.
Etape 14 : exposer aussi SSH via le tunnel
Au-dela du HTTP, cloudflared sait egalement publier un acces SSH securise sans port public. Cote serveur, on ajoute une entree dans config.yml avec service: ssh://localhost:22. Cote client, on installe cloudflared en local et on lance cloudflared access ssh –hostname ssh.entreprise-dakar.io. La session SSH transite alors par le tunnel chiffre, soumise a Cloudflare Access pour l’authentification SSO. Resultat : ton serveur n’expose plus aucun port 22 sur Internet, et seuls les utilisateurs ayant un email d’entreprise valide et la 2FA peuvent meme tenter une connexion. C’est la facon la plus simple en 2026 d’eliminer le risque ssh brute-force qui frappe 24h/24 tout VPS expose.
Etape 15 : checklist de revue trimestrielle
Tous les 3 mois, lance une revue rapide. Verifie que la version de cloudflared est a jour avec apt update et apt list –upgradable. Verifie que les logs systemd ne contiennent aucun warning recurrent (sudo journalctl -u cloudflared –since « 90 days ago » | grep -i warn | wc -l doit donner moins de 50). Confirme dans le dashboard Cloudflare que le tunnel est en Healthy avec ses 4 connexions actives. Et teste enfin que l’access policy bloque bien un email externe avec un compte test. Quatre signaux verts = infra propre, et tu peux passer au trimestre suivant en confiance.
Etape 16 : preparer un plan de retrait du tunnel
Si un jour tu changes de strategie, prevois la sortie. Documente dans le wiki interne la procedure exacte pour migrer du tunnel vers une exposition classique ou un load balancer alternatif (HAProxy, Caddy, Traefik). Cette doc evite que la dependance a Cloudflare devienne un point de blocage strategique. Le tunnel reste un excellent choix par defaut, mais une infra mature garde toujours un plan B documente.
Etape 17 : capitaliser sur la gratuite tant qu’elle dure
Cloudflare Tunnel reste gratuit en 2026 sans limite de bande passante pour le trafic HTTP/HTTPS, ce qui en fait l’offre la plus genereuse du marche. Pour une PME senegalaise ou ivoirienne qui demarre, c’est une opportunite a saisir maintenant : tu construis ton infra autour de cet outil pendant que les couts de connectivite restent prevus a zero franc, et tu en profites pour stabiliser ton produit avant d’envisager des plans payants ulterieurs si ton trafic explose.