Headscale Logo vor Mesh-Netzwerk
Abstract technology background with connecting dots and lines. Network concept.
Bildquelle: Lishchyshyn, Lizenz

Headscale für Anfänger: VPN einrichten leicht gemacht

Ein VPN einzurichten kann wie eine schwere Aufgabe wirken, doch ist es inzwischen ein leichtes ein eigenes Netz zu betreiben.

Was braucht man, um im Internet anonym zu sein? Viele Anbieter sind sich sicher: Man braucht ein VPN. Alle sagen, dass sie nicht loggen und alle wissen, dass die Anderen schlechter sind. Heute lernt ihr, wie ihr einfach selbst ein VPN aufsetzt und dabei nicht einmal auf die vielen Vorzüge, die die Technologie bringt, verzichten müsst.

Headscale – Tailscale, aber selfhosted

Das Netzwerk, das wir aufsetzen, läuft auf Basis von Headscale, einer Open-Source Reimplementierung von Tailscale. Gebt den Erstellern gerne einen Stern auf GitHub oder einen Kaffee aus.

Headscale verbindet eure Geräte (wenn möglich) über Wireguard direkt miteinander, kann Verbindungen allerdings auch über Relays herstellen. Das Setup wird hier allerdings möglichst kompakt gehalten und viele der fortgeschrittenen Features nicht behandelt. Sollte daran Interesse bestehen, könnt ihr uns das im Forum gerne wissen lassen.

Die Packliste:

  • ein Linux Server (ein kleiner VPS, oder ein Raspberry Pi reicht)
  • eine Domain (optional, aber sehr hilfreich)
  • etwas Zeit

Dieses Tutorial dient als Hilfestellung und ersetzt in keinster Weise die offizielle Dokumentation. Sollten Fragen auftreten, sollte immer zuerst die Dokumentation zurate gezogen werden!

Server einrichten

Um den Fokus nicht zu verlieren, nehme ich an, dass ihr schon einen Server mit den Basics (Firewall und SSH) aufgesetzt habt. Sollte dem nicht so sein, ist jetzt ein hervorragender Zeitpunkt das nachzuholen. Keine Sorge, das Tutorial läuft nicht weg.

Vorbereitung

Sollten Docker und Docker Compose noch nicht installiert sein, kann man das nun ebenfalls nachholen. Eine offizielle Anleitung für die Distribution eurer Wahl findet ihr auf der Website von Docker.

Haben wir jetzt einen Server mit Docker, so können wir nun damit beginnen die eigentlichen Dienste einzurichten. In diesem Tutorial beginnen wir damit, das wir einen Ordner unter /srv erstellen, in dem unsere Dateien liegen. Im Folgenden werden Befehle mit dem Präfix $ versehen, wenn sie als normaler User auszuführen sind, und mit #, wenn sie als root ausgeführt werden müssen.

Die besitzende Gruppe dieses Ordners ändern wir anschließend zu docker, welcher euer eingeloggter Nutzer auch angehören sollte, und erlauben Mitgliedern dieser Gruppe Schreibzugriff auf das Verzeichnis.

# mkdir -p /srv/headscale
# chown :docker /srv/headscale
# chmod g+w /srv/headscale

Software Stack aufbauen

Beginnen wir damit, dass wir in das soeben erstellte Verzeichnis wechseln und ein paar Unterordner, die wir brauchen, erstellen:

$ cd /srv/headscale
$ mkdir -p headscale/config headscale/data caddy/config caddy/data

Nun erstellen wir eine Datei namens docker-compose.yml, die unseren Software-Stack beschreibt. Als Webserver nutzen wir hier Caddy, da dieser besonders wartungsarm ist und keine großen Abhängigkeiten mitbringt.

version: '3.5'

services:
  headscale:
    image: headscale/headscale:latest
    command: headscale serve
    restart: unless-stopped
    volumes:
      - ./headscale/config:/etc/headscale
      - ./headscale/data:/var/lib/headscale
  headscale-ui:
    image: ghcr.io/gurucomputing/headscale-ui:latest
    restart: unless-stopped
  caddy:
    image: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./caddy/config:/config
      - ./caddy/data:/data
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile

Den Aufmerksamen ist jetzt sicherlich schon aufgefallen, dass es die Datei caddy/Caddyfile noch nicht gibt. Das ändern wir jetzt, indem wir sie mit folgendem Inhalt erstellen:

vpn.meine-domain.de {
    reverse_proxy /web* http://headscale-ui:80
    reverse_proxy * http://headscale:8080
}

Die Domain vpn.meine-domain.de sollte natürlich durch die eigene Domain ersetzt werden, welche zu diesem Zeitpunkt schon auf den Server zeigen sollte.

VPN aufsetzen

Bevor wir unser VPN anwerfen, sollten wir es noch konfigurieren. Wir können uns einen großen Teil der Arbeit sparen, indem wir einfach die Standard-Konfiguration übernehmen:

$ curl -o headscale/config/config.yml https://github.com/juanfont/headscale/raw/main/config-example.yaml

Hier müssen wir nur noch einige wenige Details anpassen, um ein simples VPN hinzubekommen (ersetzt die Zeile mit dem Minus davor, durch die mit dem Plus davor):

- server_url: http://127.0.0.1:8080
+ server_url: https://vpn.meine-domain.de

- listen_addr: 127.0.0.1:8080
+ listen_addr: 0.0.0.0:8080

-   base_domain: example.com
+   base_domain: vpn.meine-domain.de

Und damit wären wir auch schon startklar. Starte den Stack mit dem Befehl

$ docker compose up -d

Zugriff auf das Webinterface

Um das Webinterface nutzen zu können, brauchen wir einen API-Key. Diesen können wir uns einfach erstellen, indem wir den folgenden Befehl ausführen:

$ docker compose exec headscale headscale apikeys create

Der Key, der uns ausgegeben wird, können wir im Interface unter Settings > Headscale API Key eintragen. Am besten direkt noch mal mit „Test Server Settings“ sicherstellen, dass der Key gültig ist. Die Headscale URL sollte nicht angepasst werden müssen.

Sollte der Browser zu Beginn einige Fehlermeldungen anzeigen, so ist das normal. Das passiert, während der Server sich einen SSL-Schlüssel generiert und sollte nur wenige Sekunden dauern.

Geräte hinzufügen

Jedes Gerät muss einem Nutzer zugeordnet werden, erstellt also zuerst einen Nutzer!

Auf jedem Client muss der Open-Source Client von Tailscale installiert werden. Wie das für euer Betriebssystem funktioniert, erfahrt ihr auf der Website des Unternehmens.

Um ein Gerät hinzuzufügen, muss vor dem Start der Loginserver auf den eingerichteten Server umgestellt werden. Wie das gemacht wird, kann in der Dokumentation für diese Betriebssysteme gefunden werden:

  • Windows
  • Android
  • iOS
  • macOS (besuche https://vpn.meine-domain.de/apple)
  • Linux/BSD (mithilfe des --login-server Parameters)

Das Gerät leitet euch dann zu einer URL nach dem Muster

https://vpn.meine-domain.de/register/nodekey:[hexadezimal]

Der letzte Teil (nodekey:…) ist der für euch relevante. Kopiert ihn und fügt ihn unter Device > New Device > Device Key ein und wählt den Besitzer aus. Das Gerät ist damit registriert.

Alternativ könnt ihr das Gerät auch Registrieren, indem ihr folgenden Befehl ausführt:

$ docker compose exec headscale headscale -u NUTZERNAME nodes register --key nodekey:…

Nutzername und nodekey müsst ihr natürlich ersetzen.

Auch der Server auf dem Headscale läuft muss manuell als Client registriert werden, wenn er Teil des Netzwerkes sein soll!

Das klassische „VPN“: IP verschleiern

Jetzt haben wir ein VPN, aber was die meisten wollen, ist kein VPN, sondern ein Proxy in Gestalt eines VPNs. Um dieses zu bekommen, müssen wir einen der Clients als „Exit Node“ designieren. Das machen wir indem wir unter Linux dem Tailscale Client ein --advertise-exit-node mitgeben.

Da ihr vermutlich aber das Gerät schon verbunden habt, könnt ihr das nachträglich aktivieren, indem ihr diesen Befehl ausführt:

# tailscale set --advertise-exit-node

Wir müssen jetzt dem Betriebssystem noch Bescheid geben, dass wir wirklich Traffic weiterleiten wollen.

# echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-vpn.conf
# echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.d/99-vpn.conf
# sysctl -p /etc/sysctl.d/99-vpn.conf

Jetzt müssen wir noch im Controlserver die angebotenen Routen freigeben. Das geht am besten im Webinterface, wo einfach neben den „Device Routes“ der „Pending“ Status angeklickt werden muss. Daraufhin können die anderen Clients diesen einfach als Exit Node auswählen und damit nutzen.

Screenshot vom Headscale Webinterface

Schlusswort

Habt ihr alles richtig gemacht, seid ihr jetzt euer eigener VPN-Anbieter. Und das zu einem Bruchteil der Kosten. (bis zu 10€/Monat für ein kommerzielles VPN vs. 3,25€ für einen kleinen VPS)

Natürlich habt ihr so keine 170 Serverstandorte mehr, dafür aber umso mehr extra Features. Deren Erklärung würde den Rahmen aber nur noch weiter sprengen. Aus diesem Grunde: Viel Spaß mit eurem VPN!

(*) Alle mit einem Stern gekennzeichneten Links sind Affiliate-Links. Wenn Du über diese Links Produkte oder Abonnements kaufst, erhält Tarnkappe.info eine kleine Provision. Dir entstehen keine zusätzlichen Kosten. Wenn Du die Redaktion anderweitig finanziell unterstützen möchtest, schau doch mal auf unserer Spendenseite oder in unserem Online-Shop vorbei.

Über

Moritz ist von ganzem Herzen Open-Source Programmierer. Neben regelmäßigen Commits für diverse Open-Source-Projekte verfasst er gelegentlich auch Texte für die Tarnkappe. Er findet es echt seltsam über sich in der dritten Person zu schreiben und merkt an, dass seine DMs für alles außer Marketing-Nachrichten offen stehen. Erreichbar ist er auf Matrix (@moritz:poldrack.dev), IRC (mpldr auf libera.chat) und Email (~mpldr/public-inbox@lists.sr.ht).