Blog

Jouer sur votre serveur cloud de n'importe où avec Moonlight et Tailscale

Pas d'IPv6 chez vous, aucun port à ouvrir : nous avons connecté Moonlight à un serveur cloud Sunshine via un réseau Tailscale (testé avec Headscale) : connexion directe, 1080p 60 fps, 0 image perdue, et les mêmes 7,3 à 7,8 ms de traitement côté serveur que sans Tailscale.

Jouer sur votre serveur cloud de n’importe où avec Moonlight et Tailscale

Nos serveurs sont joignables en IPv6 par défaut. Beaucoup de connexions domestiques ont l’IPv6, mais pas toutes : certains réseaux mobiles, le Wi-Fi des hôtels et les box anciennes n’ont que l’IPv4. Vous pouvez ajouter une IPv4 dédiée à votre serveur (5 € par mois), mais il existe une autre solution, qui garde en plus les ports de Sunshine fermés à Internet : Tailscale. Il crée un réseau privé et chiffré (un « tailnet ») entre vos appareils, basé sur WireGuard. Votre serveur et votre téléphone reçoivent chacun une adresse en 100.x.y.z, et Moonlight se connecte à cette adresse comme si les deux étaient chez vous.

Un jeu streamé par Sunshine vers Moonlight via l'adresse du tailnet (5 secondes, statistiques de performance de Moonlight en haut à gauche).

Les résultats en bref

  • Ça fonctionne avec le client Tailscale officiel des deux côtés : connexion directe entre les deux machines (tailscale ping : pong via 203.0.113.10:41641 in 1ms), Moonlight sur 100.x.y.1.
  • Tailscale ne coûte rien de mesurable dans le stream : des essais alternés avec et sans Tailscale ont donné le même 1080p 60 fps, 7,3 à 7,8 ms de traitement côté serveur sur les deux chemins, 0 image perdue.
  • Sunshine est fermé à Internet : ses ports n’acceptent que les connexions arrivant par le tailnet. Seul le tunnel est utilisé ; rien à ouvrir sur votre box.
  • Faible coût CPU : le service Tailscale utilisait 3 à 4 % d’un cœur sur le serveur pendant un stream 1080p à 15 Mbit/s.

Deux façons d’avoir un tailnet

Compte TailscaleHeadscale
Ce que c’estLe service de Tailscale gère votre réseau (offre Personal gratuite)Serveur de contrôle open source que vous hébergez vous-même
Logiciel clientapplications Tailscale officiellesles mêmes applications Tailscale officielles
Mise en placese connecter sur chaque appareilinstaller Headscale, créer des clés, y rattacher chaque appareil
Accessibilitétoujours joignableHeadscale doit être joignable par tous vos appareils

La voie normale est un compte Tailscale : installez Tailscale sur le serveur et sur vos appareils, connectez-vous avec le même compte, c’est fini. Pour notre test, nous avons utilisé Headscale à la place, car nous ne voulions pas créer de compte pour un test : c’est un serveur open source qui joue le même rôle que le service de coordination de Tailscale. Le réseau lui-même est le même : les deux machines utilisaient le client Tailscale officiel (version 1.104.5), qui construit les mêmes tunnels WireGuard quel que soit le serveur de contrôle auquel il parle.

Configuration du test

ÉlémentValeur
ServeurDebian 13, Intel UHD 770 (GPU partagé), 4 vCPU, Sunshine 2026.914, RetroArch, sway sans écran
ClientDebian 13, Moonlight 6.2, H.264 1080p 60 fps, décodage matériel
TailnetTailscale 1.104.5 des deux côtés, Headscale 0.29.7 sur le serveur (.deb officiel depuis GitHub)
Réseauclient et serveur dans le même datacenter : sur Internet, ajoutez la latence de votre connexion

1. Installer Tailscale sur le serveur

Tailscale publie des paquets pour 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

Avec un compte Tailscale, lancez tailscale up et ouvrez le lien qu’il affiche pour vous connecter. Installez ensuite l’application Tailscale sur votre ordinateur, téléphone ou box TV et connectez-vous avec le même compte.

Avec Headscale (ce que nous avons testé), installez le serveur depuis sa release GitHub officielle, réglez server_url dans /etc/headscale/config.yaml, puis créez un utilisateur et une clé :

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

Le client rejoint le réseau avec la même commande tailscale up --login-server … --authkey …. Dans notre test, Headscale écoutait sur l’adresse privée du serveur, car les deux machines étaient dans le même datacenter. En usage réel, Headscale doit être joignable par tous vos appareils, en HTTPS : hébergez-le sur une machine avec une IPv4 publique (par exemple avec l’option IPv4 dédiée), sinon un appareil sans IPv6 ne peut pas l’atteindre. C’est la principale raison pour laquelle un compte Tailscale est plus simple.

2. Vérifier la connexion

$ 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 signifie que les deux machines se parlent sans relais. Sur Internet, Tailscale essaie aussi de connecter vos appareils directement à travers le routeur de votre domicile (le serveur a une IPv4 sortante pour cela). Quand il n’y arrive pas, le trafic passe par un relais Tailscale (« DERP ») : ça fonctionne toujours, mais ajoute de la latence. tailscale status vous indique lequel des deux vous avez obtenu.

Un ping ordinaire à travers le tunnel prenait 1,7 ms en moyenne (0,8 ms au mieux) contre 0,36 ms sans Tailscale : le chiffrement WireGuard ajoute bien moins d’une milliseconde, ce qui est invisible à côté de la latence d’une connexion Internet.

Graphique en barres : aller-retour du ping sans Tailscale (0,36 ms) et via Tailscale (1,73 ms en moyenne)
Ping entre les deux machines : 0,36 ms en direct, 1,73 ms en moyenne dans le tunnel (0,79 ms au mieux, un pic à 8,8 ms).

3. Garder Sunshine fermé à Internet

L’intérêt du tailnet est que Sunshine n’a pas besoin d’être joignable depuis Internet. Sur le serveur, une petite table nftables bloque les ports de Sunshine sauf sur l’interface 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

Nous l’avons vérifié depuis le client : le port 47989 de Sunshine ne répondait plus sur l’adresse normale du serveur, et répondait (HTTP 200) sur 100.x.y.1. Pour appairer Moonlight, ouvrez l’interface web de Sunshine par un tunnel SSH (ssh -L 47990:localhost:47990 you@100.x.y.1).

4. Jouer : Moonlight sur l’adresse en 100.x

Dans Moonlight, ajoutez le serveur par son adresse dans le tailnet (ici 100.x.y.1), appairez-le et lancez un jeu. Moonlight a reconnu le serveur qu’il connaissait déjà et s’est connecté sans aucun autre réglage. L’interface du tailnet a une taille de paquet plus petite (MTU de 1 280 octets) ; nous n’avons rien eu à changer dans Moonlight pour cela.

Pour voir si Tailscale change quelque chose, nous avons streamé le même jeu quatre fois, en alternant l’adresse normale du serveur et son adresse dans le tailnet :

Moonlight, 1080p 60 fps H.264Sans TailscaleVia Tailscale
Fréquence d’images reçue60,0 à 60,4 fps60,0 fps
Traitement côté serveur (capture + encodage), moyenne7,5 à 7,8 ms7,3 à 7,4 ms
Traitement côté serveur, max10,4 à 10,6 ms10,5 à 10,8 ms
Images perdues par le réseau ou la gigue0 %0 %
Temps de décodage sur le client0,23 ms0,24 à 0,25 ms
Graphique en barres : traitement côté serveur par image sur quatre essais alternés, en direct et via Tailscale
Quatre streams du même jeu, en alternant l'adresse directe et l'adresse Tailscale : 7,3 à 7,8 ms en moyenne dans les deux cas.
Moonlight streamant un jeu depuis le serveur cloud via l'adresse Tailscale, avec ses statistiques de performance
Via le tailnet : 60 fps, 7,3 ms de traitement côté serveur en moyenne, aucune image perdue.

Sur le serveur, pendant le stream, le service Tailscale utilisait 2,8 à 4,2 % d’un cœur, Sunshine 13 à 17 % et l’émulateur 3 à 4 %. Lors de deux essais précédents, réalisés pendant que d’autres serveurs de test utilisaient le même GPU, le traitement côté serveur est monté à 21 à 27 ms en moyenne : cela venait du partage du GPU à ce moment-là, pas de Tailscale, comme le montrent les essais alternés ci-dessus.

Graphique en barres : CPU du serveur pendant le streaming via Tailscale, pour Sunshine, tailscaled et RetroArch, en pourcentage d'un cœur
CPU du serveur pendant un stream 1080p dans le tunnel, en pourcentage d'un cœur : le service Tailscale coûte moins que l'émulateur.

5. Quelle offre ?

Tailscale lui-même ne demande presque rien. Ce qui compte, c’est le jeu : iGPU Start (2 vCPU, 8 Go de RAM, 14,99 € HT par mois) suffit pour les consoles rétro ; pour les jeux PC, nous recommandons iGPU Power (4 vCPU, 14 Go de RAM, deux fois la part GPU de Start, 29,99 € HT par mois).

Envie d’un serveur prêt à jouer ? Demandez-le par e-mail à la commande (contact@linuxgpu.eu) : nous pouvons vous livrer le serveur avec Sunshine, le lanceur de vos jeux et Tailscale déjà installés (côté serveur). Vous installez Moonlight et l’application Tailscale sur vos propres appareils.

Ce que vous pouvez y faire tourner : le rétrogaming avec RetroArch, Sunshine et Moonlight, Windows 11 dans le cloud avec Sunshine et Moonlight, et les jeux Windows sous Linux avec Wine.

Des systèmes prêts pour le jeu dès l’installation. Les systèmes que nous installons par défaut sont déjà optimisés pour cela : Debian 13 avec un noyau récent (7.3), les pilotes GPU Intel et Mesa (OpenGL, Vulkan, encodage vidéo VA-API), et Windows 11 (option) avec le pilote graphique Intel et le Bureau à distance rendu sur le GPU. Aucun pilote à chercher : installez votre jeu et Sunshine, et jouez.

Essayer

Voir les offres : l’option IPv4 dédiée coûte 5 € par mois, mais avec Tailscale, vous n’en avez pas besoin pour jouer.