HeadlinesBriefing favicon HeadlinesBriefing.com

Tailcat: netcat sobre Tailscale

Hacker News •
×

Tailcat é um remix de componentes de código aberto do Tailscale para agir como netcat, mas sobre o plano de dados do Tailscale, sem seu plano de controle. O plano de dados do Tailscale (magicsock, internamente) fornece túneis criptografados ponto a ponto Wire Guard® entre duas máquinas, com DERP como canal lateral de comunicação para perfuração NAT e como retransmissão de último recurso se a travessia NAT falhar. Em vez de usar o plano de controle do Tailscale, todos os metadados de conexão do tailcat são trocados fora de banda, como você quiser. A CLI do tailcat (em cmd/tailcat) é construída sobre a biblioteca Go do tailcat (importável como github.com/tailscale/tailcat).

Quer você use tailcat como ferramenta CLI ou biblioteca, um lado executa um servidor tailcat (ouvinte) e obtém um token de conexão curto. O outro lado passa esse token para o lado do cliente do tailcat para conectar. Todo o tráfego entre os dois é criptografado de ponta a ponta com Wire Guard. A conexão inicial é inicializada através da rede de retransmissão DERP do Tailscale, e então o magicsock realiza a travessia NAT para atualizar para uma conexão UDP direta ponto a ponto quando possível (geralmente!).

Você não precisa de uma conta Tailscale, nem acesso root/admin na máquina (não altera as tabelas de roteamento, DNS, etc.). É apenas uma biblioteca de espaço do usuário e uma ferramenta CLI. E é tudo código aberto. Você pode usar nossos retransmissores DERP gratuitos com limite de taxa (o mapa DERP padrão é https://tailcat.dev/derpmap.json) ou pode executar os seus próprios.

Uso: Canalize stdin/stdout entre duas máquinas. O servidor inicia, imprimindo seu endereço efêmero: $ tailcat # Região de retransmissão de inicialização selecionada 302, São Francisco # Servidor ouvindo com novo endereço: tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu (pendurado, esperando...) E então o cliente pode: $ echo hello | tailcat tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu $ Então o servidor desbloqueia: $ tailcat # Região de retransmissão de inicialização selecionada 302, São Francisco # Servidor ouvindo com novo endereço: tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu hello $ Expor portas locais através do túnel Ou você pode servir uma porta TCP local, encaminhada para localhost: $ tailcat --serve=8080,8443 # ou --serve=all # Servidor ouvindo com novo endereço: tc XXXXXXXXX E então o cliente: $ tailcat tc XXXXXXXXX 8080 GET / HTTP/1.1 Host: foo HTTP/1.1 200 OK.... Servidor SSH sem autenticação No Linux e macOS, você também pode executar um servidor SSH sem autenticação. (Se você quiser autenticação, pode simplesmente tailcat --serve=22 e proxy para seu servidor SSH do sistema) $ tailcat --serve=no-auth-ssh # Servidor ouvindo com novo endereço: tc XXXXXXXXX E no lado do cliente: $ tailcat ssh tc XXXXXXXXX $ tailcat ssh tc XXXXXXXXX ls -la Comandos diversos Ping para testar conectividade; cada pong informa se chegou via retransmissão DERP ou caminho direto. --until-direct continua pingando (até --timeout, padrão 10s) até que um caminho direto funcione, saindo com código não zero se não: $ tailcat ping --until-direct <token> pong in 42.1ms via DERP(sfo) pong in 1.2ms via 203.0.113.7:41641 Execute um comando através de um proxy SOCKS5 roteado sobre o túnel: $ tailcat socks <token> curl http://server.tailcat:8081/ Tokens também funcionam diretamente como nomes de host URL: o proxy SOCKS os reconhece e disca, então o argumento do token é opcional. (Tokens diferenciam maiúsculas de minúsculas; isso funciona com curl e a maioria das ferramentas CLI, mas não com navegadores, que colocam nomes de host em minúsculas.) $ tailcat socks curl http://<token>:8081/ Agir como nó de saída para que o cliente possa alcançar a rede do servidor: $ tailcat --serve=exit-node Analisar um token de conexão e imprimir seu conteúdo (a chave pública Wire Guard do servidor e informações DERP) como JSON, sem conectar a nada: $ tailcat parse tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu {"Server Public": "nodekey:9c8d2e6728da80a1dd37e275a82595b42d9a838610bc53f74a7670d1610f2e34","Region ID": 302} Resolver um token curto (que referencia uma região DERP por ID, exigindo que os clientes busquem o mapa DERP) em um token mais longo autocontido com as informações do servidor DERP incorporadas...