Blog

Mit Moonlight und Tailscale überall auf Ihrem Cloud-Server spielen

Kein IPv6 zu Hause, kein Port zu öffnen: Wir haben Moonlight über ein Tailscale-Netzwerk (getestet mit Headscale) mit einem Sunshine-Cloud-Server verbunden: direkte Verbindung, 1080p 60 fps, 0 verlorene Bilder und dieselben 7,3 bis 7,8 ms Serververarbeitung wie ohne Tailscale.

Mit Moonlight und Tailscale überall auf Ihrem Cloud-Server spielen

Unsere Server sind standardmäßig per IPv6 erreichbar. Viele Internetanschlüsse zu Hause haben IPv6, aber nicht alle: Manche Mobilfunknetze, Hotel-WLANs und ältere Router haben nur IPv4. Sie können Ihrem Server eine dedizierte IPv4 hinzufügen (5 € pro Monat), aber es gibt noch einen anderen Weg, der außerdem die Ports von Sunshine zum Internet hin geschlossen hält: Tailscale. Es baut ein privates, verschlüsseltes Netzwerk (ein „Tailnet“) zwischen Ihren Geräten auf, auf Basis von WireGuard. Ihr Server und Ihr Smartphone bekommen jeweils eine Adresse in 100.x.y.z, und Moonlight verbindet sich mit dieser Adresse, als wären beide bei Ihnen zu Hause.

Ein Spiel, von Sunshine über die Tailnet-Adresse zu Moonlight gestreamt (5 Sekunden, Moonlight-Leistungsanzeige oben links).

Die Ergebnisse im Überblick

  • Es funktioniert mit dem offiziellen Tailscale-Client auf beiden Seiten: direkte Verbindung zwischen den beiden Maschinen (tailscale ping: pong via 203.0.113.10:41641 in 1ms), Moonlight auf 100.x.y.1.
  • Tailscale kostet im Stream nichts Messbares: Abwechselnde Durchläufe mit und ohne Tailscale ergaben dieselben 1080p 60 fps, 7,3 bis 7,8 ms Serververarbeitung auf beiden Wegen, 0 verlorene Bilder.
  • Sunshine ist zum Internet hin geschlossen: Seine Ports nehmen nur Verbindungen an, die über das Tailnet kommen. Nur der Tunnel wird genutzt; an Ihrem Router muss nichts geöffnet werden.
  • Geringe CPU-Last: Der Tailscale-Dienst belegte auf dem Server 3 bis 4 % eines Kerns, während ein 1080p-Stream mit 15 Mbit/s lief.

Zwei Wege zu einem Tailnet

Tailscale-KontoHeadscale
Was es istDer Dienst von Tailscale verwaltet Ihr Netzwerk (kostenloser Personal-Tarif)Open-Source-Steuerungsserver, den Sie selbst betreiben
Client-Softwareoffizielle Tailscale-Appsdieselben offiziellen Tailscale-Apps
Einrichtungauf jedem Gerät anmeldenHeadscale installieren, Schlüssel erzeugen, jedes Gerät darauf ausrichten
Erreichbarkeitimmer erreichbarHeadscale muss für alle Ihre Geräte erreichbar sein

Der normale Weg ist ein Tailscale-Konto: Tailscale auf dem Server und Ihren Geräten installieren, mit demselben Konto anmelden, fertig. In unserem Test haben wir stattdessen Headscale verwendet, weil wir für einen Test kein Konto anlegen wollten: Es ist ein Open-Source-Server, der dieselbe Rolle spielt wie der Koordinationsdienst von Tailscale. Das Netzwerk selbst ist dasselbe: Auf beiden Maschinen lief der offizielle Tailscale-Client (Version 1.104.5), der dieselben WireGuard-Tunnel aufbaut, egal mit welchem Steuerungsserver er spricht.

Testaufbau

ElementWert
ServerDebian 13, Intel UHD 770 (geteilte GPU), 4 vCPU, Sunshine 2026.914, RetroArch, sway ohne Bildschirm
ClientDebian 13, Moonlight 6.2, H.264 1080p 60 fps, Hardware-Dekodierung
TailnetTailscale 1.104.5 auf beiden, Headscale 0.29.7 auf dem Server (offizielles .deb von GitHub)
NetzwerkClient und Server im selben Rechenzentrum: Über das Internet kommt die Latenz Ihrer Verbindung hinzu

1. Tailscale auf dem Server installieren

Tailscale veröffentlicht Pakete für Debian 13:

curl -fsSL https://pkgs.tailscale.com/stable/debian/trixie.noarmor.gpg \
  -o /usr/share/keyrings/tailscale-archive-keyring.gpg
curl -fsSL https://pkgs.tailscale.com/stable/debian/trixie.tailscale-keyring.list \
  -o /etc/apt/sources.list.d/tailscale.list
apt update && apt install tailscale

Mit einem Tailscale-Konto führen Sie tailscale up aus und öffnen den angezeigten Link, um sich anzumelden. Installieren Sie dann die Tailscale-App auf Ihrem Computer, Smartphone oder TV-Gerät und melden Sie sich mit demselben Konto an.

Mit Headscale (was wir getestet haben) installieren Sie den Server aus seinem offiziellen GitHub-Release, setzen server_url in /etc/headscale/config.yaml und legen dann einen Benutzer und einen Schlüssel an:

headscale users create gamer
headscale preauthkeys create --user 1 --reusable --expiration 2h
tailscale up --login-server https://headscale.example.com --authkey <key> --hostname retro-server

Der Client tritt mit demselben Befehl tailscale up --login-server … --authkey … bei. In unserem Test lauschte Headscale auf der privaten Adresse des Servers, weil beide Maschinen im selben Rechenzentrum standen. Im echten Einsatz muss Headscale für alle Ihre Geräte erreichbar sein, über HTTPS: Betreiben Sie es auf einer Maschine mit öffentlicher IPv4 (zum Beispiel mit der Option dedizierte IPv4), sonst kann ein Gerät ohne IPv6 es nicht erreichen. Das ist der Hauptgrund, warum ein Tailscale-Konto einfacher ist.

2. Die Verbindung prüfen

$ tailscale status
100.x.y.2  retro-client  gamer  linux  -
100.x.y.1  retro-server  gamer  linux  active; direct 203.0.113.10:41641, tx 750808 rx 128908072

$ tailscale ping 100.x.y.1
pong from retro-server (100.x.y.1) via 203.0.113.10:41641 in 1ms

direct bedeutet, dass die beiden Maschinen ohne Relay miteinander sprechen. Über das Internet versucht Tailscale ebenfalls, Ihre Geräte direkt durch den Router bei Ihnen zu Hause zu verbinden (der Server hat dafür ausgehendes IPv4). Gelingt das nicht, läuft der Verkehr über ein Tailscale-Relay („DERP“): Es funktioniert trotzdem, bringt aber zusätzliche Latenz. tailscale status zeigt Ihnen, welchen der beiden Wege Sie bekommen haben.

Ein gewöhnlicher Ping durch den Tunnel dauerte im Mittel 1,7 ms (bestenfalls 0,8 ms) gegenüber 0,36 ms ohne Tailscale: Die WireGuard-Verschlüsselung fügt deutlich weniger als eine Millisekunde hinzu, was neben der Latenz einer Internetverbindung nicht ins Gewicht fällt.

Balkendiagramm: Ping-Umlaufzeit ohne Tailscale (0,36 ms) und über Tailscale (im Mittel 1,73 ms)
Ping zwischen den beiden Maschinen: 0,36 ms direkt, im Mittel 1,73 ms durch den Tunnel (bestenfalls 0,79 ms, eine Spitze bei 8,8 ms).

3. Sunshine zum Internet hin geschlossen halten

Der Sinn des Tailnets ist, dass Sunshine nicht aus dem Internet erreichbar sein muss. Auf dem Server verwirft eine kleine nftables-Tabelle die Ports von Sunshine außer auf der Schnittstelle tailscale0:

nft -f - <<'EOF'
table inet sunshine_tailnet_only {
  chain input {
    type filter hook input priority 0; policy accept;
    iifname "tailscale0" accept
    iifname "lo" accept
    tcp dport { 47984, 47989, 47990, 48010 } drop
    udp dport 47998-48010 drop
  }
}
EOF

Wir haben es vom Client aus geprüft: Der Sunshine-Port 47989 antwortete nicht mehr auf der normalen Adresse des Servers, wohl aber (HTTP 200) auf 100.x.y.1. Um Moonlight zu koppeln, öffnen Sie die Weboberfläche von Sunshine über einen SSH-Tunnel (ssh -L 47990:localhost:47990 you@100.x.y.1).

4. Spielen: Moonlight auf der 100.x-Adresse

Fügen Sie in Moonlight den Server über seine Tailnet-Adresse hinzu (hier 100.x.y.1), koppeln Sie ihn und starten Sie ein Spiel. Moonlight erkannte den bereits bekannten Server und verband sich ohne weitere Einstellung. Die Tailnet-Schnittstelle hat eine kleinere Paketgröße (MTU 1.280 Byte); dafür mussten wir in Moonlight nichts ändern.

Um zu sehen, ob Tailscale etwas verändert, haben wir dasselbe Spiel viermal gestreamt, abwechselnd über die normale Adresse des Servers und über seine Tailnet-Adresse:

Moonlight, 1080p 60 fps H.264Ohne TailscaleÜber Tailscale
Empfangene Bildrate60,0 bis 60,4 fps60,0 fps
Verarbeitung auf dem Server (Erfassung + Kodierung), Mittel7,5 bis 7,8 ms7,3 bis 7,4 ms
Verarbeitung auf dem Server, max10,4 bis 10,6 ms10,5 bis 10,8 ms
Durch Netzwerk oder Jitter verlorene Bilder0 %0 %
Dekodierzeit auf dem Client0,23 ms0,24 bis 0,25 ms
Balkendiagramm: Serververarbeitung pro Bild in vier abwechselnden Läufen, direkt und über Tailscale
Vier Streams desselben Spiels, abwechselnd über die direkte Adresse und die Tailscale-Adresse: im Mittel 7,3 bis 7,8 ms auf beiden Wegen.
Moonlight streamt ein Spiel vom Cloud-Server über die Tailscale-Adresse, mit seiner Leistungsstatistik
Über das Tailnet: 60 fps, im Mittel 7,3 ms Serververarbeitung, kein verlorenes Bild.

Auf dem Server belegte während des Streams der Tailscale-Dienst 2,8 bis 4,2 % eines Kerns, Sunshine 13 bis 17 % und der Emulator 3 bis 4 %. In zwei früheren Durchläufen, während andere Testserver dieselbe GPU auslasteten, stieg die Serververarbeitung im Mittel auf 21 bis 27 ms: Das lag an der in diesem Moment geteilten GPU, nicht an Tailscale, wie die abwechselnden Durchläufe oben zeigen.

Balkendiagramm: Server-CPU beim Streaming über Tailscale für Sunshine, tailscaled und RetroArch, in Prozent eines Kerns
Server-CPU bei einem 1080p-Stream durch den Tunnel, in Prozent eines Kerns: der Tailscale-Dienst kostet weniger als der Emulator.

5. Welches Angebot?

Tailscale selbst braucht fast nichts. Entscheidend ist das Spiel: iGPU Start (2 vCPU, 8 GB RAM, 14,99 € netto pro Monat) reicht für Retro-Konsolen; für PC-Spiele empfehlen wir iGPU Power (4 vCPU, 14 GB RAM, doppelter GPU-Anteil von Start, 29,99 € netto pro Monat).

Lieber sofort losspielen? Fragen Sie bei der Bestellung per E-Mail danach (contact@linuxgpu.eu): Wir können Ihnen den Server mit Sunshine, dem Launcher Ihrer Spiele und Tailscale vorinstalliert liefern (serverseitig). Sie installieren Moonlight und die Tailscale-App auf Ihren eigenen Geräten.

Was Sie darauf spielen können: Retro-Gaming mit RetroArch, Sunshine und Moonlight, Windows 11 in der Cloud mit Sunshine und Moonlight und Windows-Spiele unter Linux mit Wine.

Systeme, die ab Werk spielbereit sind. Die Systeme, die wir standardmäßig installieren, sind bereits dafür eingerichtet: Debian 13 mit aktuellem Kernel (7.3), den Intel-GPU-Treibern und Mesa (OpenGL, Vulkan, VA-API-Videokodierung) sowie Windows 11 (Option) mit dem Intel-Grafiktreiber und GPU-beschleunigtem Remotedesktop. Keine Treibersuche: Spiel und Sunshine installieren und loslegen.

Ausprobieren

Zu den Angeboten: Die Option dedizierte IPv4 kostet 5 € pro Monat, aber mit Tailscale brauchen Sie sie zum Spielen nicht.