Pourquoi reconsidérer son réseau mesh en 2026
Tailscale ne transporte pas votre trafic : les paquets WireGuard voyagent directement entre vos machines, chiffrés de bout en bout. Ce que Tailscale gère côté cloud, c'est le plan de contrôle — l'échange de clés publiques, la découverte des pairs, l'attribution des adresses 100.x.x.x, la résolution MagicDNS et la distribution des relais DERP. Ce plan de contrôle, vous pouvez l'héberger vous-même avec Headscale depuis des années. En 2026, la hausse tarifaire rend cette option financièrement évidente pour toute équipe d'au moins deux personnes sur un plan payant.
- Contrôle total des données : aucune liste de vos machines, adresses IP internes, noms de nœuds ou journaux de connexion ne transite par un serveur tiers.
- Pas de limite de nœuds ni d'utilisateurs imposée par le logiciel : Headscale est borné uniquement par les ressources de votre VPS.
- Compatibilité totale avec les clients Tailscale officiels : le drapeau
--login-serversuffit à pointer vers votre control plane. - MagicDNS sur votre propre domaine : chaque nœud est joignable par son nom court sur le suffixe que vous choisissez.
- OIDC optionnel : délégation d'authentification à Keycloak, Authelia ou tout fournisseur OIDC compatible.
- Pérennité opérationnelle : votre réseau mesh ne dépend plus d'une décision tarifaire ou d'une indisponibilité externe.
- Maintenance raisonnable : une mise à jour de paquet toutes les quelques semaines, une sauvegarde SQLite planifiable en une ligne de cron.
Analyse financière : le seuil de rentabilité
Tailscale Personal reste gratuit pour six utilisateurs maximum sur un usage non commercial. Dès que vous passez sur le plan Standard — une équipe professionnelle, un accès multi-utilisateurs ou des fonctionnalités comme les ACLs étendues — le coût est $8 par siège par mois. Un VPS 1 vCPU / 1 Go RAM suffit à faire tourner Headscale pour des dizaines de nœuds ; il tourne en moins de 64 Mo de RAM au repos. Le coût de ce VPS chez ServOrbit commence à partir de quelques euros par mois.
Tailscale Standard vs Headscale sur VPS
Faites défiler le tableau
| Critère | Tailscale Standard | Headscale sur VPS |
|---|---|---|
| Coût mensuel (1 siège) | $8 | coût du VPS (~99 DH/mois) |
| Coût mensuel (5 sièges) | $40 | coût du VPS (~99 DH/mois) |
| Coût mensuel (10 sièges) | $80 | coût du VPS (~99 DH/mois) |
| Funnel / Serve | Inclus | Non disponible |
| SSH Recording | Plan Premium uniquement | Non disponible |
| Maintenance | Nulle (service managé) | ~2h/mois (mises à jour, sauvegardes) |
| Contrôle des données | Cloud Tailscale | Votre serveur |
| Limite de nœuds | 100 (Standard) | Aucune limite logicielle |
| Limite d'utilisateurs | Sans limite fixe sur Standard | Aucune limite logicielle |
Prérequis techniques chiffrés
Headscale est léger : un VPS d'entrée de gamme suffit pour une dizaine de nœuds. Voici les ressources minimales et les ports à ouvrir.
- VPS sous Debian 11/12 ou Ubuntu 22.04/24.04 — 1 vCPU, 512 Mo RAM minimum (Headscale tourne en moins de 64 Mo idle ; 1 Go recommandé pour laisser de la marge au système).
- Port TCP 443 ouvert côté entrant : les clients s'y connectent pour l'enregistrement et la récupération de configuration via HTTPS.
- Port UDP 3478 ouvert : utilisé pour la négociation STUN (détection des adresses candidates pour les connexions directes).
- Port UDP 41641 ouvert : port de signalisation WireGuard que les clients Tailscale utilisent pour contacter le coordinateur.
- Un nom de domaine ou sous-domaine pointant vers le VPS : requis pour un certificat TLS valide. Let's Encrypt fonctionne via certbot ou via le module nginx intégré.
- SQLite intégré : Headscale n'a besoin d'aucune base de données externe — une seule base SQLite dans
/var/lib/headscale/suffit pour des centaines de nœuds.
Installer Headscale sur un VPS ServOrbit
Les étapes suivantes partent d'un VPS Debian 12 vierge. L'installation prend moins de dix minutes.
Mettre à jour le système et installer les dépendances
Connectez-vous en SSH à votre VPS et mettez à jour les paquets :
apt update && apt upgrade -yInstallez nginx et certbot pour le reverse proxy HTTPS :
apt install -y nginx certbot python3-certbot-nginxTélécharger et installer le paquet Headscale
Headscale v0.29.4 (septembre 2026) distribue des paquets
.debpour amd64 et arm64. Téléchargez et installez le paquet :curl -Lo /tmp/headscale.deb https://github.com/juanfont/headscale/releases/download/v0.29.4/headscale_0.29.4_linux_amd64.debdpkg -i /tmp/headscale.debVérifiez l'installation :
headscale versiondoit retourner0.29.4. Sur ARM64, remplacezlinux_amd64parlinux_arm64.Configurer Headscale
Le paquet crée l'utilisateur système
headscaleet le dossier/etc/headscale/. Éditez la configuration minimale :nano /etc/headscale/config.yamlDéfinissez au minimum :
server_url: https://headscale.votre-domaine.com,listen_addr: 0.0.0.0:8080,db_type: sqlite3,db_path: /var/lib/headscale/db.sqlite, et dansdns_config:magic_dns: true,base_domain: votre-domaine.com. Créez le dossier de données :mkdir -p /var/lib/headscale && chown headscale:headscale /var/lib/headscale.Activer et démarrer le service
Le paquet installe l'unité systemd automatiquement :
systemctl enable --now headscaleVérifiez l'état :
systemctl status headscale. La sortie doit afficherActive: active (running). En cas d'erreur, consultez les journaux :journalctl -u headscale -f. L'erreur la plus fréquente au premier démarrage est unserver_urlmal formé — il doit commencer parhttps://.Mettre en place le reverse proxy HTTPS
Obtenez un certificat Let's Encrypt et configurez nginx :
certbot --nginx -d headscale.votre-domaine.comDans le vhost nginx généré, ajoutez dans le bloc
location /:proxy_pass http://127.0.0.1:8080;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;Rechargez nginx :
systemctl reload nginx. Vérifiez quehttps://headscale.votre-domaine.com/healthretourne{"status":"pass"}.Créer un premier utilisateur et une pré-clé d'authentification
Headscale organise les nœuds par utilisateurs. Créez votre premier utilisateur :
headscale users create mon-equipeGénérez une pré-clé d'authentification (preauthkey) pour enregistrer vos machines sans validation manuelle :
headscale preauthkeys create --user mon-equipe --expiration 24hCopiez la clé retournée — vous en aurez besoin à l'étape de migration des clients. L'option
--reusablepermet de réutiliser la même clé pour plusieurs machines.Ouvrir les ports nécessaires dans le pare-feu
Si votre VPS utilise
ufw, ouvrez les ports requis :ufw allow 443/tcpufw allow 3478/udpufw allow 41641/udpSi vous utilisez
iptablesdirectement ou un panel de sécurité (CSF, Imunify360), ajoutez ces ports dans la liste des ports entrants autorisés. Vérifiez depuis une machine externe que les ports UDP sont bien joignables avant de migrer vos clients.
Migrer ses clients depuis Tailscale en 3 étapes
La migration ne nécessite aucune réinstallation des clients Tailscale. Le client officiel supporte le drapeau --login-server depuis plusieurs versions ; il suffit de déconnecter le client de l'ancien réseau et de le reconnecter vers votre serveur Headscale. Le trafic réseau WireGuard entre les nœuds n'est pas interrompu pendant la migration — seule la fenêtre de déconnexion/reconnexion (quelques secondes par nœud) crée une brève interruption.
Déconnecter le client du réseau Tailscale existant
Sur chaque machine à migrer, commencez par déconnecter le client du réseau Tailscale :
tailscale logoutSur macOS et Windows, utilisez le menu de la barre d'état system : clic droit sur l'icône Tailscale → Log out. Sur iOS et Android, allez dans les paramètres de l'application → Log out. Cette étape révoque l'authentification sur l'ancien réseau mais ne désinstalle pas le client.
Reconnecter le client vers votre serveur Headscale
Reconnectez le client en pointant vers votre nouveau serveur Headscale. Sur Linux :
tailscale up --login-server https://headscale.votre-domaine.com --authkey VOTRE_PREAUTHKEYSur macOS, depuis le terminal :
tailscale up --login-server https://headscale.votre-domaine.com --authkey VOTRE_PREAUTHKEYSi vous ne passez pas de preauthkey, le client affiche une URL d'authentification à valider côté serveur avec :
headscale nodes register --user mon-equipe --key <NODE_KEY>. Vérifiez l'enregistrement :headscale nodes listdoit afficher le nœud avec le statutonline.Vérifier la connectivité entre les nœuds migrés
Depuis un nœud migré, vérifiez que les autres nœuds sont visibles :
tailscale statusLa liste doit afficher tous les nœuds enregistrés sur votre serveur Headscale avec leur IP mesh (
100.64.x.x). Testez la connectivité directe avec un ping :ping 100.64.0.2. Un statutactive (direct)confirme que la connexion WireGuard est établie sans relais. Si vous avez activé MagicDNS, testez la résolution :ping nom-du-noeud.votre-domaine.com.Migrer les nœuds restants et fermer le compte Tailscale
Répétez les deux étapes précédentes pour chaque machine. Migrez d'abord les machines de développement ou de test pour valider le process, puis les machines de production. Une fois tous les nœuds migrés et vérifiés, vous pouvez fermer votre compte Tailscale ou rétrograder sur le plan Personal si vous avez encore des usages personnels (six utilisateurs max, gratuit). Conservez la preauthkey utilisée ou générez-en une nouvelle pour les prochains nœuds à enregistrer.
Configuration des ACLs et des DNS internes
Headscale gère les politiques d'accès via un fichier de politique au format HuJSON (JSON étendu avec commentaires), compatible avec la syntaxe Tailscale ACL. Ce fichier définit quels utilisateurs ou groupes peuvent accéder à quels nœuds sur quels ports. Par défaut, tous les nœuds d'un même réseau Headscale peuvent se joindre sur tous les ports — ce comportement permissif convient à une petite équipe de confiance, mais doit être restreint dès que des nœuds de statuts différents (développeurs, clients, serveurs de production) coexistent sur le même réseau.
- Éditez le fichier de politique :
headscale policy set --policy-file /etc/headscale/policy.hujson - Définissez des groupes d'utilisateurs (
groups) et des ACLs par port pour segmenter les accès entre les environnements dev, staging et prod. - Activez les DNS split pour résoudre les noms internes : dans
dns_config, définisseznameserversavec vos serveurs DNS internes etsearch_domainspour les suffixes de recherche. - Exportez et versionez votre fichier de politique dans un dépôt Git privé — cela facilite les audits et les retours arrière.
- Testez les changements de politique sur un nœud de test avant de les appliquer à l'ensemble du réseau :
headscale policy check.
Durrcissement, sauvegardes et mises à jour automatiques
Quelques précautions pour une installation robuste. Sauvegardez la base SQLite régulièrement : cp /var/lib/headscale/db.sqlite /backup/headscale-$(date +%Y%m%d).sqlite — un cron quotidien ou un script vers un stockage objet S3 suffit. Sauvegardez également les clés privées dans /var/lib/headscale/private.key et /var/lib/headscale/noise_private.key : elles signent l'identité de votre serveur et ne peuvent pas être régénérées sans forcer la reconnexion de tous les nœuds. Pour les mises à jour automatiques, configurez unattended-upgrades sur Debian/Ubuntu : les paquets de sécurité système sont appliqués automatiquement, et vous pouvez inclure le dépôt Headscale dans la liste des sources traitées automatiquement. Restreignez l'accès à l'API d'administration Headscale (port 50443 gRPC) à 127.0.0.1 uniquement — ne l'exposez jamais à Internet directement.
Dépannage des problèmes fréquents
Les erreurs les plus courantes après la migration et leurs solutions.
- Nœud affiche
offlinedansheadscale nodes list: vérifiez que les ports UDP 3478 et 41641 sont bien ouverts côté VPS. Testez depuis une machine externe avecnc -vzu headscale.votre-domaine.com 41641. - Connexion en
relayau lieu dedirect: les connexions indirectes via DERP passent quand les deux nœuds ne peuvent pas s'atteindre directement (NAT strict, pare-feu). Vérifieztailscale netchecksur les deux nœuds pour identifier les contraintes réseau. - MagicDNS ne résout pas les noms : vérifiez que
magic_dns: trueetbase_domainsont bien définis dans la configuration Headscale, et que le client a bien récupéré la nouvelle configuration DNS après la reconnexion (tailscale status --self). - Certificat TLS invalide au démarrage : le
server_urldansconfig.yamldoit correspondre exactement au domaine du certificat. Une URL enhttp://alors que nginx attendhttps://déclenche des erreurs de redirection en boucle. - Clients macOS ou Windows ne voient pas l'option
--login-serverdans l'interface graphique : utilisez toujours le terminal pour la migration. L'interface graphique Tailscale ne permet pas de changer de serveur de coordination ; seule la ligne de commande le permet.
Ce que Headscale ne remplace pas
Headscale implémente le protocole du plan de contrôle Tailscale, mais pas l'ensemble des fonctionnalités de la plateforme commerciale. Tailscale Funnel (exposition de services locaux vers Internet) et Serve (reverse proxy local) ne sont pas disponibles dans Headscale. SSH Recording (enregistrement des sessions SSH via le mesh) est une fonctionnalité Premium Tailscale absente d'Headscale. Ces manques sont documentés et stables : le projet Headscale suit activement la compatibilité avec le protocole Tailscale, pas avec les fonctionnalités d'interface. Si votre usage se limite à la connectivité mesh, au MagicDNS et aux ACLs — le cas de la grande majorité des équipes techniques — Headscale couvre intégralement le besoin. Si vous utilisez activement Funnel ou SSH Recording, évaluez si ces fonctionnalités justifient le coût différentiel avant de migrer.