Tailcat

"Tailscale without Tailscale, by Tailscale"

Tailcat

Tailcat 是一个基于 Tailscale 开源组件重构的工具,其功能类似于 netcat,但运行在 Tailscale 的数据平面上,且无需依赖 Tailscale 控制平面。Tailscale 的数据平面(内部称为magicsock)通过 WireGuard® 加密的点对点隧道连接两台机器,利用 DERP 作为 NAT 穿透的通信旁路通道,并在 NAT 穿越失败时充当最终备用中继。与使用 Tailscale 控制平面不同,所有 tailcat 连接元数据都通过带外方式交换,具体方式完全由用户决定。

tailcat 命令行工具(位于 cmd/tailcat)构建于 tailcat Go 库之上(可通过 github.com/tailscale/tailcat 导入)。

无论您将 tailcat 作为 CLI 工具还是库使用,其中一方需运行 tailcat 服务端(监听器)并获取一个简短的连接令牌。另一方将该令牌传递给 tailcat 客户端以建立连接。双方之间的所有流量都通过 WireGuard 进行端到端加密。初始连接通过 DERP 服务器引导(见下文),随后 magicsock 会尝试进行 NAT 穿透,在条件允许时(通常都能成功!)升级为直接的点对点 UDP 连接。

您无需 Tailscale 账户,也无需机器上的 root/管理员权限(它不会修改机器的路由表、DNS 等设置)。这只是一个用户态库和 CLI 工具。

并且它是完全开源的。

您可以使用我们免费的限速 DERP 中继(默认 DERP 映射为 https://tailcat.dev/derpmap.json),也可以[自行搭建](https://github.com/tailscale/tailscale/tree/main/cmd/derper#derp)。

我们还提供了一个实验性的浏览器内 Web 演示(将 tailcat 编译为 WebAssembly),地址为 https://tailscale.github.io/tailcat/,可与 CLI 工具互操作来发送接收文件或文本。浏览器流量仅通过 DERP 中继,在实现 WebRTC 支持前(#4)无法建立直接连接。

安装

$ go install github.com/tailscale/tailcat/cmd/tailcat@latest

若使用 Nix flakes,可直接运行或安装:

$ nix run github:tailscale/tailcat
$ nix profile install github:tailscale/tailcat

使用指南

在两台机器间传输 stdin/stdout 数据

服务端启动后会打印临时地址:

$ tailcat
# 已选择引导中继区域 302,旧金山
# 🐈 服务端正在监听新地址:tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
(挂起等待中...)

客户端可执行:

$ echo hello | tailcat tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
$ 

此时服务端解除阻塞:

$ tailcat
# 已选择引导中继区域 302,旧金山
# 🐈 服务端正在监听新地址:tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
hello
$

通过隧道暴露本地端口

您还可以转发本地 TCP 端口到 localhost:

$ tailcat --serve=8080,8443 # 或 --serve=all
# 🐈 服务端正在监听新地址:tcXXXXXXXXX

客户端操作:

$ tailcat tcXXXXXXXXX 8080
GET / HTTP/1.1
Host: foo
 
HTTP/1.1 200 OK
....

免认证 SSH 服务端

在 Linux 和 macOS 上,您还可以运行免认证的 SSH 服务端。(如需认证,可直接使用 tailcat --serve=22 代理到系统 SSH 服务端)

$ tailcat --serve=no-auth-ssh
# 🐈 服务端正在监听新地址:tcXXXXXXXXX

客户端操作:

$ tailcat ssh tcXXXXXXXXX
$ tailcat ssh tcXXXXXXXXX ls -la

其他命令

使用 ping 测试连通性;每个 pong 响应会报告是通过 DERP 中继还是直接路径到达。--until-direct 会持续 ping(最长 --timeout 时间,默认 10 秒)直到建立直接路径,若未成功则以非零状态退出:

$ tailcat ping --until-direct <令牌>
pong 42.1ms 经由 DERP(sfo)
pong