Utiliser Headscale pour un Accès VPN Auto-Hébergé
Tailscale simplifie les VPN — il crée un réseau maillé basé sur WireGuard où chaque appareil reçoit une IP unique et peut atteindre directement tous les autres appareils. L’inconvénient est que Tailscale dépend de leur serveur de contrôle pour la coordination.
Headscale est la réponse open-source : il implémente le protocole de contrôle Tailscale afin que vous puissiez exécuter votre propre serveur de coordination. Cela signifie aucune dépendance envers un service externe et un contrôle total sur votre réseau maillé.
Architecture
┌─────────────────┐ WireGuard ┌──────────────────┐
│ Laptop (home) │ ◄──────────────────► │ Headscale Server │
│ 100.x.x.1 │ │ vpn-srv:8080 │
└─────────────────┘ └────────┬─────────┘
▲ │
│ WireGuard mesh │
▼ │
┌─────────────────┐ │
│ Phone (4G) │ ◄──────────────────────────────┘
│ 100.x.x.2 │
└─────────────────┘
Chaque nœud se connecte au serveur Headscale, reçoit une IP unique dans la plage 100.x.x.x/10, et peut atteindre les autres nœuds directement via WireGuard (pair-à-pair lorsque c’est possible, relayé via DERP lorsque la traversée NAT échoue).
Configuration de Headscale
Sur un conteneur LXC dédié :
# Télécharger la dernière version
wget https://github.com/juanfont/headscale/releases/latest/download/headscale_0.23.0_linux_amd64.deb
dpkg -i headscale_0.23.0_linux_amd64.deb
# Configurer
nano /etc/headscale/config.yaml
Paramètres de configuration clés :
server_url: https://vpn.tuxvador.fr:8080
listen_addr: 0.0.0.0:8080
grpc_listen_addr: 0.0.0.0:50443
private_key_path: /var/lib/headscale/private.key
derp:
server:
enabled: true
stun_listen_addr: 0.0.0.0:3478
dns_config:
base_domain: headscale.home.lab
Activer et démarrer :
systemctl enable --now headscale
Ajouter des Nœuds
Sur le serveur Headscale :
headscale users create homelab
headscale preauthkeys create -user homelab -expiration 24h
Sur chaque client (ordinateur portable, téléphone, serveur) :
Installez le client Tailscale et pointez-le vers votre serveur Headscale :
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up --login-server=https://vpn.tuxvador.fr:8080 --authkey <your-key>
L’appareil s’enregistre auprès de votre serveur et reçoit une IP. Répétez pour chaque nœud que vous souhaitez dans le maillage.
Vérifier le Maillage
tailscale status
Vous devriez voir tous les nœuds connectés et leurs IP. Testez la connectivité :
ping 100.x.x.2
Routage vers les Services Internes
La vraie valeur est d’accéder aux services internes qui ne sont pas exposés sur Internet. Si votre blog tourne sur dev-srv:5000, ajoutez une route de sous-réseau Tailscale :
Sur votre conteneur dev-srv :
tailscale up --login-server=https://vpn.tuxvador.fr:8080 --advertise-routes=10.99.99.0/24
Ensuite, sur le serveur Headscale, activez la route :
headscale routes enable -r <route-id>
Maintenant, depuis votre ordinateur portable sur Tailscale, vous pouvez accéder directement à http://10.99.99.20:5000 — sans proxy inverse ni redirection de port.
Pourquoi Auto-Héberger ?
- Aucune dépendance : Le SaaS de Tailscale pourrait tomber en panne ou modifier ses conditions d’utilisation. Votre serveur Headscale vous appartient.
- Contrôle total : Les logs, clés et l’authentification restent dans votre infrastructure.
- DNS personnalisé : Mettez en place votre propre résolution de domaine au sein du maillage.
- Réseaux isolés : Fonctionne entièrement hors ligne si nécessaire.
Utilisation des Ressources
Headscale est extrêmement léger. Sur mon conteneur Debian 13 :
- ~50 Mo de RAM avec 5 nœuds actifs
- CPU minimal — occupé seulement lors de l’enregistrement des nœuds et des échanges de clés
- WireGuard gère le trafic réel, donc le débit dépend de votre lien, pas de Headscale
Pour un homelab, c’est la solution VPN parfaite — sans abonnement, sans dépendance externe, et les performances de WireGuard sont excellentes.