Tailcat:没有 Tailscale 的 Tailscale,由 Tailscale 提供
今天,我们发布了 tailcat,这是 Tailscale 中一些组件的重混合,让您可以在没有 Tailscale 控制平面的情况下使用开源的 Tailscale 数据平面(WireGuard® + NAT 穿越 + DERP),由创建 Tailscale 的人编写。它是没有 Tailscale 的 Tailscale,由 Tailscale 提供。具体来说,tailcat 是一个开源的 Go 包和一个使用该包的 CLI 工具。它让您运行一个服务器端的监听程序和一个客户端以连接该服务器,双向移动字节。也就是说,它像 netcat,但通过 Tailscale 的 magicsock(WireGuard 加密 + NAT 穿越 + DERP 汇聚/回退中继)流动。值得注意的是,tailcat 具有:没有 IP 地址,没有帐户(没有登录,没有密码,没有 SSO),没有控制平面,没有用户,没有管理员,没有管理控制,没有 root 或管理员操作系统访问要求,没有与 Tailscale 公司之间的关系或依赖(至少如果您运行自己的 cmd/derper DERP 服务器)。“Tailscale”到底意味着什么?当您看到人们在线上相互描述 Tailscale 时,您会看到非常不同的解释。一个群体的人,常常会说 “我只是自己运行 WireGuard”,专注于 WireGuard 部分,而不考虑(或关心)像 NAT 穿越、DERP 回退、集中管理的防火墙(ACL)规则、SSO 登录、标签、MDM 政策、审核日志等部分。也许他们只想要或需要在公共 IP 上使用 WireGuard 部分。这没关系。另一群人则更多地讨论公司、企业结构、长期生存能力、创始人、融资阶段、定价、认证、可靠性、安全披露的负责任处理等。还有一群人讨论 Tailscale 是否是开源的。作为提醒:我们的核心是开源(有真正的 OSI 批准许可证!),我们的 DERP 服务器是开源的,而我们的客户端在本身开放源代码的平台上也是开源的:Linux 和 Android。我们的服务器端控制平面不是。这个听众中的许多人欣赏 Headscale(我们喜欢并部分资助开发)存在,无论是今天使用,还是作为未来的后备计划。所有这些解释都是可以的。无论您是在使用我们官方控制平面的官方 GUI 客户端封装,带有企业 SSO 身份提供者,还是在另一极端,仅在 Linux 节点上使用 tsnet 对抗您自托管的 Headscale 服务器,还有许多方法可以将 Tailscale 及其许多组件连接和使用:它的 WireGuard + NAT 穿越 + DERP 回退数据平面;它的控制平面;它的公司(支付我们为您运行和支持的事务);它的开源代码。tailcat 为您提供了另一种使用 Tailscale 子集的方法。它是如何工作的。假设您想运行一个 tailcat 服务器。它的工作如下:生成一个密钥对(临时或命名并重复使用)选择一个 DERP 服务器(您指定的,或自动选择的带宽限制的 Tailscale 运行的服务器)生成一个 tailcat 地址,它是一个形式为:tc + base64(CBOR(公钥 + DERP 启动信息)) 的字符串。然后您可以在带外与某人共享该地址字符串,直接或通过将其放在 DNS TXT 记录中,并将该 DNS 主机名带外共享。客户端部分大致相同:选择一个密钥(临时或本地命名并重复使用),连接到在 tailcat 地址中指定的汇聚 DERP 服务器,向服务器的公钥发送 MEOW 消息以将您添加到 netmap。此时,如果服务器愿意接受该客户端的公钥(可以选择锁定),那么它会回复一个快乐的 MEOW 回复。然后客户端继续使用嵌入的用户空间 TCP 栈通过 WireGuard 与另一端建立 TCP 连接。有实际的 IP 地址在传输中(由您的公钥派生的 IPv6 地址),但这些永远不会对用户可见。您的操作系统从未在 TCP 层参与,也从未看到合成的 tailcat IP。您的操作系统所做的只是发送 DERP TCP 消息和/或 NAT 打孔的 UDP WireGuard 消息。因为它通过 Tailscale 的 magicsock 数据平面运行,NAT 穿越会自动启动并尝试获得直接连接,因此数据传输(WireGuard UDP 数据包)最终会直接在客户端和服务器之间进行,而不涉及 DERP 中继。但如果双方都在没有任何端口映射服务可用的硬 NAT 后面,数据包将通过 DERP 作为后备中继。如果您使用 Tailscale 托管的 DERP 服务器,这些是有限速的(带宽对我们来说是有成本的)。但如果您运行自己的 DERP 服务器,您可以控制任何限速。在未在 tailcat 服务器上指定端口号的默认模式下,默认是将接收到的数据管道传递到服务器的 stdout,像 netcat 一样。但它也可以在客户端模式下运行,其中运行一个在临时本地端口上的 SOCKS 服务器,然后运行一个提供的子进程(例如 curl 或其他)与环境变量一起。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡