00:00:00Voici Headscale, une version libre et open-source de Tailscale que vous pouvez installer sur n'importe quel serveur,
00:00:06ce qui vous donne le contrôle total de votre réseau chiffré au cas où l'internet tomberait ou si Tailscale augmentait soudainement ses tarifs.
00:00:13Mais ce qui est étrange, c'est que Headscale a été conçu par un employé de Tailscale.
00:00:18Pourquoi paient-ils quelqu'un pour construire leur propre concurrent ?
00:00:22Abonnez-vous et découvrons-le ensemble.
00:00:25Voyons rapidement Headscale en action avant d'entrer dans les détails.
00:00:30Alors, j'ai actuellement trois serveurs Hetzner : un pour le plan de contrôle Headscale et deux nœuds ici, que je veux connecter entre eux.
00:00:40Ces deux-là font actuellement partie de mon réseau chiffré.
00:00:44Si je lance cette commande, comme tout tourne sur Docker, je peux voir mes nœuds actuels : Ubuntu Test et Ubuntu Test 2.
00:00:53Et voici les adresses IP que je peux utiliser pour m'y connecter.
00:00:56Pour l'instant, connectons ces deux nœuds l'un à l'autre.
00:00:59D'abord, je copie cette adresse IP.
00:01:02Et maintenant, depuis Ubuntu Test 2, je vais me connecter en SSH sur le compte root.
00:01:07Oui, je ne devrais pas utiliser root, mais c'est juste pour le test.
00:01:09Et ça, c'est l'adresse IP fournie par Headscale.
00:01:11Si j'appuie sur Entrée et que je nettoie l'écran, vous voyez que je suis sur Ubuntu Test 1.
00:01:17Je suis donc passé d'Ubuntu Test 2 à Ubuntu Test 1, et je peux quitter pour revenir sur Ubuntu Test 2.
00:01:24Je peux faire la même chose depuis Ubuntu Test 1 en faisant SSH root et en collant l'IP d'Ubuntu Test 2.
00:01:31En nettoyant, on voit que je suis bien sur Ubuntu Test 2 depuis Ubuntu Test 1.
00:01:36Mais si je suis en dehors du tailnet, par exemple si j'ouvre un nouvel onglet sur mon Mac et que je tente un SSH root sur l'IP d'Ubuntu Test 2...
00:01:48Vous voyez que ça tourne dans le vide parce que je suis hors du réseau sécurisé.
00:01:52Comme vous venez de le voir, Headscale vous donne un accès complet à votre réseau.
00:01:56Vous contrôlez chaque détail et pouvez ajouter autant de nœuds que vous voulez, sans dépendance vis-à-vis d'un fournisseur.
00:02:03Et cela peut fonctionner sans internet si vous le connectez à un NAS ou un vieux Raspberry Pi.
00:02:08Mais la configuration est un peu complexe.
00:02:11D'ailleurs, laissez-moi vous montrer comment ça marche.
00:02:13Là, j'ai créé un nouveau serveur appelé Ubuntu Test 3, et je vais créer un nouveau tailnet avec un nouvel utilisateur pour connecter deux nœuds.
00:02:24Ubuntu Test 3 et Ubuntu Test 1, juste pour les besoins du test.
00:02:29Sur mon plan de contrôle Headscale, le logiciel est déjà installé, mais je vais vous montrer comment j'ai procédé.
00:02:37Actuellement, j'ai trois conteneurs Docker en cours d'exécution.
00:02:40L'un pour Headscale UI, un pour Headscale lui-même et un autre pour Caddy.
00:02:45Si on regarde le fichier Docker Compose, on voit que la config est très proche de celle de la documentation officielle.
00:02:56J'ai tout de même modifié quelques éléments comme la version de Headscale et les chemins de mes répertoires.
00:03:03J'ai aussi un conteneur pour Headscale UI, l'une des nombreuses interfaces web open source utilisables avec Headscale.
00:03:11Je vous montrerai ça un peu plus tard.
00:03:13Ensuite, il y a Caddy qui sert de reverse proxy.
00:03:16Je mettrai un lien vers ce fichier Docker Compose spécifique dans la description si ça vous intéresse.
00:03:21Dans ce dossier, nous avons aussi des répertoires “lib” et “config”.
00:03:26Le dossier “lib” sert principalement à stocker la base de données SQLite, qui gère les utilisateurs, les nœuds, le DNS et bien d'autres choses.
00:03:36Mais dans la configuration, vous pouvez passer à une base Postgres si vous préférez.
00:03:43Le dossier “config” contient la configuration de Tailscale et la liste de contrôle d'accès (ACL) dans un fichier JSON lisible.
00:03:52On en reparlera, mais jetons d'abord un œil à ceci, que vous pouvez récupérer via la doc de Tailscale ou même par un simple curl.
00:04:01En regardant l'exemple sur GitHub, on voit tout ce qu'on peut modifier, du serveur aux préfixes, ainsi que l'emplacement de notre fichier de politique.
00:04:11C'est très proche de ma config, j'ai juste changé l'URL du serveur pour pointer vers un domaine Cloudflare afin que mes nœuds sachent où se trouver.
00:04:23J'ai aussi ajouté le chemin vers mon fichier de politique, et c'est à peu près tout.
00:04:28Le domaine est un Cloudflare classique avec un enregistrement A pointant vers l'IP de mon Headscale sur un sous-domaine dédié.
00:04:37Une fois cela en place, si j'édite le fichier Caddy, on voit deux URL : une pour l'interface web et une pour le proxy Headscale.
00:04:49Après ça, la première chose à faire est de créer un utilisateur avec cette commande.
00:04:56Je vais l'appeler Tom, mais vous pouvez mettre ce que vous voulez.
00:05:00L'utilisateur est créé, on peut lister les utilisateurs et on voit le nôtre ici avec l'ID 6.
00:05:08Mais pour l'instant, cet utilisateur n'a aucun nœud associé.
00:05:11Donnons donc quelques nœuds à Tom.
00:05:13Sur Ubuntu Test 3, mon nouveau serveur, je dois d'abord installer le client Tailscale en lançant cette commande.
00:05:23Cela nous donne accès à l'exécutable Tailscale.
00:05:27Notez que si vous n'êtes pas root, vous devrez probablement utiliser sudo.
00:05:31Mais avant de lancer Tailscale ou de se connecter, il faut le faire d'une manière spécifique pour que ça marche avec Headscale.
00:05:38Pour cela, on doit créer des clés de pré-authentification, dont la commande se trouve dans le guide de démarrage de Headscale.
00:05:46Je descends dans la page et je copie cette commande.
00:05:49Ensuite, sur mon serveur Headscale, je tape “docker exec” et je colle la commande.
00:05:54Là où il y a l'ID utilisateur, on met celui de Tom, soit le 6.
00:05:59Et j'ajoute le nom du conteneur pour pouvoir y exécuter la commande.
00:06:04Et voilà notre clé de pré-authentification.
00:06:07On copie ensuite la commande pour la coller dans Ubuntu Test 3.
00:06:11On récupère notre clé et on la colle ici.
00:06:15Puis on change l'URL du serveur de connexion pour mettre le nôtre : headscale.pandor.css.
00:06:23Pandora était déjà pris, sinon je l'aurais pris.
00:06:26Maintenant, en validant, un nouveau nœud devrait être ajouté à notre réseau Headscale.
00:06:31Si on retourne sur le plan de contrôle et qu'on liste les nœuds, on voit Ubuntu Test 3 qui appartient à Tom avec ses adresses IP.
00:06:44Ajoutons maintenant Ubuntu Test 1 à l'utilisateur Tom.
00:06:47D'abord, je vais supprimer le nœud Ubuntu Test existant (ID 1) en forçant la suppression pour éviter les confirmations.
00:06:56C'est fait. Je crée une nouvelle clé et je l'ajoute à Ubuntu Test, sans oublier d'activer SSH avec le drapeau adéquat.
00:07:06Allons aussi sur Ubuntu Test 3 pour activer SSH, ce qui permettra les connexions distantes.
00:07:13Désormais, dans ma liste, j'ai Ubuntu Test 1 et Ubuntu Test 3, tous deux sous l'utilisateur Tom.
00:07:20Connectons-les.
00:07:21Je prends l'IP d'Ubuntu Test 3, je vais sur Ubuntu Test 1 et je lance SSH root avec cette IP.
00:07:30Une fois la clé activée, on voit que je suis sur Ubuntu Test 3 depuis Ubuntu Test 1.
00:07:35Et je peux faire l'inverse sans problème.
00:07:41Si vous avez suivi exactement mes étapes, il y a de fortes chances que ça ne marche pas chez vous car il faut configurer une politique d'accès.
00:07:49Laissez-moi vous montrer la mienne.
00:07:51Dans mon répertoire Headscale, sous le dossier config, on trouve le fichier ACL en JSON.
00:08:01C'est une configuration très simple qui accepte n'importe quelle source du réseau vers n'importe quelle destination ou port.
00:08:11Pour le SSH, elle autorise tout nœud du tailnet à se connecter à un autre en root, sans approbation manuelle.
00:08:24Bien sûr, selon vos besoins, vous devriez restreindre cela pour que certains nœuds ne communiquent que sur des ports précis.
00:08:33Mais c'est une base simple pour commencer.
00:08:37Encore une fois, le lien sera dans la description.
00:08:40Maintenant, qu'en est-il de Headscale UI ?
00:08:43Est-ce que ça simplifie tout le processus ?
00:08:45Je dirais oui et non.
00:08:47Regardez.
00:08:48Voici l'URL de mon interface Headscale, on y voit mes deux utilisateurs, Tess et Tom, avec leurs infos.
00:08:57On y voit les clés et les nœuds connectés.
00:09:01Au départ, il faut ajouter une clé API Headscale via une commande spécifique.
00:09:06Le problème que j'ai eu, c'est la vue des appareils.
00:09:09Comme vous voyez, il n'y a pas beaucoup d'infos, et j'ai une erreur de type TypeScript dans la console, ce qui n'est pas de mon fait puisque je n'ai pas touché au code.
00:09:22À ce stade, l'application a tendance à freezer et plus rien ne répond.
00:09:26Normalement, je devrais pouvoir ajouter un appareil ou modifier la config d'ici.
00:09:32Mais comme c'est buggé, je ne l'ai pas trouvée très utile.
00:09:35Il existe d'autres interfaces, dont certaines facilitent la gestion des politiques d'accès.
00:09:42Mais personnellement, je n'en ai pas encore trouvé une de vraiment convaincante.
00:09:46Alors oui, l'installation est un peu complexe.
00:09:49Ok, c'est vraiment complexe.
00:09:51Quelqu'un sans bagage technique ou même un développeur junior aurait du mal à le configurer seul.
00:09:57C'est sans doute pour ça que Tailscale laisse un employé travailler dessus : ça ne menace pas vraiment leur business pour l'instant.
00:10:07Il suffirait que quelqu'un utilise Claude Opus pour créer une superbe interface autour de ça pour que ça devienne sérieux, même si la licence pourrait freiner les choses.
00:10:18Mais une fois que tout tourne, Headscale fonctionne à merveille.
00:10:22Même s'il manque encore quelques fonctions, comme “funnel” et “serve” pour exposer un serveur publiquement.
00:10:32Il ne supporte pas non plus les tailnets multiples, les nœuds éphémères ou les journaux de flux réseau natifs.
00:10:38Mais pour un outil open source, c'est vraiment impressionnant.
00:10:42Et si un jour je veux faire tourner mon instance OpenClaude totalement hors ligne avec un LLM local, je l'envisagerai sérieusement.