RepoDaily · 2026-08-30 · Dataset / Public directory

tailcat:去掉控制平面的 Tailscale,用一次性令牌跑 netcat

#6 Dataset / Public directory Go +790 tailscale/tailcat 打开仓库

Tailscale 把自家控制平面整个拆掉:tailcat 用一次性令牌引导 WireGuard 隧道,在两台机器间传输标准输入输出、端口和 SSH,本趋势周期收获 790 星,排名第 6。

项目类型Dataset / Public directory
最适合装不了 VPN 客户端、也不便开账号时,两台机器之间的临时加密管道:stdio 转发、临时端口暴露、一次性 shell。
风险等级中等——实验性混搭版本,依赖预发布版 tailscale.com 快照;持有令牌即等于持有全部权限。
评估时间两台机器约 10 分钟

核心问题: 对于你要连接的两台机器,一个完全可信的带外令牌,是否真的比整套控制平面更合适?

88/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 88/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
100证据质量

包含 4 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

93可安装/可试用性

检测到 6 个工作流步骤、4 个下一步动作,以及 2 个命令/安装信号。

66维护可信度

趋势热度为 +790 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

96生产准备度

采纳风险标记为 medium,并包含 6 条安全说明与 5 条跳过条件。

100差异化

3 个机会视角、5 个替代方案,以及 3 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

54Agent / AI 适配度

文章正文和元数据中检测到 1 个 AI/Agent 相关信号。

项目概览

tailcat 是 Tailscale 用自家开源组件拼出的混搭作品:行为像 netcat,但跑在 Tailscale 的数据面上,并且完全不碰它的控制面。README 里那句「Tailscale without Tailscale, by Tailscale」是理解它的钥匙——magicsock(内部代号)提供点对点 WireGuard 加密隧道,DERP 既当 NAT 打洞的通信旁路信道,也在打洞失败时作为最终兜底中继;而所有连接元数据改由带外方式交换,想用什么渠道传都行。被刻意删掉的,正是那台协调服务器。

用法上是一场两方握手。CLI 位于 cmd/tailcat,底层是可导入的 Go 库(github.com/tailscale/tailcat,已收录在 pkg.go.dev)。一侧运行 tailcat 服务端并拿到一个短连接令牌;另一侧把令牌交给客户端即可连上,全程端到端 WireGuard 加密。初始连接经由 DERP 服务器引导,随后 magicsock 尝试 NAT 穿透,「可能的话(通常!)」升级为直连 UDP。不需要 Tailscale 账号,不需要 root/管理员权限,不改路由表、不动 DNS——纯用户态库加 CLI 工具。

许可证为 BSD 3-Clause(Copyright (c) 2020 Tailscale Inc & contributors),把它嵌进自己的工具链没有障碍。默认 DERP 地图指向 https://tailcat.dev/derpmap.json(免费、限速),也可以按 README 的链接用 tailscale/tailscale 仓库里的 cmd/derper 自建中继。另有实验性浏览器演示(地址 tailscale.github.io/tailcat,tailcat 编译为 WebAssembly),可与 CLI 互传文件和文本;但在 issue #4 的 WebRTC 支持落地前,浏览器流量只走 DERP。全部内容一经公开便在本趋势周期拿下 790 星、排名第 6。

解决什么问题

  • 跨网络跑裸 netcat,要么把 TCP 暴露到公网,要么先搭一条 VPN。
  • 完整版 Tailscale 解决了加密,却要求账号、协调服务器和一套 tailnet。
  • 取日志、临时暴露一个开发端口、要个五分钟 shell——这类一次性任务撑不起 VPN 的搭建与密钥分发成本。
  • NAT 和 CGNAT 让机器直连天然不可靠,必须有中继兜底。
  • 想在自己的 Go 程序里嵌入加密网格传输,过去等于硬啃 Tailscale 内部代码,而不是导入一个库。

工作原理

  1. 两台机器各自安装:go install github.com/tailscale/tailcat/cmd/tailcat@latest,或 nix run github:tailscale/tailcat / nix profile install github:tailscale/tailcat。
  2. 在机器 A 上直接运行 tailcat。它会选择一个引导用 DERP 中继(README 示例显示区域 302,旧金山),并打印出一个临时地址,例如 tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu。
  3. 把这个令牌带外送达——聊天、邮件,任何你已信任的渠道。这次人工交接,就是替代 Tailscale 控制平面的东西。
  4. 在机器 B 上运行 tailcat <token>,两机之间的 stdin/stdout 即被打通(echo hello | tailcat <token> 会在服务端输出 hello),全程端到端 WireGuard 加密。
  5. magicsock 尝试 NAT 穿透,可能的话升级为直连 UDP,DERP 始终是最后兜底。tailcat ping --until-direct 会报告每个 pong 走的路径,例如 pong in 42.1ms via DERP(sfo)。
  6. stdio 之外:--serve=8080,8443(或 --serve=all)把本地 TCP 端口经隧道暴露出去;--serve=no-auth-ssh 配合 tailcat ssh <token> [命令] 则可在 Linux/macOS 上提供无需密钥的 shell。

命令面:来自 README 的完整接口

  • 无参数运行 tailcat:启动监听、打印临时地址、阻塞等待客户端。
  • tailcat <token>:连接对端,在两机之间打通 stdin/stdout。
  • tailcat --serve=8080,8443 或 --serve=all:转发本地 TCP 端口;客户端用 tailcat tcXXXXXXXXX 8080 拨入,可在隧道里直接跑原始 HTTP。
  • tailcat --serve=no-auth-ssh(Linux/macOS)配合 tailcat ssh tcXXXXXXXXX 或 tailcat ssh tcXXXXXXXXX ls -la;若要真认证,README 建议改用 tailcat --serve=22 代理到系统 SSH 服务。
  • tailcat ping --until-direct <token>:每个 pong 报告走的是 DERP 还是直连(示例输出:pong in 42.1ms via DERP(sfo));--timeout 默认 10 秒,找不到直连路径时以非零码退出。
  • README 记录的安装途径:go install github.com/tailscale/tailcat/cmd/tailcat@latest、nix run github:tailscale/tailcat、nix profile install github:tailscale/tailcat。

架构拆解:混搭版保留了 Tailscale 的哪些部分

  • 保留的数据面:magicsock 的用户态 WireGuard 栈、点对点加密隧道、DERP(既是 NAT 打洞旁路信道,也是最后兜底中继)。
  • 删掉的控制面:没有协调服务器、没有 tailnet、没有节点注册表——连接元数据随令牌带外传递。
  • 库与 CLI 分离:CLI 在 cmd/tailcat;库可按 github.com/tailscale/tailcat 导入,并有 pkg.go.dev 文档。
  • 纯用户态:不需要 root/管理员,不改路由表和 DNS;go.mod 依赖 gvisor.dev/gvisor,与用户态网络栈承担隧道处理的判断一致。
  • 中继配置:默认 DERP 地图是 https://tailcat.dev/derpmap.json(免费、限速);README 链接到 tailscale/tailscale 的 cmd/derper 用于自建中继。
  • 浏览器演示:tailcat 编译为 WebAssembly,部署在 tailscale.github.io/tailcat,可与 CLI 互操作;在 issue #4 的 WebRTC 支持落地前,浏览器流量仅走 DERP、无法直连。

维护风险:依赖它之前先看 go.mod

  • 硬依赖 tailscale.com v1.101.0-pre.0.20260720143344-246c82a658b3——是预发布快照,不是正式打 tag 的版本。
  • go.mod 声明需要 Go 1.26.5;其余锁定项包括 gvisor.dev/gvisor v0.0.0-20260224225140-573d5e7127a8、承担 SSH 路径的 github.com/tailscale/gliderssh,以及 golang.org/x/crypto v0.54.0。
  • README 自己把浏览器 WebAssembly 演示标注为「experimental」,浏览器直连要等 issue #4。
  • 许可证为 BSD 3-Clause(Copyright (c) 2020 Tailscale Inc & contributors)——宽松许可、便于引入,只需常规署名。
  • 默认运行依赖 Tailscale 运营的免费限速 DERP 中继,除非自己部署 derper;源包中尚无发布说明或变更日志。

谁适合关注

适合关注

  • 两台自己掌控、当下就需要加密管道的机器:日志、数据库转储、快速文件搬运。
  • 临时性或锁死的主机:装不了 VPN 客户端、也拿不到 root。
  • 没有公网 IP 时,经 --serve 临时把开发端口穿出 NAT,由客户端持令牌拨入。
  • 令牌分发比密钥分发更省事时,用 tailcat ssh 拿一次性交互 shell。
  • 想让 Go 程序直接内置 WireGuard 加密传输:导入 github.com/tailscale/tailcat 库即可。
  • 在受限网络里,用 WebAssembly 浏览器演示向 CLI 对端传文件或文本。

可以先跳过

  • 长期站点互联——应该用带控制面和 ACL 的完整版 Tailscale。
  • 令牌可能外泄的场景:持有令牌就是全部鉴权,no-auth-ssh 模式下令牌等于 shell。
  • 流量绝不允许经过第三方中继的环境:默认 DERP 地图指向 Tailscale 运营的中继(自建 derper 是缓解办法)。
  • 需要锁定正式版本依赖链的生产服务;go.mod 目前锁定的是 -pre 版 tailscale.com 快照。
  • 要求身份绑定、审计日志、可按用户吊销权限的合规场景。

风险与注意事项

中

加密内核与 Tailscale 正式产品同源,但 tailcat 本身是个年轻的混搭项目:依赖预发布版快照,鉴权模型坍缩为单个共享令牌。

  • go.mod 锁定 tailscale.com v1.101.0-pre.0.20260720143344-246c82a658b3,是预发布快照而非正式版本。
  • --serve=no-auth-ssh 运行无认证 SSH 服务;连接令牌是通往命令执行的唯一关卡。
  • 默认 DERP 地图(https://tailcat.dev/derpmap.json)指向 Tailscale 运营的免费限速中继,其条款可能变化。
  • 浏览器演示被明确标注为实验性;浏览器直连路径要等 issue #4(WebRTC)。
  • 源包中没有发布版或变更日志——成熟度信号来自厂商出品与 790 星,而非版本历史。
  • 全部流量端到端 WireGuard 加密;DERP 中继看到的只是密文,穿透成功后的连接是点对点直连 UDP。
  • 不需要 root/管理员权限,不改路由表和 DNS——用户态 Go 二进制对宿主机的影响面很小。
  • 临时令牌是无记名凭证:谁拿到谁就能连。你为它选的带外传递渠道,本身就是安全边界的一部分。
  • no-auth-ssh 模式下,令牌持有者即可执行命令(tailcat ssh <token> ls -la);README 给出的缓解办法是改用 --serve=22 代理系统 SSH 以获得真认证。
  • 浏览器演示流量仅经 DERP 中继、无直连,直到 issue #4 的 WebRTC 支持落地。
  • 自建 tailscale/tailscale 里的 cmd/derper,即可摆脱对 Tailscale 免费限速中继设施的依赖。

替代方案比较

方案适用场景代价
Tailscale(完整产品)
需要基于身份的持久组网,有 ACL、tailnet 和设备管理,而不是一次性管道。个人使用免费;组织版付费
主要是把一个文件一次性发给对方,需要中继兜底且不想手工传递令牌。开源、免费
netcat(nc)
两台机器已在同一网络或 VPN 内,只缺一条裸 TCP/UDP 管道。免费;多数类 Unix 系统预装
ngrok
需要稳定公网 HTTPS 地址来做演示或收 webhook,而非点对点管道。免费层加商业订阅
SSH + rsync/scp
两端都归你管、密钥分发已解决,且需要久经考验的文件传输工具。免费;系统自带标准工具

这个趋势说明了什么

在 Go 二进制里内置加密传输

库可按 github.com/tailscale/tailcat 导入,而 go.mod 显示重活由 tailscale.com 加 gVisor 承担——程序不必发布 VPN 安装器、不必改宿主路由表,就能获得带 DERP 兜底的 WireGuard 隧道。

写一个两文件的 Go 程序,把本地读取流经 tailcat 库发给对端,再用 tailcat ping --until-direct 确认路径是否从 DERP(sfo) 升级为直连。

用浏览器投递取代远程协助传文件

tailscale.github.io/tailcat 的 WebAssembly 演示已能向 CLI 对端发送文件和文本;让非技术用户打开一个网页,比带着他配 SSH 密钥省事得多。

一台机器打开演示页,另一台跑 tailcat 服务端,传输一个 100 MB 文件,并记录在 issue #4 落地前全程走中继时的吞吐。

把自建中继当作信任边界

默认 DERP 地图是 https://tailcat.dev/derpmap.json,README 链接到 cmd/derper 供自建中继,可让全部引导流量留在你能审计的基础设施内。

在一台主机上部署 derper,用自定义 DERP 地图让两端都指向它,再用 tailcat ping --until-direct 验证直连升级。

下一步建议

做一次五分钟的两机管道实验

整个设计可以压缩成一个实验:两台主机各装一份,经可信渠道交换令牌,然后观察传输从走中继升级为直连。

  1. 机器 A:go install github.com/tailscale/tailcat/cmd/tailcat@latest,运行 tailcat 并复制打印出的临时地址。
  2. 通过你已信任的渠道(现有聊天、签名邮件)把令牌发给机器 B。
  3. 机器 B 运行 echo hello | tailcat <token>,确认 A 的 stdout 出现 hello。
  4. 运行 tailcat ping --until-direct <token>,记录 pong 显示 via DERP(sfo) 还是直连;再在严格 NAT 后重复一次,观察仅走中继的表现。

RepoDaily 判断

tailcat 是少见的「厂商亲自删掉自家产品」的混搭之作:Tailscale 的 WireGuard 数据面、netcat 式令牌交换、零账号、零 root。临时加密管道尽管用;但在 go.mod 仍锁定预发布版 tailscale.com 快照期间,别把 no-auth SSH 或任何长期负载托付给它。

信息来源