docs/13-TAILSCALE.md
Rama main · réplica de lectura del repositorio original.
# Server über Tailscale an Nodvard Deck anbinden
> English summary: [en/TAILSCALE.md](en/TAILSCALE.md)
Mit Tailscale verbindest du den Rechner von Nodvard Deck und deine Server über ein verschlüsseltes VPN.
Die Geräte gehören zu deinem Tailscale-Netz, dem „Tailnet“. Du brauchst dafür keine öffentliche IPv4-Adresse
zuhause und normalerweise keine Portfreigabe im Router. Auch hinter DS-Lite oder CGNAT sind Verbindungen möglich;
wenn keine direkte Verbindung zustande kommt, kann Tailscale verschlüsselte Verbindungen über Relays vermitteln.
Siehe [Tailscale zu Verbindungen und Firewall](https://tailscale.com/docs/reference/faq/firewall-ports).
## 1. Tailscale installieren und anmelden
Diese Anleitung geht von Docker auf einem Linux-Rechner aus. Installiere Tailscale auf dem **Rechner, auf dem
Docker und Nodvard Deck laufen**, und auf jedem Server, den du erreichen möchtest. Läuft Docker in einer VM,
ist diese VM gemeint. Eine Proxmox-VM richtest du wie einen normalen Linux-Server ein.
Für unterstützte Linux-Systeme, auch Raspberry Pi OS:
```bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
```
Öffne die angezeigte Anmeldeseite und melde beide Geräte im selben Tailnet an. Das Installationsskript kommt
von Tailscale und wird direkt ausgeführt. Die [Linux-Anleitung von Tailscale](https://tailscale.com/docs/install/linux)
verlinkt auch die Installation über die Paketquellen deiner Distribution.
Auf jedem Gerät kannst du danach mit der [Tailscale-Kommandozeile](https://tailscale.com/docs/reference/tailscale-cli)
nachsehen, ob es angemeldet ist und welche IPv4-Adresse es hat:
```bash
tailscale status
tailscale ip -4
```
Die [Tailscale-IPv4-Adressen](https://tailscale.com/docs/concepts/tailscale-ip-addresses) liegen im Bereich
`100.64.0.0/10`, also zwischen `100.64.0.0` und `100.127.255.255`.
Nimm die tatsächlich angezeigte Adresse deines Servers, nicht irgendeine Adresse, die mit `100` beginnt.
### Proxmox und LXC
Ein unprivilegierter LXC-Container braucht für den normalen Tailscale-Betrieb Zugriff auf `/dev/net/tun`.
Wenn deine Proxmox-Oberfläche die Gerätefreigabe anbietet, öffne beim Container **Ressourcen → Hinzufügen →
Device Passthrough**, trage `/dev/net/tun` als Gerätepfad ein und fahre den Container danach vollständig herunter
und starte ihn wieder. Installiere Tailscale anschließend im LXC-Container.
Für ältere Proxmox-Versionen beschreibt die [LXC-Anleitung von Tailscale](https://tailscale.com/docs/features/containers/lxc/lxc-unprivileged)
die passende Konfiguration. Die Freigabe betrifft den LXC-Container, in dem Tailscale läuft.
## 2. Verbindung aus dem Deck-Container prüfen
Die mitgelieferten Dateien [compose.standalone.yml](../deploy/compose.standalone.yml),
[compose.standalone-mit-helfer.yml](../deploy/compose.standalone-mit-helfer.yml) und
[docker-compose.yml](../deploy/docker-compose.yml) verwenden für Nodvard Deck das normale Docker-Bridge-Netz.
Deck teilt sich also nicht das Host-Netz und bringt in diesen Dateien keinen eigenen Tailscale-Dienst mit.
`network_mode: none` in der Variante mit Helfer betrifft nur den Update-Helfer.
Docker ermöglicht ausgehende Verbindungen aus dem Bridge-Netz über den Host. Damit Deck darüber einen
Tailscale-Server erreicht, müssen die Route und die Firewall auf dem Host diese Verbindung zulassen.
Dass Tailscale auf dem Host läuft, bestätigt allein noch nicht die Erreichbarkeit aus dem Container.
Siehe [Docker zu Bridge-Netzen](https://docs.docker.com/engine/network/drivers/bridge/).
Prüfe deshalb direkt aus dem laufenden Deck-Container, ob der SSH-Port des Servers erreichbar ist.
Führe den Befehl im Ordner deiner Compose-Datei aus. Ersetze `100.100.10.20` durch die Tailscale-Adresse
des Servers und `22` durch dessen SSH-Port, falls er abweicht:
```bash
docker compose exec -T nodvard-deck python -c "import socket; socket.create_connection(('100.100.10.20', 22), timeout=5).close(); print('SSH-Port erreichbar')"
```
Bei Erfolg erscheint „SSH-Port erreichbar“. Das prüft die Netzwerkverbindung, die SSH-Anmeldung kommt im nächsten
Schritt. Bei einem Fehler prüfe zuerst mit `tailscale status` auf dem Host, ob beide Geräte angemeldet sind.
Prüfe danach die Tailscale-Zugriffsregeln, den SSH-Dienst auf dem Zielserver sowie Routing und Firewall des Hosts.
Ein erfolgreicher Test auf dem Host ersetzt den Test aus dem Container nicht.
## 3. Server in Deck anlegen
1. Öffne **Einstellungen → Server & Zugänge** und drücke **Server hinzufügen**.
2. Trage als **Adresse** die Tailscale-IP des Servers ein, zum Beispiel `100.100.10.20`.
3. Richte den SSH-Zugang mit Benutzer, Port und SSH-Schlüssel wie gewohnt ein. Auf dem Server muss der passende
öffentliche Schlüssel für diesen Benutzer hinterlegt sein.
4. Drücke **Verbindung prüfen**. Vergleiche bei einem neuen Server den angezeigten Fingerabdruck mit dem
Server-Schlüssel, bevor du ihn bestätigst.
Die einzelnen Schritte für Schlüssel und Einrichtungsbefehl stehen in der
[Erst-Einrichtung, Abschnitt 5](11-ERST-EINRICHTUNG.md#5-server-und-ssh-zugang).
Tailscale stellt hier den Netzwerkweg bereit. Deck braucht weiterhin seinen normalen SSH-Zugang.
Du kannst auch einen [MagicDNS-Namen](https://tailscale.com/docs/features/magicdns) als Adresse verwenden,
wenn er **im Deck-Container** aufgelöst werden kann. Verwende dafür den vollständigen Namen aus der
Tailscale-Verwaltung. Dass der Name auf dem Host funktioniert, reicht nicht als Prüfung für den Container.
Funktioniert die IP-Adresse, der Name aber nicht, verwende zunächst die IP-Adresse und prüfe die
DNS-Einstellungen des Containers.
## 4. Zugriff und Anmeldung
- Beschränke in der Tailscale-Verwaltung den Zugriff vom Deck-Rechner auf die benötigten Server und Ports.
Tailscale beschreibt das unter [Zugriffskontrolle](https://tailscale.com/docs/features/access-control).
- Für die Verbindung zu deinen Servern brauchst du keine Exit Node. Ein
[Subnet Router](https://tailscale.com/docs/features/subnet-routers) ist eine Alternative, wenn du nicht auf jedem
Zielgerät Tailscale installieren möchtest. Dafür müssen Routen und Zugriffsregeln eingerichtet sein; in Deck
verwendest du dann die erreichbare Adresse des Zielgeräts in dessen Netz.
- Läuft ein Server dauerhaft, beachte den Ablauf seines Tailscale-Geräteschlüssels. Die
[Tailscale-Anleitung für Server](https://tailscale.com/docs/how-to/set-up-servers) erklärt die Möglichkeiten dafür.
Wenn du auch **Deck selbst über Tailscale aufrufst**, behandelt Deck erkannte Client-Adressen aus `100.64.0.0/10`
bei der Anmeldung als intern. Für diese Adressen gilt die zusätzliche, wachsende Wartezeit wegen des
Durchprobierens eines Benutzernamens nicht. Die Grenzen je Adresse und die Grenzen für falsche Zwei-Faktor-Codes
gelten weiterhin. Entscheidend ist die Adresse, die Deck tatsächlich sieht; Docker oder ein Proxy können sie ändern.
Belegt ist das in [den Anmelderegeln](../backend/src/nodvard_deck/core/login_limit.py).
Eine Tailscale-Adresse gilt dadurch **nicht automatisch als vertrauenswürdiger Proxy**. Nur wenn du tatsächlich
einen Reverse-Proxy benutzt, trägst du dessen von Deck gesehene Adresse unter **Einstellungen → System →
Vertrauenswürdiger Proxy** ein. Trag nicht das ganze Tailscale-Netz ein: Jedes eingetragene Gerät dürfte sonst
Absenderadressen vorgeben. Die Anleitung [Reverse-Proxy](12-REVERSE-PROXY.md) erklärt die Einrichtung.
Deck lässt den Bereich `100.64.0.0/10` bei der Prüfung von Proxy-Einträgen als internen Bereich zu. Auch der Hinweis
auf einen noch nicht eingetragenen Proxy kann bei einer solchen Adresse erscheinen. Das ist keine automatische
Freigabe. Belegt ist das in [der Prüfung der Proxy-Einträge](../backend/src/nodvard_deck/core/trusted_proxies.py)
und [dem Proxy-Hinweis](../backend/src/nodvard_deck/core/untrusted_proxies.py).
## 5. Wenn etwas nicht klappt
| Was du siehst | Was du prüfen kannst |
|---|---|
| Der Host erreicht den Server, der Test aus dem Deck-Container scheitert | Weiterleitung vom Docker-Netz zum Tailscale-Netz, Routen und Firewall des Hosts |
| Der SSH-Port ist nicht erreichbar | Tailscale-Anmeldung beider Geräte, Zugriffsregeln, SSH-Port und Firewall des Zielservers |
| Die IP-Adresse funktioniert, der MagicDNS-Name nicht | MagicDNS und Namensauflösung im Deck-Container; zunächst die IP-Adresse verwenden |
| Der Port ist erreichbar, „Verbindung prüfen“ scheitert | SSH-Benutzer, Schlüssel, Port und Bestätigung des Server-Schlüssels in Deck |
| Eine bisher funktionierende Verbindung fällt aus | `tailscale status`, Anmeldung und Ablauf des Geräteschlüssels prüfen |
Eine pauschale Freigabe von UDP-Port 41641 ist nicht nötig. Wenn direkte Verbindungen nicht möglich sind, kann
Tailscale Relays verwenden. Bei stark eingeschränkten Netzen hilft die
[Firewall-Anleitung von Tailscale](https://tailscale.com/docs/reference/faq/firewall-ports).