Cloudflare Tunnel, Tailscale ou WireGuard : lequel choisir ?
Accéder à son serveur maison depuis l'extérieur sans ouvrir de port : trois approches comparées, avec leur installation et leurs vraies limites.
Vous avez installé Jellyfin, Home Assistant ou Nextcloud sur un mini-PC à la maison. Ça marche parfaitement sur le Wi-Fi. Puis vous sortez, ouvrez l'application sur votre téléphone en 4G, et rien.
La solution classique, ouvrir un port sur la box et le rediriger vers le serveur, pose trois problèmes. Votre service devient visible de tous les scanners d'Internet. Votre adresse IP publique change parfois. Et de plus en plus de fournisseurs d'accès, surtout en fibre et en 4G/5G, placent leurs clients derrière un CGNAT : une IP partagée avec d'autres abonnés, sur laquelle on ne peut pas ouvrir de port du tout.
Cloudflare Tunnel, Tailscale et WireGuard résolvent ce problème différemment. Les deux premiers ne demandent aucun port ouvert. Le troisième en demande un seul, et il est invisible aux scanners.
Trois approches, trois philosophies
| Cloudflare Tunnel | Tailscale | WireGuard | |
|---|---|---|---|
| Principe | Le serveur ouvre une connexion sortante vers Cloudflare, qui relaie le trafic public | Réseau privé maillé entre vos appareils, coordonné par Tailscale | Tunnel VPN chiffré que vous configurez vous-même |
| Accessible par | N'importe qui sur Internet (ou restreint via Cloudflare Access) | Uniquement vos appareils connectés | Uniquement vos appareils configurés |
| Port à ouvrir | Aucun | Aucun | Un port UDP |
| Fonctionne derrière CGNAT | Oui | Oui | Non (sans serveur relais) |
| Nom de domaine requis | Oui, géré chez Cloudflare | Non | Non |
| Qui voit le trafic | Cloudflare déchiffre le HTTPS | Personne (chiffré de bout en bout) | Personne |
| Dépendance à un tiers | Forte | Moyenne (serveur de coordination) | Aucune |
| Coût | Gratuit | Gratuit pour un usage personnel | Gratuit |
La vraie question n'est pas « lequel est le meilleur » mais : qui doit pouvoir accéder au service ? Vous seul, ou le monde entier ?
Tailscale : l'accès privé sans effort
Tailscale construit un réseau privé (un « tailnet ») entre tous les appareils où il est installé : serveur, laptop, téléphone. Chaque appareil reçoit une adresse en 100.x.y.z et un nom, et peut joindre les autres directement, où qu'ils soient. Sous le capot, c'est du WireGuard. Tailscale ajoute la gestion des clés, la traversée de NAT et l'authentification via votre compte Google, GitHub ou Microsoft.
Installation sur le serveur :
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upLa commande affiche un lien de connexion. Une fois validé, installez l'application Tailscale sur votre téléphone avec le même compte. C'est terminé : depuis la 4G, http://monserveur:8096 ouvre Jellyfin.
Quelques fonctions utiles :
tailscale status # appareils du réseau
sudo tailscale up --advertise-exit-node # utiliser le serveur comme VPN de sortie
sudo tailscale serve --bg 8096 # servir Jellyfin en HTTPS sur le tailnetUne fois HTTPS activé dans la console d'administration Tailscale (section DNS), tailscale serve génère un certificat valide pour le nom monserveur.votre-tailnet.ts.net, accessible seulement aux appareils du réseau. Plus besoin de reverse proxy pour un usage privé.
Les limites. Chaque appareil qui accède au service doit avoir Tailscale. Impossible de partager un lien Jellyfin avec un ami qui ne l'installe pas (le partage de machine entre comptes existe, mais demande à l'ami de créer un compte). Et le serveur de coordination appartient à Tailscale Inc. Si cette dépendance vous gêne, Headscale est une réimplémentation open-source de ce serveur, à héberger soi-même.
C'est mon choix par défaut pour tout ce qui est administration : SSH, Home Assistant, Portainer, Proxmox. Ces interfaces n'ont rien à faire sur Internet.
Cloudflare Tunnel : publier un site sans IP publique
Cloudflare Tunnel fait l'inverse : il rend un service public. Un petit programme, cloudflared, tourne sur le serveur et ouvre une connexion sortante vers le réseau Cloudflare. Quand un visiteur ouvre app.mondomaine.fr, Cloudflare fait passer la requête dans ce tunnel. Aucun port n'est ouvert sur la box.
Prérequis : un nom de domaine dont les DNS sont gérés par Cloudflare (compte gratuit).
La méthode la plus simple passe par le tableau de bord Cloudflare (Zero Trust → Networks → Tunnels → Create a tunnel), qui fournit un jeton. On lance ensuite cloudflared dans Docker :
services:
cloudflared:
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run
environment:
TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}
restart: unless-stoppedDans le tableau de bord, on associe ensuite un nom (app.mondomaine.fr) à un service interne (http://jellyfin:8096 ou http://192.168.1.20:8096). Cloudflare crée l'enregistrement DNS et le certificat HTTPS automatiquement.
Les avantages sont réels : fonctionne derrière CGNAT, HTTPS automatique, IP du domicile masquée, protection anti-DDoS de Cloudflare incluse. Et avec Cloudflare Access, on peut exiger une connexion (code par e-mail, compte Google) avant d'atteindre le service, sans toucher à l'application.
Les limites sont tout aussi réelles :
- Cloudflare déchiffre tout le trafic. Le HTTPS s'arrête chez eux, puis repart vers votre serveur dans le tunnel. Pour un blog, aucune importance. Pour un Nextcloud avec vos papiers d'identité ou un Vaultwarden, c'est un tiers de plus dans la chaîne de confiance.
- Le streaming vidéo est déconseillé. Les conditions d'utilisation de Cloudflare encadrent la diffusion de gros volumes de vidéo via leur réseau gratuit. Faire passer Jellyfin par un tunnel fonctionne techniquement, mais vous expose à une limitation du compte.
- Les uploads sont limités à 100 Mo par requête sur le plan gratuit, ce qui gêne Nextcloud ou Immich pour les grosses vidéos.
- Dépendance forte. Si Cloudflare change ses conditions ou a une panne, vos services publics tombent.
Je l'utilise pour ce qui doit être public par nature : un site vitrine, une démo, une API, un webhook.
WireGuard : tout contrôler soi-même
WireGuard est le protocole VPN moderne sur lequel Tailscale est construit. L'utiliser directement, c'est se passer de tout intermédiaire : un serveur WireGuard à la maison, une configuration par appareil, et c'est tout.
Il faut ouvrir un port UDP (51820 par défaut) sur la box. Ce n'est pas un risque comparable à ouvrir un port web : WireGuard ne répond à aucun paquet qui n'est pas signé par une clé autorisée. Pour un scanner, le port semble fermé.
Pour une installation guidée sans tout configurer à la main, wg-easy fournit une interface web qui génère les configurations et des QR codes pour le téléphone :
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
ports:
- "51820:51820/udp"
- "127.0.0.1:51821:51821/tcp"
volumes:
- ./wg-easy:/etc/wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stoppedLes options de wg-easy ont changé avec la version 15 : vérifiez sa documentation officielle avant de copier une configuration trouvée en ligne. L'interface d'administration reste en 127.0.0.1 : on y accède depuis le serveur, ou via un tunnel SSH, jamais depuis Internet. Pensez aussi à autoriser le port dans le pare-feu, en suivant la configuration d'UFW sur un serveur Linux.
Les limites. Derrière un CGNAT, impossible de recevoir des connexions entrantes : WireGuard seul ne marche pas. Il faut alors un petit VPS avec une IP publique qui sert de relais, ce qui revient à reconstruire Tailscale à la main. Et l'adresse IP de la box peut changer : il faut un DNS dynamique (DuckDNS, ou l'API de votre registrar) pour que les appareils la retrouvent.
Quel choix selon le cas
| Situation | Recommandation |
|---|---|
| Accéder à Home Assistant, Portainer, SSH depuis votre téléphone | Tailscale |
| Regarder Jellyfin hors de chez vous, en famille | Tailscale (chaque membre installe l'app) |
| Publier un blog ou une démo accessible à tous | Cloudflare Tunnel |
| Recevoir des webhooks (GitHub, Stripe) sur un serveur maison | Cloudflare Tunnel |
| Box derrière CGNAT, aucun port ouvrable | Tailscale ou Cloudflare Tunnel |
| Refus de toute dépendance à une entreprise tierce | WireGuard (ou Headscale) |
| Partager des photos Immich avec des proches sans compte | Cloudflare Tunnel + Cloudflare Access |
Les combinaisons sont fréquentes, et c'est ce que je recommande : Tailscale pour tout ce qui est privé, Cloudflare Tunnel uniquement pour les deux ou trois services qui doivent vraiment être publics. Le principe est simple : un service qui n'a pas besoin d'être sur Internet ne doit pas y être.
Et le reverse proxy dans tout ça ?
Avec Tailscale ou WireGuard seuls, on accède aux services par leur port (monserveur:8096). Dès qu'on a plus de trois ou quatre services, retenir les ports devient pénible. On ajoute alors un reverse proxy sur le serveur, qui route jellyfin.maison.lan ou jellyfin.mondomaine.fr vers le bon conteneur. Le choix de l'outil est détaillé dans la comparaison Nginx, Caddy et Traefik.
Avec Cloudflare Tunnel, le routage par nom est déjà intégré au tableau de bord. Le reverse proxy devient optionnel.
Cloudflare Tunnel, Tailscale ou WireGuard ? Tailscale pour l'immense majorité des usages personnels : cinq minutes d'installation, aucun port ouvert, rien d'exposé. Cloudflare Tunnel quand un service doit réellement être public, en gardant en tête que Cloudflare voit passer le trafic. WireGuard pur quand la souveraineté prime sur la simplicité. Et Jellyfin, Home Assistant ou Nextcloud deviennent utilisables partout sans jamais apparaître dans un scan de ports.