Blog

Jogue no seu servidor na nuvem a partir de qualquer lugar com Moonlight e Tailscale

Sem IPv6 em casa e sem portas para abrir: ligámos o Moonlight a um servidor Sunshine na nuvem através de uma rede Tailscale (testado com Headscale): ligação direta, 1080p 60 fps, 0 imagens perdidas e os mesmos 7,3 a 7,8 ms de processamento no servidor que sem Tailscale.

Jogue no seu servidor na nuvem a partir de qualquer lugar com Moonlight e Tailscale

Os nossos servidores são acessíveis por IPv6 por omissão. Muitas ligações domésticas têm IPv6, mas nem todas: algumas redes móveis, o Wi-Fi dos hotéis e routers mais antigos só têm IPv4. Pode acrescentar um IPv4 dedicado ao seu servidor (5 € por mês), mas há outra forma, que além disso mantém as portas do Sunshine fechadas à Internet: o Tailscale. Cria uma rede privada e cifrada (uma “tailnet”) entre os seus dispositivos, baseada em WireGuard. O seu servidor e o seu telemóvel recebem cada um um endereço 100.x.y.z, e o Moonlight liga-se a esse endereço como se ambos estivessem em casa.

Um jogo transmitido pelo Sunshine para o Moonlight através do endereço da tailnet (5 segundos, estatísticas de desempenho do Moonlight no canto superior esquerdo).

Resultados em resumo

  • Funciona com o cliente oficial do Tailscale dos dois lados: ligação direta entre as duas máquinas (tailscale ping: pong via 203.0.113.10:41641 in 1ms), Moonlight em 100.x.y.1.
  • O Tailscale não custa nada mensurável no stream: testes alternados com e sem Tailscale deram os mesmos 1080p 60 fps, 7,3 a 7,8 ms de processamento no servidor pelos dois caminhos, 0 imagens perdidas.
  • O Sunshine fica fechado à Internet: as suas portas só aceitam ligações que chegam pela tailnet. Só o túnel é usado; não é preciso abrir nada no seu router.
  • Pouco custo de CPU: o serviço Tailscale usava 3 a 4% de um núcleo no servidor durante um stream 1080p a 15 Mbit/s.

Duas formas de ter uma tailnet

Conta TailscaleHeadscale
O que éO próprio serviço do Tailscale gere a sua rede (plano Personal gratuito)Servidor de controlo open source que aloja você mesmo
Software clienteapps oficiais do Tailscaleas mesmas apps oficiais do Tailscale
Configuraçãoiniciar sessão em cada dispositivoinstalar o Headscale, criar chaves, apontar cada dispositivo para ele
Acessibilidadesempre acessívelo Headscale tem de ser acessível a todos os seus dispositivos

O caminho normal é uma conta Tailscale: instale o Tailscale no servidor e nos seus dispositivos, inicie sessão com a mesma conta e está feito. No nosso teste usámos o Headscale em vez disso, porque não queríamos criar uma conta para um teste: é um servidor open source que desempenha o mesmo papel que o serviço de coordenação do Tailscale. A rede em si é a mesma: as duas máquinas corriam o cliente oficial do Tailscale (versão 1.104.5), que constrói os mesmos túneis WireGuard seja qual for o servidor de controlo com que comunica.

Configuração do teste

ElementoValor
ServidorDebian 13, Intel UHD 770 (GPU partilhada), 4 vCPU, Sunshine 2026.914, RetroArch, sway sem ecrã
ClienteDebian 13, Moonlight 6.2, H.264 1080p 60 fps, descodificação por hardware
TailnetTailscale 1.104.5 nos dois, Headscale 0.29.7 no servidor (.deb oficial do GitHub)
Redecliente e servidor no mesmo centro de dados: pela Internet, some a latência da sua ligação

1. Instalar o Tailscale no servidor

O Tailscale publica pacotes para 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

Com uma conta Tailscale, execute tailscale up e abra a ligação que ele mostra para iniciar sessão. Depois instale a app Tailscale no seu computador, telemóvel ou box de TV e inicie sessão com a mesma conta.

Com o Headscale (o que testámos), instale o servidor a partir da sua release oficial no GitHub, defina server_url em /etc/headscale/config.yaml e depois crie um utilizador e uma chave:

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

O cliente junta-se com o mesmo comando tailscale up --login-server … --authkey …. No nosso teste, o Headscale escutava no endereço privado do servidor, porque as duas máquinas estavam no mesmo centro de dados. Para uso real, o Headscale tem de ser acessível a todos os seus dispositivos, por HTTPS: aloje-o numa máquina com IPv4 público (por exemplo com a opção de IPv4 dedicado), caso contrário um dispositivo sem IPv6 não o consegue alcançar. É a principal razão pela qual uma conta Tailscale é mais simples.

2. Verificar a ligação

$ 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 significa que as duas máquinas comunicam sem relé. Pela Internet, o Tailscale também tenta ligar os seus dispositivos diretamente através do router de sua casa (o servidor tem IPv4 de saída para isso). Quando não consegue, o tráfego passa por um relé do Tailscale (“DERP”): continua a funcionar, mas acrescenta latência. O tailscale status indica-lhe qual dos dois obteve.

Um ping normal através do túnel demorava 1,7 ms em média (0,8 ms no melhor caso) contra 0,36 ms sem Tailscale: a cifra do WireGuard acrescenta bem menos de um milissegundo, o que é invisível ao lado da latência de uma ligação à Internet.

Gráfico de barras: ida e volta do ping sem Tailscale (0,36 ms) e através do Tailscale (1,73 ms em média)
Ping entre as duas máquinas: 0,36 ms direto, 1,73 ms em média pelo túnel (0,79 ms no melhor caso, um pico de 8,8 ms).

3. Manter o Sunshine fechado à Internet

A vantagem da tailnet é que o Sunshine não precisa de ser acessível a partir da Internet. No servidor, uma pequena tabela nftables descarta as portas do Sunshine exceto na 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

Verificámo-lo a partir do cliente: a porta 47989 do Sunshine deixou de responder no endereço normal do servidor e respondia (HTTP 200) em 100.x.y.1. Para emparelhar o Moonlight, abra a interface web do Sunshine através de um túnel SSH (ssh -L 47990:localhost:47990 you@100.x.y.1).

4. Jogar: Moonlight no endereço 100.x

No Moonlight, adicione o servidor pelo seu endereço na tailnet (aqui 100.x.y.1), emparelhe-o e inicie um jogo. O Moonlight reconheceu o servidor que já conhecia e ligou-se sem qualquer outra definição. A interface da tailnet tem um tamanho de pacote menor (MTU de 1280 bytes); não tivemos de alterar nada no Moonlight por causa disso.

Para ver se o Tailscale muda alguma coisa, transmitimos o mesmo jogo quatro vezes, alternando o endereço normal do servidor e o seu endereço na tailnet:

Moonlight, 1080p 60 fps H.264Sem TailscaleAtravés do Tailscale
Taxa de fotogramas recebida60,0 a 60,4 fps60,0 fps
Processamento no servidor (captura + codificação), média7,5 a 7,8 ms7,3 a 7,4 ms
Processamento no servidor, máx10,4 a 10,6 ms10,5 a 10,8 ms
Imagens perdidas pela rede ou por jitter0%0%
Tempo de descodificação no cliente0,23 ms0,24 a 0,25 ms
Gráfico de barras: processamento por fotograma no servidor em quatro ensaios alternados, direto e através do Tailscale
Quatro streams do mesmo jogo, alternando o endereço direto e o endereço Tailscale: 7,3 a 7,8 ms em média nos dois casos.
Moonlight a transmitir um jogo a partir do servidor na nuvem através do endereço Tailscale, com as suas estatísticas de desempenho
Através da tailnet: 60 fps, 7,3 ms de processamento no servidor em média, nenhuma imagem perdida.

No servidor, durante o stream, o serviço Tailscale usava 2,8 a 4,2% de um núcleo, o Sunshine 13 a 17% e o emulador 3 a 4%. Em dois testes anteriores, feitos enquanto outros servidores de teste usavam intensamente a mesma GPU, o processamento no servidor subiu para 21 a 27 ms em média: isso deveu-se à GPU estar partilhada nesse momento, não ao Tailscale, como mostram os testes alternados acima.

Gráfico de barras: CPU do servidor durante o streaming através do Tailscale para Sunshine, tailscaled e RetroArch, em percentagem de um núcleo
CPU do servidor durante um stream 1080p pelo túnel, em percentagem de um núcleo: o serviço Tailscale custa menos do que o emulador.

5. Que plano?

O Tailscale em si quase não precisa de nada. O que conta é o jogo: o iGPU Start (2 vCPU, 8 GB de RAM, 14,99 € s/ IVA por mês) chega para consolas retro; para jogos de PC recomendamos o iGPU Power (4 vCPU, 14 GB de RAM, o dobro da quota de GPU do Start, 29,99 € s/ IVA por mês).

Quer o servidor pronto a jogar? Peça-o por e-mail ao encomendar (contact@linuxgpu.eu): podemos entregar-lhe o servidor com o Sunshine, o launcher dos seus jogos e o Tailscale já instalados (do lado do servidor). Você instala o Moonlight e a app Tailscale nos seus próprios dispositivos.

O que pode correr nele: jogos retro com RetroArch, Sunshine e Moonlight, Windows 11 na nuvem com Sunshine e Moonlight e jogos Windows no Linux com o Wine.

Sistemas prontos para jogar logo à partida. Os sistemas que instalamos por predefinição já estão otimizados para isso: Debian 13 com um kernel recente (7.3), os drivers de GPU da Intel e o Mesa (OpenGL, Vulkan, codificação de vídeo VA-API), e o Windows 11 (opção) com o driver gráfico da Intel e o Ambiente de Trabalho Remoto renderizado na GPU. Nada de procurar drivers: instale o seu jogo e o Sunshine, e jogue.

Experimentar

Ver os planos: a opção de IPv4 dedicado custa 5 € por mês, mas com o Tailscale não precisa dela para jogar.