Pourquoi personne en dehors de votre réseau ne peut atteindre localhost
Un fournisseur de webhook a besoin d’une URL oĂą faire un POST, et votre serveur tourne sur localhost:3000. Ou un collègue veut cliquer sur la branche que vous testez, ou votre tĂ©lĂ©phone doit atteindre le serveur de dev pour vĂ©rifier une mise en page. Le serveur tourne. Rien en dehors de votre rĂ©seau ne peut le joindre.
La redirection de port sur votre routeur fonctionnerait, mais elle expose l’IP de votre domicile et demande des droits d’administration que vous n’avez pas toujours. Cloudflare Tunnel prend l’autre direction. cloudflared, un petit daemon que vous lancez Ă cĂ´tĂ© de votre serveur, ouvre une connexion sortante vers l’edge de Cloudflare, et Cloudflare renvoie le trafic Ă travers elle. Vous n’ouvrez aucun port entrant et vous n’avez besoin d’aucune IP publique.
Il existe sous deux formes. Une quick tunnel vous donne une URL HTTPS publique en une seule commande, sur un hostname alĂ©atoire qui meurt dès que vous arrĂŞtez le processus. C’est l’outil pour une dĂ©mo de cinq minutes ou un test de webhook. Une named tunnel vous donne un hostname stable sur votre propre domaine, qui survit aux redĂ©marrages, ce qui en fait un petit morceau d’infrastructure rĂ©elle.
Comment Cloudflare Tunnel fonctionne sans port ouvert
L’astuce est un changement de direction. Exposer un service signifie normalement ouvrir un port entrant : quelque chose sur internet initie une connexion vers votre machine, qui a donc besoin d’une adresse routable et d’une règle de pare-feu qui laisse passer ce trafic. Bloquer exactement cela, c’est le travail du NAT et de la plupart des pare-feux domestiques ou d’entreprise.
cloudflared n’Ă©coute jamais de connexion entrante. Il compose vers l’edge de Cloudflare via une connexion sortante HTTPS ordinaire, le mĂŞme type de connexion que votre navigateur ouvre toute la journĂ©e, et la garde ouverte. Cloudflare pousse ensuite les requĂŞtes le long de cette connexion et lit les rĂ©ponses en retour, un peu comme un serveur pousse des messages sur un WebSocket vers un navigateur qui s’est connectĂ© en premier. Votre pare-feu voit une seule connexion sortante qu’il autorise dĂ©jĂ . C’est aussi pour ça que le tunnel se comporte de la mĂŞme façon derrière un NAT ou sur un ordinateur portable sans IP publique : une connexion sortante n’en a rien Ă faire.
Le prix Ă payer, c’est que Cloudflare se retrouve maintenant sur le chemin. Le hostname de votre tunnel pointe vers Cloudflare, qui dĂ©chiffre chaque requĂŞte Ă son edge, la rechiffre, puis l’envoie dans le tunnel jusqu’Ă votre daemon. C’est la mĂŞme architecture qu’exĂ©cuter un service derrière un CDN ou un reverse proxy : vous renoncez Ă l’accès direct en Ă©change d’une boĂ®te intermĂ©diaire qui termine le TLS et peut appliquer des règles d’accès avant que quoi que ce soit n’atteigne votre machine.
Comment créer une quick tunnel en une seule commande
Installez d’abord cloudflared : brew install cloudflared sur macOS, le paquet .deb/.rpm du dĂ©pĂ´t de Cloudflare sur Linux, ou l’installeur Windows depuis la page des releases GitHub. Ensuite, avec quelque chose dĂ©jĂ Ă l’Ă©coute sur un port local :
| |
Quelques secondes plus tard, vous obtenez une sortie de ce type :
| |
Cette URL sert du HTTPS avec un certificat gĂ©rĂ© par Cloudflare, vous ne touchez donc jamais Ă la configuration TLS. Laissez-lui quelques secondes pour commencer Ă rĂ©soudre. Ă€ partir de lĂ , quiconque a le lien atteint votre localhost:3000, jusqu’Ă ce que vous appuyiez sur Ctrl-C. Le hostname disparaĂ®t alors pour de bon, et la prochaine exĂ©cution en gĂ©nère un nouveau. Vous ne vous connectez pas, vous ne crĂ©ez aucun enregistrement DNS, et vous n’avez besoin d’aucun compte.
Les limites sont rĂ©elles, cela dit. Le hostname est alĂ©atoire, donc vous ne pouvez pas le mettre dans une config de webhook qui doit survivre Ă un redĂ©marrage. Cloudflare plafonne les quick tunnels Ă 200 requĂŞtes simultanĂ©es et ne supporte pas les Server-Sent Events dessus, donc un flux SSE de longue durĂ©e se coupera. Il n’y a non plus aucune garantie de disponibilitĂ© : les conditions d’utilisation de Cloudflare traitent les quick tunnels comme une commoditĂ© de test.
Pour dĂ©boguer un webhook maintenant ou laisser votre tĂ©lĂ©phone atteindre le serveur de dev, c’est tout ce dont vous avez besoin. Si ça doit encore tourner demain, montez une named tunnel.
Comment configurer une named tunnel sur votre propre domaine
Une named tunnel nécessite un compte Cloudflare gratuit et un domaine dont le DNS est chez Cloudflare. Vous faites cette configuration une seule fois.
1. Authentifiez cloudflared sur votre compte :
| |
Cela ouvre un navigateur et vous demande de choisir le domaine à autoriser. Un certificat est ensuite enregistré dans ~/.cloudflared/cert.pem, que toutes les commandes suivantes utilisent.
2. Créez le tunnel et notez son ID :
| |
Cela enregistre un tunnel nommĂ© my-app et Ă©crit un fichier d’identifiants, <TUNNEL-ID>.json, dans ~/.cloudflared/. Ce fichier est l’identitĂ© du tunnel. Traitez-le comme un secret : quiconque le dĂ©tient peut faire passer du trafic par votre tunnel.
3. Écrivez la config. Créez ~/.cloudflared/config.yml :
| |
ingress est une liste ordonnĂ©e de règles hostname-vers-service, comparĂ©es de haut en bas. Si vous avez dĂ©jĂ configurĂ© nginx comme reverse proxy devant vos apps, c’est la mĂŞme idĂ©e de routage, Ă©crite en YAML plutĂ´t qu’en directives proxy_pass. Un seul tunnel peut exposer plusieurs services locaux sur des hostnames diffĂ©rents. La dernière règle est obligatoire. C’est le catch-all qui renvoie 404 pour tout hostname que les règles prĂ©cĂ©dentes n’ont pas captĂ©, et cloudflared refuse de dĂ©marrer sans elle.
4. Pointez le DNS vers le tunnel :
| |
Cela crĂ©e un enregistrement CNAME pour app.example.com pointant vers <TUNNEL-ID>.cfargotunnel.com. C’est de la rĂ©solution DNS ordinaire, visant l’infrastructure de tunnel de Cloudflare plutĂ´t qu’une IP de serveur. ExĂ©cutez-la une fois pour chaque hostname de votre liste ingress.
5. Lancez-le :
| |
app.example.com sert dĂ©sormais tout ce qui Ă©coute sur localhost:3000, en HTTPS. Cloudflare termine le TLS Ă l’edge, et votre origine peut rester en HTTP simple puisque la connexion du tunnel est dĂ©jĂ chiffrĂ©e.
Un tunnel lancĂ© dans un terminal meurt avec le terminal. Pour qu’il survive Ă un redĂ©marrage, installez-le comme service système :
| |
Sous Linux, en l’exĂ©cutant avec sudo, $HOME devient /root, et cloudflared ne peut plus retrouver un config.yml que vous avez créé en tant qu’utilisateur normal. Pointez-le explicitement vers le fichier Ă la place :
| |
Cela copie votre config vers /etc/cloudflared/config.yml et enregistre cloudflared auprès de systemd (ou launchd, ou le gestionnaire de services Windows), pour qu’il dĂ©marre au boot et redĂ©marre s’il plante.
Quand Cloudflare Tunnel n’est pas le bon choix
Un tunnel convient quand le trafic part de l’extĂ©rieur de votre rĂ©seau et doit atteindre une machine sans IP publique, ou une machine que vous ne voulez pas exposer directement : un ordinateur portable, un serveur maison, une machine derrière un NAT d’entreprise. C’est le mauvais outil dans ces cas :
- Vous avez dĂ©jĂ un serveur avec une IP publique. Le tunnel ajoute l’edge de Cloudflare comme saut supplĂ©mentaire pour aucun gain. Un enregistrement DNS
Aplus votre propre reverse proxy ou terminaison TLS est plus simple et a un point de dĂ©faillance de moins. - Vous avez besoin d’une latence garantie faible ou vous dĂ©placez de gros volumes de donnĂ©es. Chaque octet passe par le rĂ©seau de Cloudflare. Pour la plupart du trafic web, ce coĂ»t est nĂ©gligeable ; pour des charges Ă fort dĂ©bit ou sensibles Ă la latence, il ne l’est pas.
- Le service doit rester debout quand une machine tombe. Un seul
cloudflaredsur une seule machine est un point de dĂ©faillance unique, etservice installne couvre que les redĂ©marrages de processus. Si cette machine meurt, le hostname s’Ă©teint. La redondance signifie faire tourner le mĂŞme tunnel depuis une seconde machine. - Votre code fait confiance Ă l’adresse TCP source pour des dĂ©cisions de sĂ©curitĂ©. Les requĂŞtes atteignent votre origine depuis les plages d’IP de Cloudflare. La vĂ©ritable IP du client arrive dans l’en-tĂŞte
CF-Connecting-IP, et tout ce qui lit l’adresse du socket verra l’edge de Cloudflare Ă la place.
Quick tunnel ou named tunnel : par laquelle commencer
Si vous ne savez pas laquelle il vous faut, c’est une quick tunnel. Lancez cloudflared tunnel --url http://localhost:<port> contre ce sur quoi vous travaillez en ce moment et ouvrez l’URL. Passez Ă une named tunnel quand vous atteignez l’une de ses deux vraies limites : un hostname qui doit survivre Ă la session du terminal, ou un service qui doit continuer de tourner sans surveillance.