O Tailscale permite-lhe aceder por SSH a um servidor sem IP público e sem portas abertas no router. Executa tailscale up no servidor, inicia sessão na app Tailscale do telemóvel com a mesma conta e liga-se ao endereço 100.x da máquina ou ao seu nome MagicDNS. As ACL decidem quem entra e com que utilizador.

Como instalar o Tailscale e executar tailscale up num servidor Linux

tailscale up junta a máquina à sua tailnet e mostra um URL de início de sessão. Depois de se autenticar, a máquina recebe um endereço 100.x. Em Linux, o script oficial instala tanto o pacote como o serviço:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4
tailscale status

tailscale ip -4 mostra o endereço IPv4 da máquina na tailnet e tailscale status lista os restantes dispositivos com o respetivo nome e estado. O tráfego entre nós é cifrado sobre WireGuard. Cada nó abre a sua ligação para o exterior, pelo que não precisa de reencaminhar a porta TCP 22 no router nem de ter um IP público.

Em macOS, iOS e Android não escreve tailscale up. Instala a app Tailscale e inicia sessão a partir da sua interface.

Endereços 100.x e MagicDNS do Tailscale: que host o seu cliente SSH deve usar

Cada nó do Tailscale recebe um endereço da gama 100.64.0.0/10, acessível apenas dentro da sua tailnet. O MagicDNS dá-lhe também um nome que corresponde ao nome da máquina. Qualquer cliente SSH aceita as três formas:

ssh [email protected]
ssh deploy@servidor
ssh [email protected]

O nome curto é o mais cómodo. Se não for resolvido num determinado dispositivo, use antes o nome completo .ts.net. Guarde a ligação com o nome MagicDNS em vez do IP. Assim, se o nó voltar a registar-se e o endereço mudar, o nome continua a apontar para a máquina certa.

Se preferir não depender do Tailscale, a rede mesh privada Prialo resolve o mesmo problema: chegar às máquinas sem abrir portas.

Tailscale SSH vs OpenSSH com chaves: tabela comparativa

sudo tailscale set --ssh ativa o Tailscale SSH no servidor. O Tailscale passa então a responder às ligações à porta 22 que chegam pela tailnet e autentica-as com a identidade da sua conta, pelo que não são necessárias chaves em authorized_keys. A alternativa é manter o OpenSSH com chaves e usar o Tailscale apenas como rede.

O que se comparaOpenSSH com chaves sobre TailscaleTailscale SSH
AutenticaçãoChave Ed25519 ou RSA em authorized_keysIdentidade da conta Tailscale
Quem concede o acessosshd e authorized_keys em cada servidorA secção ssh do ficheiro de políticas ACL
Nova autenticaçãoNão disponível por predefiniçãoA ação check obriga a confirmar novamente o início de sessão
Se o Tailscale não estiver disponívelA chave continua a funcionar a partir da rede localSem acesso por essa via
Cliente em iOS/AndroidQualquer cliente SSH com a chave carregadaQualquer cliente SSH ligado à tailnet

Se ficar com as chaves, use Ed25519. O OpenSSH suporta-as desde a versão 6.5 (janeiro de 2014), e as chaves ed25519-sk apoiadas em FIDO2 desde a 8.2. No termi1 pode gerar a chave no próprio telemóvel; fica guardada no armazenamento seguro do sistema e a chave privada nunca sai do dispositivo.

ACL do Tailscale para SSH: limitar quem entra e com que utilizador

O ficheiro de políticas do Tailscale tem duas camadas. acls controla quem pode chegar à porta 22 e ssh controla quem pode usar o Tailscale SSH e com que utilizador local. Este exemplo deixa entrar apenas o grupo de administradores, e só como deploy, nos servidores etiquetados como produção:

{
  "groups": { "group:admins": ["[email protected]"] },
  "tagOwners": { "tag:prod": ["group:admins"] },
  "acls": [
    { "action": "accept", "src": ["group:admins"], "dst": ["tag:prod:22"] }
  ],
  "ssh": [
    { "action": "check", "src": ["group:admins"], "dst": ["tag:prod"], "users": ["deploy"] }
  ]
}

Aplica a etiqueta ao servidor com a opção --advertise-tags=tag:prod de tailscale up. Com "action": "accept" o acesso é imediato; com "check" o Tailscale pede-lhe que confirme a sua identidade antes de a sessão abrir. Cada campo está explicado na documentação oficial do Tailscale SSH.

Mosh, tmux e SFTP sobre Tailscale a partir do telemóvel com o termi1

O Mosh inicia o mosh-server através de uma ligação SSH inicial e depois passa para UDP, nas portas 60000-61000 por predefinição. Dentro da tailnet também não é preciso abrir essas portas no router:

mosh deploy@servidor
tmux new -A -s main

O termi1 mantém a sessão ativa com o Mosh quando passa da rede Wi-Fi para os dados móveis, e o tmux preserva o que deixou a correr para quando voltar. O Mosh não faz reencaminhamento de portas nem reencaminhamento X11, por isso abra uma sessão SSH separada se precisar de um túnel. O teclado do termi1 tem as teclas Esc, Ctrl, Tab e setas para controlar o tmux. O SFTP integrado permite enviar ou transferir ficheiros pelo mesmo nome MagicDNS sem sair da sessão.

Se marcar no termi1 as suas ligações aos servidores tag:prod como produção, o Production Guard impede que a IA prima Enter nelas. Também retém tudo o que apague, pare ou altere algo antes de chegar ao prompt. A app está na App Store para iPhone e no Google Play.

4 erros ao ligar por SSH através do Tailscale

  1. A app Tailscale no telemóvel está desligada. Se a VPN do Tailscale não estiver ativa, nem os endereços 100.x nem os nomes MagicDNS são resolvidos, e o cliente SSH excede o tempo limite.
  2. Voltar a executar tailscale up com opções diferentes. O tailscale up espera que repita todas as opções não predefinidas que definiu antes. Para alterar uma única definição, use tailscale set.
  3. Deixar a porta 22 aberta na interface pública. Com o ufw, permita primeiro a interface da tailnet e depois remova a regra geral: sudo ufw allow in on tailscale0 e sudo ufw delete allow 22/tcp. Verifique que consegue entrar pelo Tailscale antes de a remover.
  4. Permissões erradas com o OpenSSH. O sshd rejeita a chave se ~/.ssh não tiver permissões 700 ou se authorized_keys não tiver permissões 600.

Perguntas frequentes

O Tailscale precisa de portas abertas no router para SSH?

O Tailscale não precisa de nenhuma porta aberta no router para SSH. Cada nó abre a sua ligação para o exterior e o tráfego é cifrado sobre WireGuard dentro da tailnet. Basta que o servidor e o telemóvel tenham sessão iniciada na mesma conta, com ACL que permitam a porta 22.

Qual é a diferença entre o Tailscale SSH e o SSH com chaves?

O Tailscale SSH autentica com a identidade da sua conta Tailscale e aplica a secção ssh das suas ACL, pelo que não são necessárias chaves em authorized_keys. O SSH com chaves usa o OpenSSH habitual sobre a tailnet e continua a funcionar a partir da rede local mesmo quando o Tailscale não está disponível.

O Mosh funciona sobre Tailscale?

O Mosh funciona sobre Tailscale. Inicia o mosh-server através de uma ligação SSH inicial e depois usa UDP dentro da tailnet, nas portas 60000-61000 por predefinição. Não precisa de abrir essas portas no router, mas a firewall local do servidor tem de as permitir na interface do Tailscale.

Posso usar o MagicDNS em vez do endereço 100.x?

O MagicDNS dá a cada máquina da tailnet um nome que corresponde ao seu hostname, pelo que pode escrever ssh deploy@servidor em vez do endereço 100.x. Se o nome curto não for resolvido, use o nome completo terminado em .ts.net que aparece na consola de administração do Tailscale.