Headscale : une implémentation open source et auto-hébergée du serveur de contrôle Tailscale …
Tags: digitalocean, azure, kubernetes, tailscale
Published: 2022-01-10 22:28:44

---
title: Headscale : une implémentation open source et auto-hébergée du serveur de contrôle Tailscale …
published: true
date: 2022-01-10 22:20:37 UTC
tags: digitalocean,azure,kubernetes,tailscale
canonical_url: https://deep75.medium.com/headscale-une-impl%C3%A9mentation-open-source-et-auto-h%C3%A9berg%C3%A9e-du-serveur-de-contr%C3%B4le-tailscale-c0af024d4df0
---

![](https://cdn-images-1.medium.com/max/1024/1*LamPxaG5LKP6pFhdK9OCzQ.png)

Dans l’article précédent, j’avais parlé de Tailscale, un VPN à configuration zéro. Il s’installe sur n’importe quel appareil en quelques minutes, gère les règles du pare-feu pour vous et fonctionne de n’importe où.

[Accéder à Red Hat CodeReady Containers dans Azure depuis Tailscale …](https://dev.to/deep75/acceder-a-red-hat-codeready-containers-dans-azure-depuis-tailscale--37k)

Néanmoins, on était dépendant d’un serveur de coordination qui centralise les connexions depuis nos instances qui y sont attachés :

[How Tailscale works](https://tailscale.com/blog/how-tailscale-works/)

![](https://cdn-images-1.medium.com/max/1024/1*caOQg4XGVOAGSCK3IfQBQQ.png)

![](https://cdn-images-1.medium.com/max/1024/1*iMF7o4UNKHI2zGy3rVVMEA.png)

Ici on va remplacer le serveur de coordination Tailscale par une implémentation open source et auto-hébergée via Headscale.

> Le code d’Headscale est écrit en Go et est distribué sous licence BSD. Le projet est développé par Juan Font de l’Agence spatiale européenne :

[GitHub - juanfont/headscale: An open source, self-hosted implementation of the Tailscale control server](https://github.com/juanfont/headscale)

![](https://cdn-images-1.medium.com/max/1024/0*BY-hxNbA99n9mgzU)

Pour cela, je lance une petite instance Ubuntu 20.04 sur DigitalOcean qui va porter le serveur Headscale :

![](https://cdn-images-1.medium.com/max/1024/1*gSN_p9iq5aHzvzB0lIxayg.png)

en récupérant le binaire sur GitHub :

![](https://cdn-images-1.medium.com/max/1024/1*V2yfQjvw5-5-mLufiyPlwg.png)

![](https://cdn-images-1.medium.com/max/1024/1*nBLZz_KkCfDHt3XgoCo6aQ.png)

Je récupère un fichier de configuration modèle sur GitHub pour le serveur Headscale :

[https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml](https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml)

![](https://cdn-images-1.medium.com/max/1024/1*NFC0VjfublSObJpPeP96RQ.png)

où je définis un domaine privé :

![](https://cdn-images-1.medium.com/max/1024/1*94dQ4GcUKEit97RBJaoRdg.png)

Il est alors possible de lancer le serveur Headscale sur cette instance Ubuntu 20.04 :

![](https://cdn-images-1.medium.com/max/1024/1*Fm79CCM7IZ-_cNyv2ZI74g.png)

Je peux vérifier que le serveur répond bien via ce test :

![](https://cdn-images-1.medium.com/max/1024/1*3JhIrKIApNObnzN_6YlqoQ.png)

Création du tailnet, son réseau privé avec le namespace :

[What is a tailnet?](https://tailscale.com/kb/1136/tailnet/)

![](https://cdn-images-1.medium.com/max/1024/1*o8nnZhsM9fjZEjlzkfpSwg.png)

à partir de là, la création d’une clé de pré-authentification est possible pour ce réseau privé :

![](https://cdn-images-1.medium.com/max/1024/1*8HFnQYO9_bt_4suZux2eZw.png)

![](https://cdn-images-1.medium.com/max/1024/1*bR_1uvIN-V1YIynAhPY6dw.png)

On est alors prêt pour la création comme dans l’article précédent d’un Scale Set de machines virtuelles dans Azure sans adresses IP publiques qui vont se connecter à ce réseau privé. J’utilise ces deux scripts :

![](https://cdn-images-1.medium.com/max/1024/1*aZ_fac0Dl5FkdgjHtYWQWw.png)

![](https://cdn-images-1.medium.com/max/1024/1*7G88AlwJ4Z1r5OU05m2_Ag.png)

La création des machines virtuelles est effectives …

![](https://cdn-images-1.medium.com/max/1024/1*WTY8d7_3CqBeBJcCHRX8EQ.png)

![](https://cdn-images-1.medium.com/max/1024/1*DcCp8PEG5E5CW5iUwnH6pw.png)

Je peux le vérifier avec le client Tailscale depuis ma station connectée au réseau privé :

[Tailscale](https://tailscale.com/download)

![](https://cdn-images-1.medium.com/max/1024/1*Lfvi1GJUgq6APHmkss805g.png)

![](https://cdn-images-1.medium.com/max/1024/1*NlOdB2ZUpDsPeQ0lmcTl-Q.png)

![](https://cdn-images-1.medium.com/max/840/1*502f1WPWHg4nnbSiXKzApA.png)

Tailscale fait en effet tourner des serveurs relais DERP pour aider à connecter vos nœuds. En plus ou au lieu d’utiliser les serveurs DERP de Tailscale, vous pouvez également exécuter vos propres serveurs via ce fichier de configuration pour Headscale :

[https://raw.githubusercontent.com/juanfont/headscale/main/derp-example.yaml](https://raw.githubusercontent.com/juanfont/headscale/main/derp-example.yaml)

[Custom DERP Servers](https://tailscale.com/kb/1118/custom-derp-servers/)

Et MagicDNS est ici également de la partie via le domaine privé défini dans le fichier de configuration du serveur Headscale sous la forme :

> **_NOM-DE-MACHINE.NAMESPACE.DOMAINE_**

MagicDNS enregistre en effet automatiquement les noms DNS des appareils au sein de ce réseau privé.

![](https://cdn-images-1.medium.com/max/1024/1*OrryWbSGp3dIYpuS_JlzWQ.png)

[MagicDNS](https://tailscale.com/kb/1081/magicdns/)

![](https://cdn-images-1.medium.com/max/1024/1*8d1vEOO1-GLh_CcUchdrqQ.png)

![](https://cdn-images-1.medium.com/max/1024/1*e4JcvTbo-r0vZYtPc4NfKw.png)

Rapide test avec Ketchup ou k3sup :

![](https://cdn-images-1.medium.com/max/1024/0*W8kYhyDHqgtbz8-n.png)

[GitHub - alexellis/k3sup: bootstrap Kubernetes with k3s over SSH < 1 min 🚀](https://github.com/alexellis/k3sup)

![](https://cdn-images-1.medium.com/max/1024/1*nKUNls7ydYeCSY-BFaMWDQ.png)

Création du serveur k3s avec k3sup :

![](https://cdn-images-1.medium.com/max/1024/1*MhSUTbOiBi5YipXJbJ1rGg.png)

Création et connexion des Workers du cluster k3s :

![](https://cdn-images-1.medium.com/max/1024/1*jEWyfYnEj8rMsgaJ9CH1SA.png)

![](https://cdn-images-1.medium.com/max/1024/1*GUz6nMIzVXEvcNxXviSZpA.png)

Le cluster k3s est opérationnel au travers du réseau privé fourni par le serveur Headscale :

![](https://cdn-images-1.medium.com/max/1024/1*wr-e8rP8ZdCu0y-fcQ9OUg.png)

Rapide déploiement du sempiternel démonstrateur FC via ce manifest YAML :

![](https://cdn-images-1.medium.com/max/1024/1*6QU2BweKIZC7EBgzVGOt7g.png)

![](https://cdn-images-1.medium.com/max/1024/1*lM_7wnA_S-JM4sbVMKjiLw.png)

Le démonstrateur est accessible via Traefik et j’utilise MagicDNS pour cela sur les trois noeuds du cluster pour y accéder :

![](https://cdn-images-1.medium.com/max/1024/1*Naf_Y6aytBW476O7w8dj8g.png)

![](https://cdn-images-1.medium.com/max/1024/1*09rzZq2fzeXoMI19EWKN-g.png)

![](https://cdn-images-1.medium.com/max/1024/1*F8nAVgkLUHuzFRSe6JEdxg.png)

![](https://cdn-images-1.medium.com/max/1024/1*5V-TudaIlZZFuRFNloDbRQ.png)

![](https://cdn-images-1.medium.com/max/1024/1*zlukgIjlYITwOxmE7x2lNA.png)

J’aurais pu aussi déployer un serveur web de test sur un noeud pour tester sa latence …

![](https://cdn-images-1.medium.com/max/1024/1*y8U1fAMUC9da93WzXnwMgg.png)

![](https://cdn-images-1.medium.com/max/1024/1*If2vhpv2IUJsYObalEutow.png)

avec **_httping_** par exemple :

[httping](https://www.vanheusden.com/httping/)

![](https://cdn-images-1.medium.com/max/1024/1*iIkAGkQOiehDXwQOQsn6eQ.png)

![](https://cdn-images-1.medium.com/max/1024/1*_gvFAK_9oW3BAT5Br1wS1g.png)

Le serveur Headscale au final n’ayant pas consommé énormément de ressources sur l’instance Ubuntu 20.04 :

![](https://cdn-images-1.medium.com/max/1024/1*yVBeq3F1ynJoTR8rDNcSRA.png)

On a vu qu’il était possible de se passer d’un serveur de coordination Tailscale via cette implémentation open source.

> On peut adapter son réseau privé pour y ajouter ou supprimer des nœuds, diviser les sous-réseaux à l’aide des namespaces (on peut créer un réseau VPN pour plusieurs utilisateurs), organiser l’accès partagé des nœuds aux sous-réseaux dans différents namespaces, contrôler le routage (y compris l’attribution de nœuds de sortie pour accéder au monde extérieur).

[Headscale, une implémentation open source de Tailscale](https://blog.desdelinux.net/fr/headscale-una-implementacion-de-codigo-abierto-de-tailscale/)

Il manque encore la possibilité d’obtenir le mode Subnet Router, le mode Certificat SSL ou une interface Web comme on n’a pu le voir dans le précédent article mais il est probable que cela puisse apparaître dans les futures versions d’Headscale …

[Issues · juanfont/headscale](https://github.com/juanfont/headscale/issues)

> Une image Docker officielle existe avec un modus operandi exposé sur le dépôt GitHub :

- [headscale/running-headscale-container.md at main · juanfont/headscale](https://github.com/juanfont/headscale/blob/main/docs/running-headscale-container.md)
- [Docker Hub](https://hub.docker.com/r/headscale/headscale)

![](https://cdn-images-1.medium.com/max/953/1*XeB8PGAwtpAtKmFFR-hplw.png)

À suivre !