Tailscale ACL

Das Tailscale-Netzwerk mit ACL und Tags segmentieren: Wie ich meinen VPS-Server von meinen Heimgeräten isoliert habe

Tailscale verwende ich seit Jahren als persönliches VPN: unglaublich praktisch, null Konfiguration, funktioniert überall. Aber ich habe es nie dauerhaft aktiv gelassen — ich schaltete es ein, wenn ich es brauchte, und wieder aus. Eine etwas rohe Vorsichtsmaßnahme, ich weiß, aber es gab einen Grund: Ein VPS-Server, der dem Internet ausgesetzt ist (verwaltet mit Traefik als Reverse Proxy), im selben Netzwerk wie meine Heimgeräte hat mich immer davon überzeugt, nicht alles standardmäßig rund um die Uhr verbunden zu lassen. Irgendwann beschloss ich, die Dinge richtig zu machen, anstatt mich auf manuelle Disziplin zu verlassen.

1. Das Problem: Das Tailscale-Netzwerk ist standardmäßig flach

Tailscale erstellt ein privates Mesh-Netzwerk zwischen allen Ihren Geräten. Standardmäßig kann jeder Knoten jeden anderen Knoten auf jedem Port erreichen. Das ist praktisch, aber es ist ein flaches Netzwerk — genau wie ein Heimnetzwerk, in dem jeder jeden sehen kann.

Meine Konfiguration: ein VPS-Server, der dem Internet ausgesetzt ist (verwaltet mit Traefik als Reverse Proxy), im selben Tailscale-Netzwerk wie mein Desktop-PC, mein Smartphone und meine Raspberry Pis. Das Risiko ist offensichtlich — deshalb ließ ich Tailscale nicht immer aktiv. Aber “ich schalte es aus, wenn ich es nicht brauche” ist keine Richtlinie: Es ist eine Ausrede. Es reicht einmal zu vergessen, um das flache Netzwerk ohne nachzudenken aktiv zu haben.

Die richtige Lösung ist nicht ein- und ausschalten — es ist segmentieren: dafür sorgen, dass der VPS, selbst wenn er kompromittiert wird, nichts auf der anderen Seite des Netzwerks erreichen kann.

2. Die Lösung: Tailscale ACL und Tags

Tailscale ermöglicht die Definition von Zugriffsrichtlinien über eine Konfigurationsdatei im HuJSON-Format (JSON mit Kommentaren), die über die Verwaltungskonsole verwaltet wird. Der Mechanismus basiert auf zwei Konzepten:

  • Tags: Bezeichnungen, die Geräten zugewiesen werden (z.B. tag:server, tag:monitoring). Tags ermöglichen die Gruppierung von Geräten nach Rolle, unabhängig von ihrem Eigentümer.
  • ACL (Access Control List): Regeln, die definieren, wer mit wem kommunizieren kann, auf welchen Ports und Protokollen.

Das System funktioniert als Whitelist: Alles, was nicht explizit erlaubt ist, wird blockiert. Das ist der Schlüsselunterschied zur Standardkonfiguration.

3. Das Netzwerkdesign

GerätTagRolle
Desktop-PCtag:personalArbeitsmaschine / täglicher Gebrauch
Smartphonetag:personalPersönliches Mobilgerät
Raspberry Pi (generisch)tag:homelabInterne Dienste, Experimente
Raspberry Pi (Monitoring)tag:monitoringPrometheus, Grafana, Alerting
VPS-Servertag:serverÖffentliche Dienste, dem Internet ausgesetzt
  • personal-Geräte können alles erreichen (ich bin der Administrator)
  • Der monitoring-Knoten kann alle Knoten scrapen (Port 9100 für node_exporter)
  • Der VPS server kann von personal und monitoring erreicht werden, kann aber keine Verbindungen zu anderen initiieren
  • Das homelab ist isoliert: es kann nicht vom Server erreicht werden

4. Die HuJSON-Konfiguration

Von → Nachpersonalhomelabmonitoringserver
personal
homelab
monitoring✓ (9100)✓ (9100)
server
{
  "tagOwners": {
    "tag:personal":    ["autogroup:admin"],
    "tag:homelab":     ["autogroup:admin"],
    "tag:monitoring":  ["autogroup:admin"],
    "tag:server":      ["autogroup:admin"]
  },
  "acls": [
    { "action": "accept", "src": ["tag:personal"],   "dst": ["*:*"] },
    { "action": "accept", "src": ["tag:monitoring"],  "dst": ["tag:homelab:9100", "tag:server:9100"] },
    { "action": "accept", "src": ["tag:monitoring"],  "dst": ["tag:monitoring:*"] },
    { "action": "accept", "src": ["tag:homelab"],     "dst": ["tag:homelab:*"] }
  ]
}

5. Häufiger Fehler: nicht zugewiesene Tags

Ich schrieb die Richtlinie, speicherte sie in der Tailscale-Konsole und verband mich via SSH mit dem Server. Alles funktionierte. Ich wartete ein paar Minuten, versuchte es erneut — und SSH hing. Das Problem: Ich hatte die Tags in der Richtlinie definiert, aber sie nicht den Geräten zugewiesen. Ein Gerät ohne Tag entspricht keiner ACL-Regel.

# Auf dem VPS-Server
sudo tailscale set --advertise-tags=tag:server

# Auf dem Monitoring-Raspberry-Pi
sudo tailscale set --advertise-tags=tag:monitoring

# Auf dem generischen Raspberry Pi
sudo tailscale set --advertise-tags=tag:homelab

6. Fazit

Die Segmentierung hat eine fragile Verhaltensmaßnahme (“vergiss nicht, es auszuschalten”) in eine strukturelle Garantie verwandelt: Der VPS ist by Design isoliert, nicht durch Disziplin. Ein paar Dutzend Zeilen HuJSON, Tags den Geräten zugewiesen, und die Netzwerktopologie spiegelt endlich wider, was ich wollte.