00:00:00Este é o Headscale, uma versão gratuita e de código aberto do Tailscale que você pode instalar em qualquer servidor,
00:00:06dando a você controle total da sua rede criptografada caso a internet caia ou a Tailscale resolva aumentar os preços de repente.
00:00:13Mas o que é estranho é que o Headscale foi criado por um funcionário da Tailscale.
00:00:18Por que eles estão pagando alguém para criar seu próprio concorrente?
00:00:22Se inscreva no canal e vamos descobrir.
00:00:25Vamos ver rapidinho o Headscale em ação antes de entrarmos nos detalhes.
00:00:30Certo, no momento eu tenho três servidores na Hetzner: um para o plano de controle principal do Headscale e dois nós aqui que quero conectar entre si.
00:00:40Então, esses dois fazem parte da minha rede criptografada no momento.
00:00:44Se eu rodar este comando, como tudo está no Docker, posso ver os nós atuais: o Ubuntu Test e o Ubuntu Test 2.
00:00:53E estes são os endereços IP que posso usar para conectá-los.
00:00:56Por enquanto, vamos conectar esses dois nós um ao outro.
00:00:59Primeiro, vou copiar este endereço IP.
00:01:02E agora, dentro do Ubuntu Test 2, vou acessar via SSH como root.
00:01:07Sim, eu não deveria usar o root, mas isso é só para teste.
00:01:09E este é o endereço IP do Headscale.
00:01:11Se eu der enter e limpar a tela, como podem ver, estou no Ubuntu Test 1.
00:01:17Ou seja, entrei no Ubuntu Test 1 a partir do Ubuntu Test 2, e posso sair para voltar ao Ubuntu Test 2.
00:01:24E posso fazer o mesmo no Ubuntu Test 1 se eu der SSH root e colar o IP do Ubuntu Test 2.
00:01:31Limpando a tela, vemos que estou no Ubuntu Test 2 a partir do Ubuntu Test 1.
00:01:36Mas se eu estiver fora da tailnet — se eu abrir uma nova aba, que é o terminal do meu Mac — e tentar SSH root no IP do Ubuntu Test 2...
00:01:48Vejam que a conexão trava, porque estou fora da tailnet.
00:01:52Como acabaram de ver, o Headscale te dá acesso total à sua rede.
00:01:56Você controla cada detalhe e pode adicionar quantos nós quiser sem ficar preso a um fornecedor.
00:02:03E pode funcionar sem internet se você o conectar a um NAS ou a um Raspberry Pi antigo.
00:02:08Mas a configuração é um pouco trabalhosa.
00:02:11Na verdade, deixe-me mostrar como funciona.
00:02:13Criei um novo servidor chamado Ubuntu Test 3 e vou criar uma nova tailnet ou um novo servidor criptografado com um novo usuário que conectará dois nós.
00:02:24No caso, o Ubuntu Test 3 e o Ubuntu Test 1, apenas para fins de teste.
00:02:29No meu plano de controle do Headscale, ele já está instalado, mas vou mostrar o processo que utilizei.
00:02:37No momento, tenho três containers Docker rodando.
00:02:40Um é o Headscale UI, outro é o Headscale e o terceiro é o Caddy.
00:02:45Se olharmos o arquivo Docker Compose, veremos que a configuração é muito similar à da documentação oficial do Headscale.
00:02:56Apesar de eu ter alterado algumas coisas, como a versão do Headscale e os caminhos dos meus diretórios.
00:03:03Também tenho um container para o Headscale UI, que é uma das várias interfaces web de código aberto que você pode usar.
00:03:11Vou mostrar isso mais adiante.
00:03:13Depois tem o Caddy, servindo como proxy reverso.
00:03:16Vou deixar o link deste arquivo Docker Compose específico na descrição, caso tenham interesse.
00:03:21Neste diretório, também temos as pastas "lib" e "config".
00:03:26A pasta lib, como podem ver, serve principalmente para armazenar o banco de dados SQLite, que controla usuários, nós, DNS e muito mais.
00:03:36Mas, na configuração, você pode mudar para um banco Postgres se não quiser usar SQLite.
00:03:43Já o diretório config contém a configuração do Tailscale e a política de lista de controle de acesso (ACL) em um arquivo JSON legível.
00:03:52Falaremos disso depois, mas vamos olhar este primeiro, que você consegue na documentação do Tailscale — eu até usei o curl para baixá-lo no servidor.
00:04:01Olhando a configuração de exemplo no GitHub, vemos tudo o que podemos alterar, desde o servidor até os prefixos e o local do arquivo de política.
00:04:11A minha configuração é bem parecida, só mudei a URL do servidor para um domínio da Cloudflare, para que os nós saibam onde encontrar os outros.
00:04:23Também adicionei o caminho para a minha política e basicamente foi isso.
00:04:28O domínio é um padrão da Cloudflare com um registro tipo A apontando para o IP do meu controle plane sob o subdomínio "headscale".
00:04:37Com isso pronto, se eu abrir o arquivo do Caddy, verão que temos duas URLs: uma para a interface web e outra para o proxy do headscale.
00:04:49Depois dessas etapas, o primeiro passo é criar um novo usuário com este comando.
00:04:56Vou criar um usuário chamado Tom, mas pode ser o nome que você quiser.
00:05:00Usuário criado, rodamos "users list" para ver todos e aqui está o nosso novo usuário com o ID 6.
00:05:08Só que agora ele não tem nenhum nó associado a ele.
00:05:11Então, vamos dar alguns nós ao Tom.
00:05:13No Ubuntu Test 3, que é o novo servidor, primeiro precisamos adicionar o cliente Tailscale rodando este comando.
00:05:23Isso nos dá acesso ao binário do Tailscale.
00:05:27Atenção: se você não for usuário root, talvez precise usar o "sudo" para rodar o Tailscale.
00:05:31Mas antes de rodar os comandos para subir o serviço ou logar, precisamos fazer de um jeito específico para funcionar com o Headscale.
00:05:38Para isso, criaremos chaves de pré-autenticação; o comando está na página inicial da documentação do Headscale.
00:05:46Vou rolar a página e copiar este comando.
00:05:49No meu plano de controle do Headscale, vou digitar "docker exec" e colar o comando.
00:05:54Onde diz "user ID", vamos colocar o ID do Tom, que é 6.
00:05:59E antes disso, preciso adicionar um segundo "headscale" já que estamos entrando no container.
00:06:04E agora temos nossa chave de pré-autenticação.
00:06:07Copiamos este comando e colamos lá no Ubuntu Test 3.
00:06:11Depois, pegamos a chave de pré-autenticação e colamos aqui.
00:06:15Aí temos que mudar o servidor de login para o nosso servidor Headscale, que configuramos como headscale.pandor.css.
00:06:23Pandora já estava ocupado, senão eu teria usado.
00:06:26Agora, ao dar enter, devemos ter um novo nó adicionado à nossa rede Headscale.
00:06:31Voltando ao controle plane e rodando "nodes list", vemos o Ubuntu Test 3 aqui, pertencente ao Tom, com seus endereços IPv4 e IPv6.
00:06:44Agora vamos adicionar o Ubuntu Test 1 ao usuário Tom.
00:06:47Mas primeiro vou deletar o nó Ubuntu Test existente com ID 1, forçando a exclusão para pular confirmações.
00:06:56Feito isso, vou criar outra chave de pré-autenticação e adicioná-la ao Ubuntu Test, sem esquecer de ativar o SSH com a flag correspondente.
00:07:06Vou também no Ubuntu Test 3 configurar o SSH, o que apenas habilita a capacidade de conexão.
00:07:13Agora, olhando a lista de nós disponíveis, tenho o Ubuntu Test 1 e o Ubuntu Test 3, ambos sob o usuário Tom.
00:07:20Vamos conectar aos dois.
00:07:21Vou pegar o IP do Ubuntu Test 3, ir no Ubuntu Test 1 e rodar SSH root com esse IP.
00:07:30Após validar a chave, vejam que estou no Ubuntu Test 3 a partir do Ubuntu Test 1.
00:07:35E posso fazer o caminho inverso, do 3 para o 1.
00:07:41Se você seguiu meus passos exatamente, há uma grande chance de não funcionar, porque você precisa adicionar uma política de controle de acesso.
00:07:49Deixe-me mostrar a minha.
00:07:51Vou limpar aqui e entrar no diretório do Headscale; na pasta de configuração, temos o arquivo ACL em JSON.
00:08:01Entrando nele, há uma configuração bem simples que basicamente aceita qualquer origem da minha rede para qualquer destino ou porta.
00:08:11E em SSH, aceita qualquer nó dentro da minha tailnet e permite a conexão via SSH sem aprovação, mas apenas para o usuário root.
00:08:24Claro que, dependendo da sua rede e situação, você vai querer restringir isso por segurança, permitindo que certos nós acessem outros apenas em portas específicas.
00:08:33Mas esta é uma configuração simples para começar.
00:08:37E repito: o link para isso estará na descrição.
00:08:40Agora você deve estar se perguntando: e a interface do Headscale?
00:08:43Ela facilita o processo?
00:08:45Eu diria que sim e não.
00:08:47Vou mostrar.
00:08:48Aqui está a URL da minha interface e vocês podem ver meus dois usuários, Tess e Tom, com informações sobre eles.
00:08:57Dá para ver as chaves e os nós conectados para que isso funcione.
00:09:01Inicialmente, você precisa adicionar uma chave de API do Headscale, que você gera com este comando.
00:09:06Mas o problema que tive foi com a visualização dos dispositivos.
00:09:09Como podem ver, não há muita informação aqui; parece ser um erro de tipo do TypeScript no console, o que não deve ser minha culpa, pois não mexi no código-fonte.
00:09:22Nesse ponto, o app costuma travar e nada funciona.
00:09:26Eu deveria conseguir adicionar novos dispositivos por aqui e mudar algumas configurações também.
00:09:32Mas, por ser tão instável, não achei a interface tão útil assim.
00:09:35Existem outras interfaces para o Headscale, algumas que facilitam ainda mais a criação de políticas de acesso.
00:09:42Mas, na minha opinião, ainda não encontrei uma interface realmente proveitosa.
00:09:46Então sim, a configuração é um pouco complexa.
00:09:49Ok, ela é bem complexa.
00:09:51Alguém sem base técnica ou até um desenvolvedor júnior teria dificuldade em configurar isso sozinho.
00:09:57Provavelmente por isso a equipe da Tailscale permitiu que seu funcionário trabalhasse nisso; não representa uma grande ameaça para a empresa no momento.
00:10:07Digo, bastaria alguém usar o Claude Opus para criar uma interface bonitinha em volta disso e teriam algo bem legal — mas que talvez fosse barrado pela licença.
00:10:18Mas depois que tudo está rodando, o Headscale funciona maravilhosamente bem.
00:10:22Ainda faltam alguns recursos, como os comandos "funnel" e "serve" para expor servidores publicamente ou só na rede.
00:10:32Também não suporta múltiplas tailnets, nós efêmeros ou logs nativos de fluxo de rede.
00:10:38Mas, para uma ferramenta de código aberto, é realmente impressionante.
00:10:42E se algum dia eu quiser rodar meu OpenClaw totalmente offline com um LLM local, certamente considerarei o Headscale.