Tailcat 是 Tailscale 官方开源的一款工具,它复用了 Tailscale 强大的数据平面(基于 WireGuard 的加密通道和 NAT 穿透能力),但完全去除了其控制平面(无需账号、登录或复杂配置)。你可以把它看作一个加密的、能打洞的 netcat。它非常适合临时连接、远程调试、安全文件传输等场景。

本教程将带你全面了解并部署 Tailcat。

1. 核心概念与原理

  • Tailcat 地址 (Token):这是核心凭证,包含了服务器的 WireGuard 公钥、预共享密钥和 DERP 中继信息。它是一次性的(默认)或可持久化的。请务必像对待密码一样妥善保管此地址,因为拥有它就意味着能够建立连接。
  • 数据平面与控制平面:传统 Tailscale 需要一个中心化的控制服务器来协调节点和分发密钥。Tailcat 省去了这一步,所有必要的连接元数据都通过 Tailcat 地址“带外”交换,实现了去中心化。
  • 连接流程:服务器启动后生成地址,客户端通过该地址,借助 DERP 中继服务器完成初始信令交换和 NAT 穿透。成功后会升级为点对点(P2P)直连,如果打洞失败,流量会回退到 DERP 中继,确保连接始终可用。

2. 准备工作

  • 操作系统:Linux、macOS、Windows。
  • 网络环境:无需公网 IP,机器只要能联网即可。

3. 安装 Tailcat

官方提供了多种安装方式,这里介绍最通用的几种:

方法一:使用 Go 安装 (推荐)

这是最直接的方式,前提是系统已安装 Go 1.21 或更高版本。

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

安装后,tailcat 可执行文件通常位于 $GOPATH/bin~/go/bin 目录下,请确保该目录已添加到系统的 PATH 环境变量中。

方法二:使用 Nix (NixOS 或已安装 Nix 的系统)

可以直接运行,无需安装:

1
nix run github:tailscale/tailcat

或者安装到用户 profile:

1
nix profile install github:tailscale/tailcat

方法三:使用 Docker

适合容器化环境或不想在主机安装的场景:

1
2
docker pull ghcr.io/tailscale/tailcat:latest
docker run --rm -it ghcr.io/tailscale/tailcat:latest

4. 基础用法:点对点数据传输

步骤 1:在服务端启动监听

在需要被访问的机器上,直接运行 tailcat 命令:

1
tailcat

你会看到类似如下的输出:

1
2
# Selected bootstrap relay region 302, San Francisco
# 🐈 Server listening with new address: tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu

程序会挂起等待连接。请复制 tc... 开头的完整地址

步骤 2:在客户端发送数据

在另一台机器上,使用 echocat 将数据通过管道传递给 tailcat 命令,后面跟上刚才复制的地址:

1
echo "Hello, Tailcat!" | tailcat tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu

步骤 3:查看结果

此时,服务端的终端会接收到并打印出 Hello, Tailcat!,然后连接关闭。这是一个最基础的双向管道,你也可以将标准输入重定向到文件来实现文件传输。

5. 高级用法:暴露本地端口

tailcat 可以将远程机器上的端口映射到本地,让你访问远程服务就像访问本地一样。

服务端:暴露服务

假设你想在服务端暴露 8080 端口上的 Web 服务:

1
tailcat serve 8080

或者暴露多个端口:

1
tailcat serve 8080,8443

服务端会生成一个 Tailcat 地址。

客户端:连接并转发

在客户端,使用 forward 子命令将远程端口映射到本地。例如,将远程的 8080 端口映射到本地的 18080 端口:

1
tailcat forward <服务端地址> 18080:8080

现在,你在本地浏览器访问 http://127.0.0.1:18080,实际上就是通过加密隧道访问远程机器的 8080 端口服务。

6. SSH 远程访问

Tailcat 内置了 SSH 服务,让你可以不用在远程机器上配置和暴露 SSH 端口,即可安全连接。

服务端:启动无认证 SSH 服务

在远程机器(服务端)上,使用 no-auth-ssh 参数启动服务。注意:此模式下,Tailcat 地址本身就是唯一的凭证,获得地址的人即可获得 Shell 访问权限,务必通过安全渠道分享。

1
tailcat serve no-auth-ssh

客户端:使用 SSH 连接

在本地机器上,使用 ssh 子命令并传入服务端的 Tailcat 地址即可建立连接:

1
tailcat ssh <服务端地址>

你也可以直接执行远程命令:

1
tailcat ssh <服务端地址> ls -la

进阶:配置 ~/.ssh/config 以获得原生体验
你可以在本地 ~/.ssh/config 文件中添加如下配置,这样就可以使用 ssh grokbot 命令直接连接,而无需每次都输入长地址:

1
2
Host grokbot
ProxyCommand tailcat <你的持久化Tailcat地址> 22

7. 高级配置:持久化密钥与客户端认证

默认情况下,每次运行 tailcat serve 都会生成一个临时的、一次性密钥对。如果需要地址保持不变(例如用于 DNS 发布),可以使用持久化密钥。

生成持久化服务器密钥

1
tailcat genkey --fixed-region
  • --fixed-region 会探测并固定最优的 DERP 中继区域,确保地址长期有效。
  • 密钥默认保存在 ~/.config/tailcat/keys/default.private.json
  • 之后直接运行 tailcat serve 就会自动使用这个持久化密钥和地址。

生成客户端密钥并启用服务端认证

如果你需要更严格的安全控制,可以生成一个客户端密钥,并在服务端设置允许列表,只有持有该密钥的客户端才能连接。

  1. 在客户端,生成一个专用的客户端密钥对:

    1
    tailcat genkey --client

    命令会输出该客户端的公钥,类似:nodekey:cfb6bf...ddfd16

  2. 在服务端,启动服务时通过 --allow 参数指定允许连接的客户端公钥:

    1
    tailcat serve --allow=nodekey:cfb6bf...ddfd16 22

    这样,即使有人截获了你的 Tailcat 地址,如果没有对应的私钥,也无法建立连接。

8. 故障排查与优化

  • 检查连接路径:使用 ping 子命令测试连通性,它会显示数据包是经由 DERP 中继还是 P2P 直连,以及延迟信息。

    1
    tailcat ping <服务端地址>
  • 自建 DERP 中继:如果你不满足于 Tailscale 提供的公共 DERP 中继(可能因位于海外导致延迟高),可以自行搭建。这需要在你的云服务器上部署 derper 服务并配置好域名和 TLS 证书。之后,在生成 Tailcat 地址时指定你自己的 DERP 服务器:

    1
    tailcat genkey --region=derp.yourdomain.com

    这样生成的地址将只使用你的私有中继,流量全程可控。


总结

场景 服务端命令 客户端命令
简单数据传输 tailcat `echo “data”
暴露 Web 服务 tailcat serve 8080 tailcat forward <地址> 18080:8080
无认证 SSH tailcat serve no-auth-ssh tailcat ssh <地址>
带认证 SSH tailcat serve --allow=nodekey:... 22 tailcat ssh <地址>
测试连通性 - tailcat ping <地址>
生成持久化地址 tailcat genkey --fixed-region tailcat genkey --client

Tailcat 提供了一种极其轻量、安全且灵活的方式来建立跨网络的点对点加密连接。希望这份指南能帮助你快速上手这个强大的工具。