ByteNoteByteNote
不注册不开端口,tailcat 一条地址打通两台机器
字

字节笔记本

2026年11月1日 · 约 7 分钟读完

不注册不开端口,tailcat 一条地址打通两台机器

API中转
¥120

2026 年 8 月的 TailscaleUp 大会上,Tailscale 把一个内部玩了快三年的小工具开源了:tailcat,口号是 "Tailscale without Tailscale, by Tailscale"。它像 netcat,但流量走 Tailscale 的数据平面(WireGuard 加密、DERP 中继、NAT 打洞),完全绕开 Tailscale 的控制平面。项目用 Go 写成,BSD-3 协议,目前 8.7k stars、398 forks,最新版本 v0.7.0 发布于 2026 年 9 月 20 日。

tailcat 仓库卡

一句话概括它的用法:一台机器跑 tailcat,得到一条形如 tcXXXX... 的一次性地址;另一台机器拿着这条地址连过来,两者之间就是端到端加密的点对点隧道。地址怎么交给对方?随便你:聊天软件、邮件、口头念一遍都行,元数据交换完全带外完成。

它解决什么问题

两台各自躲在 NAT 后面的机器想互通,传统做法要么公网 IP 加开端口,要么上 VPN。Tailscale 已经把这事做得很顺,但代价是注册账号、加入 tailnet。tailcat 把这些全免了:

  • 不需要 Tailscale 账号,不依赖控制平面;
  • 不需要 root:纯用户态实现,不改路由表、不动 DNS;
  • 不开放任何入站端口:连接先经 DERP 中继引导,再由 magicsock 做 NAT 打洞,多数情况能升级为直连 UDP。

最 netcat 的用法是拿它当加密管道:

sh
# 服务端:打印一次性地址后挂起等待
$ tailcat
# 🐈 Server listening with new address: tcomFwWC...

# 客户端:一条命令把 stdin 送过去
$ echo hello | tailcat tcomFwWC...

从管道到一整套工具箱

真正让它不像玩具的,是 serve 子命令族攒出来的一堆场景。

端口暴露与转发:tailcat serve 8080,8443 把本地端口经隧道暴露出去;客户端 tailcat forward tcXXXX 18080:8080 把远端端口变成本地端口,tailcat browse tcXXXX 直接开浏览器访问。映射还能指向别的机器,例如 tailcat serve 5555:10.2.200.213:5555 把局域网里 Android 设备的 adb 端口代理出来,又不至于像 exit-node 那样暴露整个网络。

SSH:内置 SSH 服务端,公钥来源可以是本地 authorized_keys、字面公钥行,甚至 GitHub 账号:

sh
$ tailcat serve --ssh-authorized-keys=bradfitz@github,./contractor.pub ssh
$ tailcat ssh tcXXXX ls -la

文件收发:tailcat recv ~/inbox 起一个只写收件箱,对方 tailcat cp report.pdf tcXXXX: 投递,发件方不能列目录也不能读回;tailcat serve files 则共享目录,客户端 tailcat ls、tailcat cp 直接取文件。文件服务原生说 SFTP,服务端用 Go 的 os.Root 把路径锁死在共享目录内,.. 和符号链接都逃不出去。

此外还有 inetd 式的 serve exec(每连接跑一个命令)、iperf 式的 perf 测速(拒绝经共享 DERP 跑吞吐测试,免得测的其实是人家限速器)、SOCKS5 代理和 exit-node 模式。安装渠道相当全:静态二进制、Homebrew、.deb/.rpm、Snap、Nix、AUR、conda-forge、容器镜像都有,甚至还有一个编译成 WebAssembly 的浏览器 demo,能和 CLI 互传文件。

和 Tailscale 什么关系

tailscale 仓库卡

tailcat 不是 fork,而是 tailscale.com 仓库的普通 Go module 客户端,直接复用后者的三件套:用户态 WireGuard(不碰 TUN 设备,所以不需要 root)、负责 STUN 端点发现和 UDP 打洞的 magicsock、在进程内终结 TCP 的 gVisor Netstack。Tailscale 提供免费限速的公共 DERP 中继(默认地图在 tailcat.dev/derpmap.json),不想用可以自己跑 derper,中继主机名会直接编进 tailcat 地址里,客户端不再碰 Tailscale 的任何服务。

这个项目 2023 年 9 月就存在了,原名 derpcat,最早一版是作者在一趟美联航航班上看烂片时写下的,commit message 里还留着 "UA 605 PDX-ORD en route to Ireland"。之后它跟着 Tailscale 内部重构烂尾了几次,直到 2026 年 8 月才翻新并开源。

安全模型值得细看

一条 tailcat 地址是 tc 前缀加 base64 编码的 CBOR,里面装着服务端 WireGuard 公钥、一把独立的路径发现公钥,以及默认开启的预共享密钥。这把预共享密钥提供后量子保护:即使 DERP 运营方同时看到双方的公钥,也拼不进这条隧道。

这也意味着地址本身就是凭证。默认每次运行生成临时密钥,进程退出地址即作废,是安全的默认值;tailcat genkey 可以固化密钥让地址跨重启稳定,代价是任何曾拿到地址的人都能连回来,需要配合 tailcat serve --allow 做客户端白名单。地址还能发布成 DNS TXT 记录("tailcat=tc..."),之后直接用域名当地址用;但文档反复警告 TXT 是公开可扫描的,发布的前提是服务端自己做了认证(--allow 或 --ssh-authorized-keys),否则等于把机器拱手送人。tailcat ssh 连 DNS 目标前甚至会先匿名探一次,发现这种配置失误会拒绝连接并说明原因。

适用场景很清晰:给远端同事临时开个端口、帮家人处理电脑问题、从 NAT 后面的机器拉文件、两台云主机之间测真实带宽。需要留意的是项目明说不承诺 API 和 CLI 稳定性,公共中继也没有 SLA;当趁手的临时兵器没问题,进生产环境前要想清楚。

相关文章

分享: