# 不用账号也能打通加密隧道吗，我把 Tailcat 编译了一遍

8 月 30 日下午，我重新打开 GitHub Trending 全球 Today。前面三名很熟，Archify、God’s Eye View、Scientific Agent Skills 都已经在实验田完整走过。按我们定下的去重规则，今天顺延到第 4 名 Tailcat。

这个项目出自 Tailscale。官方给它的解释很直接，它像 netcat，又把传输放到了 Tailscale 的数据平面上。两边不用登录 Tailscale 账号，也不用让机器加入同一个 tailnet。服务端运行以后会得到一段连接令牌，客户端拿到这段令牌就能尝试连接。数据经过 WireGuard 加密，网络条件允许时会升级成点对点 UDP 直连，打洞失败则通过 DERP 中继。

这套办法让人感兴趣的地方在门槛。它不改系统路由表，不碰 DNS，也不要求 root 或管理员权限。官方提供的限速 DERP 中继可以直接用，用户也能部署自己的中继。CLI 支持标准输入输出、端口转发、SSH、SOCKS5 和 exit node。浏览器里还有一份实验性的 WebAssembly 演示。

我先照官方仓库走。源码克隆成功，下一条命令就停了。当前容器根本没有 Go，终端只返回一句 `go: command not found`。这个项目的 `go.mod` 要求 Go 1.26.5，我没有拿旧版本硬编，也没有把系统环境改掉。我从 Go 官方下载 Linux amd64 压缩包，按官网给出的 SHA-256 做了校验，文件一致以后才解压到实验目录。

依赖下载完，我跑了完整测试集。这一次没有全绿。根包里的四组集成测试都在读取路由信息时遇到 `netlinkrib: operation not permitted`。CLI 包里的 Pipe 和 SOCKS 客户端测试也没拿到服务端地址，后面触发了空指针。问题落在容器网络权限和自动区域探测这条路径上。这个环境不具备 Tailcat 完整连接需要的条件，双端传输到这里没有跑通。

我没有把实验停在一行报错上。项目仍有很多不需要特权路由信息的核心逻辑，可以单独核验。

CLI 编译成功，版本是 v0.2.0，Linux amd64 文件为 30,393,371 字节。随后我运行了连接令牌编解码、畸形公钥拒绝、DERP map 内存缓存、网络字段、SOCKS 地址分类、SSH 目标解析、监听地址规范化和 Web demo handler 等 11 组顶层测试，全部通过。

下一步是生成一件能留下来的成果。我给实验指定了一个自定义 DERP 主机名，让 Tailcat 生成服务端密钥和连接令牌，再用它自己的 `parse` 子命令解析。JSON 结果里有一枚 WireGuard 公钥，也有 `derp.example.com` 这项中继信息。客户端公钥也生成成功，两组密钥能被 CLI 列出来。

这里有个必须说清的边界。令牌和公钥可以公开，私钥不行。收成包只带公开令牌、解析结果和客户端公钥，隔离目录里的两份私钥没有复制出去。这个边界比做出一张成功截图更要紧。有人拿到固定服务端私钥，后续连接关系就会发生变化。

所以今天能落下的结论很具体。Tailcat 的源码能在 Go 1.26.5 下编译，CLI 能生成并解析连接令牌，一组核心逻辑和 Web demo 测试也能通过。完整的两台设备传输仍然没有完成，原因是当前容器禁止所需的 netlink 路由访问。文字、文件、端口、SSH 和 SOCKS5 都不能写成已经验证。

下一次复测不需要继续折腾这个容器。找两台普通电脑，或者一台电脑加一台云主机。一边启动 Tailcat 服务端，把一次性令牌传给另一边，先传一段带校验值的文字，再传文件，最后测试端口和 SSH。日志里同时记录 DERP 中继与直连升级，测出延迟和吞吐。这样才能回答普通人最关心的问题，它在真实网络里到底有多快，又会在哪种 NAT 条件下退回中继。

Tailcat 今天已经从一条 Trending 介绍变成了一份可复现记录。成功的地方有文件、有日志、有哈希。失败的地方也有明确错误。等真实双端条件具备，再把最后一段补上。

## 关键来源

- [Tailcat 官方仓库](https://github.com/tailscale/tailcat)
- [GitHub Trending 全球 Today](https://github.com/trending?since=daily)
- [Tailscale 官方 X 账号](https://x.com/Tailscale)

