00:00:00Das ist Headscale, eine kostenlose Open-Source-Version von Tailscale, die du auf jedem beliebigen Server installieren kannst.
00:00:06So behältst du die volle Kontrolle über dein verschlüsseltes Netzwerk, falls das Internet mal ausfällt oder Tailscale plötzlich die Preise erhöht.
00:00:13Das Kuriose ist jedoch, dass Headscale von einem Tailscale-Mitarbeiter entwickelt wurde.
00:00:18Warum bezahlen sie jemanden dafür, ihre eigene Konkurrenz aufzubauen?
00:00:22Abonniere den Kanal und lass es uns herausfinden.
00:00:25Schauen wir uns Headscale kurz in Aktion an, bevor wir tiefer ins Detail gehen.
00:00:30Alles klar, ich habe hier drei Hetzner-Server: einen für die Headscale-Steuerungsebene und zwei Knoten, die ich miteinander verbinden möchte.
00:00:40Diese beiden sind aktuell Teil meines verschlüsselten Netzwerks.
00:00:44Da alles über Docker läuft, kann ich mir mit diesem Befehl die aktuellen Knoten ansehen – hier „Ubuntu Test“ und „Ubuntu Test 2“.
00:00:53Und das sind die IP-Adressen, über die ich mich mit ihnen verbinden kann.
00:00:56Versuchen wir nun, uns von einem Knoten aus mit dem anderen zu verbinden.
00:00:59Zuerst kopiere ich diese IP-Adresse.
00:01:02Und jetzt werde ich mich von „Ubuntu Test 2“ aus als Root per SSH einloggen.
00:01:07Ja, ich weiß, man sollte sich nicht als Root einloggen, aber das dient nur Testzwecken.
00:01:09Das hier ist die IP-Adresse von Headscale.
00:01:11Wenn ich Enter drücke und den Bildschirm leere, sieht man: Ich bin jetzt auf „Ubuntu Test 1“.
00:01:17Ich bin also von Test 2 zu Test 1 gewechselt und kann mit „exit“ wieder zurückkehren.
00:01:24Das Gleiche klappt auch andersrum, wenn ich von Test 1 aus „ssh root“ und die IP von Test 2 eingebe.
00:01:31Nach dem Leeren des Bildschirms sehen wir: Ich bin jetzt von Test 1 aus auf „Ubuntu Test 2“.
00:01:36Wenn ich mich jedoch außerhalb des Tailnets befinde – ich öffne hier einen neuen Tab auf meinem Mac – und versuche, mich per SSH mit Test 2 zu verbinden...
00:01:48...dann passiert gar nichts, weil ich eben nicht Teil des Tailnets bin.
00:01:52Wie du siehst, ermöglicht Headscale den vollen Zugriff auf dein Netzwerk.
00:01:56Du kontrollierst jedes Detail und kannst beliebig viele Knoten hinzufügen, ganz ohne Vendor-Lock-in.
00:02:03Es funktioniert sogar ohne Internet, wenn du es zum Beispiel auf einem NAS oder einem alten Raspberry Pi installierst.
00:02:08Allerdings ist die Einrichtung etwas aufwendiger.
00:02:11Ich zeige dir mal, wie das Ganze funktioniert.
00:02:13Ich habe einen neuen Server namens „Ubuntu Test 3“ erstellt und werde nun ein neues Tailnet bzw. einen verschlüsselten Server mit einem neuen Benutzer anlegen, der zwei Knoten verbindet.
00:02:24Dafür nutzen wir zu Testzwecken „Ubuntu Test 3“ und „Ubuntu Test 1“.
00:02:29Auf meiner Headscale-Steuerungsebene ist Headscale bereits installiert, aber ich gehe den Prozess noch einmal mit euch durch.
00:02:37Aktuell laufen bei mir drei Docker-Container.
00:02:40Einer für das Headscale-UI, einer für Headscale selbst und einer für Caddy.
00:02:45In der Docker-Compose-Datei sehen wir, dass die Konfiguration der aus der offiziellen Headscale-Dokumentation sehr ähnlich ist.
00:02:56Ich habe lediglich ein paar Kleinigkeiten wie die Version und die Verzeichnispfade angepasst.
00:03:03Außerdem nutze ich einen Container für das Headscale-UI, eines der vielen Open-Source-Web-Interfaces für Headscale.
00:03:11Das zeige ich euch gleich noch genauer.
00:03:13Caddy dient dabei als Reverse Proxy.
00:03:16Einen Link zu dieser speziellen Docker-Compose-Datei packe ich euch in die Videobeschreibung.
00:03:21In diesem Verzeichnis haben wir zudem einen „lib“- und einen „config“-Ordner.
00:03:26Im „lib“-Ordner liegt hauptsächlich die SQLite-Datenbank, die Benutzer-, Knoten-, DNS-Informationen und mehr verwaltet.
00:03:36Wer kein SQLite nutzen möchte, kann in der Konfiguration stattdessen auf eine Postgres-Datenbank umstellen.
00:03:43Das „config“-Verzeichnis enthält die Tailscale-Konfiguration und die ACL-Richtlinien in einer menschenlesbaren JSON-Datei.
00:03:52Darauf kommen wir noch zu sprechen, aber schauen wir uns erst einmal die Vorlage an, die man aus der Dokumentation kopieren oder direkt per „curl“ laden kann.
00:04:01In der Beispielkonfiguration auf GitHub sehen wir alles, was anpassbar ist – vom Server über Präfixe bis hin zum Speicherort der Richtliniendatei.
00:04:11Meine Konfiguration sieht fast genauso aus; ich habe nur die Server-URL auf eine Cloudflare-Domain geändert, damit die Knoten wissen, wo sie die anderen finden.
00:04:23Dann noch den Pfad zur Richtliniendatei ergänzt, und das war's im Grunde.
00:04:28Die Domain ist eine typische Cloudflare-Domain mit einem A-Record, der über eine Subdomain auf die IP meines Headscale-Servers verweist.
00:04:37In der Caddy-Datei sieht man, dass zwei URLs verwendet werden: eine für das UI unter „/web“ und eine für den Headscale-Proxy.
00:04:49Sobald das steht, muss als Erstes ein neuer Benutzer angelegt werden. Das geht mit diesem Befehl.
00:04:56Ich nenne den Benutzer „Tom“, aber der Name ist völlig egal.
00:05:00Der Benutzer ist erstellt. Mit „users list“ sehen wir alle User – unser neuer User hat hier die ID 6.
00:05:08Bisher sind diesem Benutzer aber noch keine Knoten zugewiesen.
00:05:11Geben wir Tom also ein paar Knoten.
00:05:13Auf dem neuen Server „Ubuntu Test 3“ müssen wir zuerst den Tailscale-Client installieren, indem wir diesen Befehl ausführen.
00:05:23Damit haben wir Zugriff auf die Tailscale-Binärdatei.
00:05:27Hinweis: Wenn du nicht als Root angemeldet bist, musst du die Befehle eventuell mit „sudo“ ausführen.
00:05:31Bevor wir Tailscale starten oder uns einloggen, müssen wir das auf eine spezielle Weise tun, die mit Headscale kompatibel ist.
00:05:38Dazu benötigen wir „Pre-Auth-Keys“. Den passenden Befehl finden wir in der Headscale-Dokumentation unter „Getting Started“.
00:05:46Ich scrolle runter und kopiere mir den Befehl.
00:05:49In meiner Headscale-Konsole gebe ich nun „docker exec“ ein und füge den Befehl ein.
00:05:54Bei der User-ID tragen wir die 6 für Tom ein.
00:05:59Ich muss noch ein zweites Mal „headscale“ davor schreiben, da wir ja in den Container hineingehen.
00:06:04Und da haben wir unseren Pre-Auth-Key.
00:06:07Diesen Befehl kopieren wir nun und führen ihn auf „Ubuntu Test 3“ aus.
00:06:11Wir fügen den Key hier ein.
00:06:15Zuletzt ändern wir den Login-Server auf unsere Headscale-Adresse, die wir als „headscale.pandor.css“ konfiguriert haben.
00:06:23Pandora war leider schon vergeben, sonst hätte ich das genommen.
00:06:26Mit Enter sollte der neue Knoten nun unserem Headscale-Netzwerk hinzugefügt werden.
00:06:31Zurück in der Steuerungsebene zeigt uns „nodes list“ nun „Ubuntu Test 3“ an, der Benutzer Tom gehört und diese IP-Adressen hat.
00:06:44Jetzt fügen wir auch „Ubuntu Test 1“ dem Benutzer Tom hinzu.
00:06:47Dafür lösche ich zuerst den alten Knoten mit der ID 1 und erzwinge das Löschen, um die Bestätigung zu überspringen.
00:06:56Danach erstelle ich einen neuen Pre-Auth-Key und füge ihn bei „Ubuntu Test“ hinzu, wobei ich SSH mit dem entsprechenden Flag aktiviere.
00:07:06Das Gleiche mache ich bei „Ubuntu Test 3“, um die SSH-Verbindung zu ermöglichen.
00:07:13In der Knotenliste erscheinen nun beide Server, Test 1 und Test 3, unter dem User Tom.
00:07:20Versuchen wir, sie zu verbinden.
00:07:21Ich kopiere die IP von Test 3, gehe in Test 1 und gebe „ssh root“ mit dieser IP ein.
00:07:30Nachdem der Key akzeptiert wurde, bin ich von Test 1 aus auf Test 3 eingeloggt.
00:07:35Und das funktioniert natürlich auch in die Gegenrichtung.
00:07:41Falls du meine Schritte exakt befolgt hast, ist die Chance groß, dass es bei dir noch nicht klappt, weil noch die Zugriffsrichtlinien fehlen.
00:07:49Ich zeige dir mal meine.
00:07:51Wenn ich in das Headscale-Verzeichnis gehe, sehen wir im Config-Ordner diese menschenlesbare ACL-JSON-Datei.
00:08:01In dieser sehr einfachen Konfiguration wird im Grunde jede Quelle aus meinem Netzwerk für jedes Ziel und jeden Port akzeptiert.
00:08:11Außerdem erlaubt sie jedem Knoten im Tailnet, sich per SSH ohne zusätzliche Freigabe mit jedem anderen Knoten als Root zu verbinden.
00:08:24Je nach Netzwerk und Sicherheitsanspruch wirst du das sicher strenger regeln wollen, damit nur bestimmte Knoten auf bestimmte Ports zugreifen dürfen.
00:08:33Aber für den Anfang ist das hier eine gute Basis.
00:08:37Auch hierzu findet ihr den Link in der Beschreibung.
00:08:40Vielleicht fragst du dich jetzt: Was ist mit dem Headscale-UI?
00:08:43Macht das den ganzen Prozess einfacher?
00:08:45Ich würde sagen: Jein.
00:08:47Ich zeig's euch mal.
00:08:48Hier ist die URL meines Headscale-UI. Man sieht meine beiden Benutzer, Tess und Tom, sowie einige Infos zu ihnen.
00:08:57Also die Keys und die verbundenen Knoten.
00:09:01Damit das Ganze funktioniert, muss man anfangs einen Headscale-API-Key generieren und hinzufügen.
00:09:06Mein Problem war allerdings die Geräteansicht (Device View).
00:09:09Wie ihr seht, fehlen hier viele Informationen. Es gibt einen TypeScript-Fehler in der Konsole, was eigentlich nicht an mir liegen sollte, da ich den Quellcode nicht angefasst habe.
00:09:22Ab diesem Punkt friert die App oft ein und nichts geht mehr.
00:09:26Eigentlich sollte man hier neue Geräte hinzufügen und Konfigurationen ändern können.
00:09:32Da es aber noch so fehleranfällig ist, fand ich es bisher nicht besonders nützlich.
00:09:35Es gibt noch andere Headscale-UIs, mit denen sich zum Beispiel ACLs leichter verwalten lassen.
00:09:42Meiner Meinung nach braucht man ein Headscale-UI aber bisher nicht unbedingt.
00:09:46Ja, das Setup ist etwas kompliziert.
00:09:49Okay, es ist sogar ziemlich kompliziert.
00:09:51Jemand ohne technischen Hintergrund oder sogar ein Junior-Entwickler könnte bei der Einrichtung allein auf Probleme stoßen.
00:09:57Das ist wohl auch der Grund, warum Tailscale erlaubt, dass ihr Mitarbeiter daran arbeitet – es stellt aktuell keine große Gefahr für das Unternehmen dar.
00:10:07Es bräuchte nur jemanden, der mit Claude Opus ein schickes Interface dafür baut, und schon hätten sie ein echtes Konkurrenzprodukt, das allerdings durch die Lizenz eingeschränkt werden könnte.
00:10:18Aber wenn erst mal alles läuft, funktioniert Headscale fantastisch.
00:10:22Es fehlen zwar noch ein paar Features wie die „Funnel“- und „Serve“-Befehle, um Server öffentlich oder netzwerkintern freizugeben.
00:10:32Auch multiple Tailnets, kurzlebige Knoten (ephemeral nodes) und native Netzwerk-Logs werden noch nicht unterstützt.
00:10:38Für ein Open-Source-Tool ist das aber dennoch sehr beeindruckend.
00:10:42Falls ich irgendwann mal mein OpenClaw komplett offline mit einem lokalen LLM betreiben möchte, wäre das definitiv eine Option.