HeadlinesBriefing favicon HeadlinesBriefing.com

Tailcat: netcat sobre Tailscale

Hacker News •
×

Tailcat es una remezcla de componentes de código abierto de Tailscale para actuar como netcat, pero sobre el plano de datos de Tailscale, sin su plano de control. El plano de datos de Tailscale (magicsock, internamente) proporciona túneles cifrados punto a punto Wire Guard® entre dos máquinas, con DERP como canal lateral de comunicación para agujeros NAT y como relevo de último recurso si falla la travesía NAT. En lugar de usar el plano de control de Tailscale, todos los metadatos de conexión de tailcat se intercambian fuera de banda, como quieras. La CLI de tailcat (en cmd/tailcat) está construida sobre la biblioteca Go de tailcat (importable como github.com/tailscale/tailcat).

Ya sea que uses tailcat como herramienta CLI o biblioteca, un lado ejecuta un servidor tailcat (listener) y obtiene un token de conexión corto. El otro lado pasa ese token al lado del cliente de tailcat para conectarse. Todo el tráfico entre ambos está cifrado de extremo a extremo con Wire Guard. La conexión inicial se arranca a través de la red de relevos DERP de Tailscale, y luego magicsock realiza la travesía NAT para actualizar a una conexión UDP directa punto a punto cuando sea posible (¡normalmente!).

No necesitas una cuenta de Tailscale, ni acceso root/admin en la máquina (no altera las tablas de enrutamiento, DNS, etc.). Es solo una biblioteca de espacio de usuario y una herramienta CLI. Y todo es de código abierto. Puedes usar nuestros relevos DERP gratuitos con límite de velocidad (el mapa DERP predeterminado es https://tailcat.dev/derpmap.json) o puedes ejecutar los tuyos.

Uso: Canaliza stdin/stdout entre dos máquinas. El servidor se inicia, imprimiendo su dirección efímera: $ tailcat # Región de relevo de arranque seleccionada 302, San Francisco # Servidor escuchando con nueva dirección: tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu (se cuelga, esperando...) Y luego el cliente puede: $ echo hello | tailcat tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu $ Entonces el servidor se desbloquea: $ tailcat # Región de relevo de arranque seleccionada 302, San Francisco # Servidor escuchando con nueva dirección: tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu hello $ Exponer puertos locales a través del túnel O puedes servir un puerto TCP local, reenviado a localhost: $ tailcat --serve=8080,8443 # o --serve=all # Servidor escuchando con nueva dirección: tc XXXXXXXXX Y luego el cliente: $ tailcat tc XXXXXXXXX 8080 GET / HTTP/1.1 Host: foo HTTP/1.1 200 OK.... Servidor SSH sin autenticación En Linux y macOS, también puedes ejecutar un servidor SSH sin autenticación. (Si quieres autenticación, puedes simplemente tailcat --serve=22 y proxy a tu servidor SSH del sistema) $ tailcat --serve=no-auth-ssh # Servidor escuchando con nueva dirección: tc XXXXXXXXX Y en el lado del cliente: $ tailcat ssh tc XXXXXXXXX $ tailcat ssh tc XXXXXXXXX ls -la Comandos varios Ping para probar conectividad; cada pong informa si llegó a través de un relevo DERP o una ruta directa. --until-direct sigue haciendo ping (hasta --timeout, predeterminado 10s) hasta que una ruta directa funcione, saliendo con código no cero si no: $ tailcat ping --until-direct <token> pong in 42.1ms via DERP(sfo) pong in 1.2ms via 203.0.113.7:41641 Ejecutar un comando a través de un proxy SOCKS5 enrutado sobre el túnel: $ tailcat socks <token> curl http://server.tailcat:8081/ Los tokens también funcionan directamente como nombres de host URL: el proxy SOCKS los reconoce y los marca, por lo que el argumento del token es opcional. (Los tokens distinguen mayúsculas y minúsculas; esto funciona con curl y la mayoría de las herramientas CLI, pero no con navegadores, que ponen en minúsculas los nombres de host.) $ tailcat socks curl http://<token>:8081/ Actuar como nodo de salida para que el cliente pueda alcanzar la red del servidor: $ tailcat --serve=exit-node Analizar un token de conexión e imprimir su contenido (la clave pública Wire Guard del servidor e información DERP) como JSON, sin conectarse 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 un token corto (que referencia una región DERP por ID, requiriendo que los clientes obtengan el mapa DERP) en uno más largo autocontenido con la información del servidor DERP incrustada...