Tailscale hat das Aufsetzen eines privaten Mesh-Netzwerks fast schon trivial gemacht: WireGuard unter der Haube, NAT-Traversal, das ganze Schlüsselgefummel verschwindet hinter einem Login. Der Haken aus Self-Hoster-Sicht: Der Koordinationsserver, der sogenannte Control Server, läuft in Tailscales Cloud und ist als einziger Teil des Stacks nicht quelloffen. Genau diese Lücke schließt Headscale, eine in Go geschriebene, selbst gehostete Implementierung dieses Control Servers. Das Projekt steht unter BSD-3-Clause-Lizenz, hat auf GitHub rund 36.000 Sterne und liegt aktuell bei Version 0.28.0.
Kurz zur Einordnung: Was macht ein Control Server überhaupt?
Tailscale ist im Kern ein modernes VPN auf WireGuard-Basis, das ein Overlay-Netzwerk zwischen den Rechnern eines Netzwerks aufspannt und dabei NAT-Traversal nutzt. Bei Tailscale ist tatsächlich fast alles Open Source, mit Ausnahme der GUI-Clients für Windows und macOS/iOS sowie eben des Control Servers.
Dieser Control Server ist die zentrale Vermittlungsstelle. Er tauscht die öffentlichen WireGuard-Schlüssel der Knoten im Netzwerk aus, vergibt die IP-Adressen der Clients, zieht die Grenzen zwischen den Nutzern, ermöglicht das Teilen von Maschinen und gibt die angekündigten Routen der Knoten bekannt. Das eigentliche VPN läuft danach direkt zwischen den Geräten (Peer-to-Peer), der Control Server koordiniert nur, er ist kein Datendurchlauf. Genau diese Koordinationsrolle übernimmt Headscale auf der eigenen Infrastruktur.
Designziel: bewusst schlank
Headscale verfolgt ein klar umrissenes Ziel: eine quelloffene Alternative zum Tailscale-Control-Server für Self-Hoster, Enthusiasten und Hobbyisten. Der Fokus liegt ausdrücklich auf einem schmalen Funktionsumfang, konkret auf einem einzelnen Tailnet, das für den persönlichen Gebrauch oder eine kleine Open-Source-Organisation gedacht ist. Wer also ein vielmandantenfähiges Enterprise-System mit Dutzenden getrennter Netzwerke sucht, ist hier falsch; wer sein Homelab, seine Server und ein paar Clients in ein privates Mesh holen will, genau richtig.
Sympathisch transparent: Einer der aktiven Maintainer ist bei Tailscale angestellt und darf Arbeitszeit ins Projekt stecken, dessen Beiträge werden aber von anderen Maintainern gegengeprüft. Mit Tailscale Inc. als Unternehmen ist das Projekt offiziell nicht verbunden.
Was Headscale kann
Der Funktionsumfang deckt die „Base”-Features von Tailscale weitgehend ab. Die wichtigsten Punkte:
Knoten-Registrierung, sowohl per Web-Authentifizierung als auch über vorab generierte Pre-Auth-Keys, was sich gut für automatisiertes Provisioning eignet.
DNS MagicDNS, globale und eingeschränkte Nameserver (Split DNS) sowie Search Domains. Eine Headscale-exklusive Zugabe sind zusätzliche, frei definierbare DNS-Records.
Routing Subnet Router, um ganze Netzsegmente ins Tailnet zu holen, und Exit Nodes, um den gesamten Datenverkehr über einen bestimmten Knoten zu leiten. Beide lassen sich über Auto-Approvers automatisch freigeben.
Zugriffssteuerung (ACLs) verwaltbar über die API, inklusive einiger Autogroups (etwa autogroup:internet, autogroup:member, autogroup:tagged) und Unterstützung für Tailscale SSH.
Single Sign-On via OpenID Connect Knoten lassen sich über einen OIDC-Provider registrieren und Nutzerprofile von dort übernehmen. Eine Einschränkung, die man kennen sollte: OIDC-Gruppen lassen sich derzeit nicht in ACLs verwenden.
Weiteres Taildrop für Dateiübertragung, Tags, Dual Stack (IPv4 und IPv6), Ephemeral Nodes für kurzlebige Geräte und ein eingebetteter DERP-Server als Fallback-Relay, wenn keine direkte Verbindung zustande kommt.
Was (noch) fehlt, sollte man ebenfalls auf dem Schirm haben: Funnel, Serve und Network Flow Logs sind nicht implementiert, entsprechende Issues sind aber offen.
Betrieb: ein eigenwilliger Hinweis
Ein Punkt, der erfahrene Self-Hoster zunächst stutzen lässt: Die Maintainer schreiben im README ausdrücklich, dass sie den Einsatz von Reverse Proxies und Containern für den Betrieb von Headscale weder unterstützen noch empfehlen. Das heißt nicht, dass es nicht geht, die Dokumentation enthält durchaus eine Container-Anleitung, sondern dass die offizielle Unterstützung sich auf den direkten Betrieb des Binaries konzentriert. Wer Probleme meldet, sollte das also idealerweise mit einem nativen Setup reproduzieren. Für NixOS-Anwender liegt dem Projekt zudem ein eigenes Modul im Verzeichnis nix/ bei.
Die Installation selbst ist dank Go-Binary unkompliziert. Headscale wird über eine zentrale config.yaml konfiguriert; ein gut kommentiertes config-example.yaml liegt im Repository. Wichtig dabei: Bei den Beispielkonfigurationen immer denselben Git-Tag wie die eingesetzte Version verwenden, da der main-Branch bereits unveröffentlichte Änderungen enthalten kann.
Sind Server und Konfiguration einsatzbereit, verbinden sich die ganz normalen, offiziellen Tailscale-Clients, man weist sie lediglich per --login-server auf die eigene Headscale-Instanz statt auf die Tailscale-Cloud:
tailscale up --login-server https://headscale.example.com
Die Verwaltung von Nutzern, Knoten und Pre-Auth-Keys läuft anschließend über die headscale-CLI auf dem Server, etwa:
# Einen Nutzer anlegen
headscale users create homelab
# Einen Pre-Auth-Key für automatisierte Registrierung erzeugen
headscale preauthkeys create --user homelab --reusable --expiration 24h
# Alle registrierten Knoten auflisten
headscale nodes list
Warum das gerade fürs Homelab interessant ist
Der Reiz liegt in der Kombination zweier Dinge: Man behält den Komfort des Tailscale-Ökosystems, die ausgereiften Clients über alle Plattformen, MagicDNS, das mühelose Peer-to-Peer-Mesh, und entzieht gleichzeitig die zentrale Koordination der fremden Cloud. Für alle, die ihre Geräte, Server und Dienste ohnehin schon konsequent selbst betreiben, schließt sich damit eine der letzten Abhängigkeiten. Das eigene Tailnet, der eigene Control Server, volle Datenhoheit über die Metadaten des Netzwerks.
Wer bislang vor dem rohen WireGuard-Schlüsselmanagement zurückgeschreckt ist, aber Tailscale aus Prinzip nicht in die Cloud auslagern wollte, findet in Headscale den pragmatischen Mittelweg. Ein klar umrissenes Werkzeug, das genau eine Sache tut, und das richtig.
Repository: github.com/juanfont/headscale · Dokumentation: headscale.net · Lizenz: BSD-3-Clause