2026年8月29日 Technical Release

Tailcat 深度实战教程:在 NAT VPS 与容器中实现免 Root、免账号的零配置 P2P 内网穿透

"全面解析 Tailscale 官方最新开源利器 Tailcat(tailscale/tailcat)。无需 Tailscale 账号、无需 /dev/net/tun 内核权限、无需公网端口转发,在 NAT VPS、LXC/Docker 容器及多层局域网中实现端到端 WireGuard 加密通信、P2P 自动打洞与安全 SSH 远程管理。"

如果你使用过 NAT VPS(如独角鲸云的共享 IP 实例、LXC 容器、Docker 容器或家庭内网服务器),你一定遇到过这些令人头疼的痛点:

  1. 没有独立公网 IPv4:所有外部访问都依赖宿主机的端口转发映射,端口号受限(必须 $\ge 1024$),数量有限且经常需要手动配置;
  2. 缺乏内核 TUN 设备权限:在轻量级容器(LXC/OpenVZ/Docker)中,宿主机往往未开放 /dev/net/tun 权限,导致标准 WireGuard、OpenVPN 等无法启动;
  3. 传统 VPN / Tailscale 配置繁琐:需要注册中心账号、生成 Auth Key、管理设备配额、登录 Tailnet,对于临时调试或跨团队协作来说过于繁重;
  4. 中转工具依赖固定公网服务器:如 FRP、NPS 等工具必须依赖一台拥有独立公网 IP 的云服务器作为中心中继,无法实现去中心化的点对点(P2P)高速直连。

Tailscale 官方开源的项目——Tailcat (tailscale/tailcat),被官方形象地称为 “Tailscale without Tailscale, by Tailscale”

本文将为你全面拆解 Tailcat 的底层原理,并手把手带你在 NAT VPS 及容器环境中完成安装、SSH 免端口直连、服务穿透、域名绑定、文件流传输与自建 DERP 加速等完整实战!


🧭 什么是 Tailcat?它为什么是 NAT 穿透的终极利器?

简单来说,Tailcat 是一个在 Tailscale 数据平面上运行的现代版 netcat 工具,但它彻底摒弃了 Tailscale 的控制平面(Control Plane)。

┌─────────────────────────────────────────────────────────────────┐
│                           Tailcat 架构                           │
├───────────────────────────────┬─────────────────────────────────┤
│       Tailscale 数据平面      │         Tailcat 特性           │
├───────────────────────────────┼─────────────────────────────────┤
│ • WireGuard (端到端强加密)     │ • 零账号、零登录、无中心控制台    │
│ • magicsock (STUN/ICE 自动打洞)│ • 纯用户空间运行 (无需 Root/TUN) │
│ • gVisor Netstack (用户态网络)│ • 基于 Token 或 DNS TXT 交换信令 │
│ • DERP Relay (全网兜底中继)    │ • 支持单次临时销毁 / 长期持久化   │
└───────────────────────────────┴─────────────────────────────────┘

核心亮点:

  1. 纯用户态网络(Userspace Netstack):Tailcat 基于 gVisor 的网络栈实现,在用户空间内接管 TCP/IP 封包。不需要 Root 权限,不需要 /dev/net/tun 设备,不修改系统的路由表与 DNS
  2. 顶级的 P2P NAT 打洞能力:复用了 Tailscale 历经实战检验的 magicsock 模块。当两台 NAT 节点尝试建立连接时,首先通过最近的 DERP 中继完成信令握手,随后立即尝试 UDP 打洞。打洞成功后直接升级为端到端 P2P 直连,跑满你的物理带宽与最低延迟
  3. DERP 中继无缝兜底:若两端均处于极其严苛的对称型 NAT(Symmetric NAT)导致打洞失败,Tailcat 会自动透明降级为 DERP 加密中继传输,连接绝不会中断。
  4. 开箱即用,免注册认证:不需要注册 Tailscale 账号、不需要配置复杂的 ACL 规则,两台机器之间只需复制一段 tc... 开头的 Base64 字符串(Connection Token),或者通过一条 DNS TXT 记录即可互联。

🛠️ Tailcat 快速安装

Tailcat 采用 Go 语言开发,编译后为单文件二进制,跨平台支持 Linux (x86_64, arm64, arm)、macOS 和 Windows。

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

如果你的 VPS 或本地电脑已安装 Go 环境(Go 1.22+):

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

编译完成后,二进制文件会自动位于 $GOPATH/bin/tailcat(通常为 ~/go/bin/tailcat)。你可以将其移动到系统路径:

sudo cp $(go env GOPATH)/bin/tailcat /usr/local/bin/

方法 2:源码编译安装

# 克隆仓库
git clone https://github.com/tailscale/tailcat.git
cd tailcat

# 编译二进制文件
go build -o tailcat ./cmd/tailcat

# 安装至系统路径
sudo mv tailcat /usr/local/bin/

方法 3:使用 Nix Flakes(NixOS / 极客用户)

# 直接免安装临时运行
nix run github:tailscale/tailcat

# 或安装到用户 profile
nix profile install github:tailscale/tailcat

验证安装是否成功:

tailcat --help

💡 核心机制:连接令牌(Token)与密钥模型

在开始实战之前,我们先了解 Tailcat 的通信认证机制:

1. 什么是 Connection Token (ConnBlob)?

当 Tailcat 服务端启动时,会输出一个形如 tcom...tc... 的连接令牌。这个令牌经过 CBOR 编码与 Base64 序列化,内部仅包含两项必要信息:

  • 服务端的 WireGuard 临时/固定公钥(Curve25519, 32 字节);
  • 建议的 DERP 中继服务器 ID 或节点地址(用于初期信令对接与打洞协调)。

你可以随时使用 tailcat parse 命令查看任意 Token 内部的明文信息:

tailcat parse <Token>

2. 临时密钥 vs 固定密钥

  • 临时模式(默认,Ephemeral Key):每次启动 tailcat 时,内存中自动生成全新公私钥对,进程退出时私钥销毁。该模式安全性最高,适合临时传文件、排查故障。
  • 固定密钥模式(Saved Key):运行 tailcat genkey 后,会将公私钥保存至 ~/.config/tailcat/keys/default.private.json。后续启动服务将使用固定地址,适合长期后台运行与绑定域名。

🚀 NAT VPS 实战场景大全

下面我们针对 NAT VPS、容器及内网开发中最核心的 7 大场景展开深度实操。


场景 1:无公网端口、免 Root 的 NAT VPS 极速 SSH 直连

在许多 NAT VPS 上,服务商没有分配默认的 22 端口,或者你没有在控制台配置端口映射。借助 Tailcat,你可以在完全不暴露任何公网端口的前提下,安全连接 VPS 的 SSH。

方式 A:临时免密 SSH 调试(内置极简 SSH 服务器)

在 NAT VPS(服务端)运行:

tailcat --serve=no-auth-ssh

终端会输出如下内容并挂起等待连接:

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

在你的本地 Mac / Linux / Windows(客户端)直接运行:

tailcat ssh tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu

你将直接进入 VPS 的交互式终端!调试完毕后,VPS 端 Ctrl + C 退出,该 Token 立即失效,安全性拉满。

方式 B:转发系统真实 SSH 22 端口 + 零信任白名单认证(推荐生产使用)

如果你希望走系统原生的 sshd(支持 PAM、密码验证、公钥免密),并限定仅允许你本人的客户端电脑连接

  1. 第一步:在本地客户端生成客户端身份密钥

    client$ tailcat genkey --client
    # 输出:
    # wrote file to ~/.config/tailcat/keys/client-default.private.json
    # nodekey:cfb6bfa77a0654d7450947fd6acef17d2cd848da1d30b2540b13dac272ddfd16

    复制这个以 nodekey: 开头的公钥字符串。

  2. 第二步:在 NAT VPS 服务端启动 SSH 端口转发并配置白名单

    server$ tailcat --serve=22 --allow=nodekey:cfb6bfa77a0654d7450947fd6acef17d2cd848da1d30b2540b13dac272ddfd16
    # 🐈 Server listening with new address: tcXXXXXXXXX
  3. 第三步:本地客户端通过系统 SSH 客户端直连

    client$ ssh -o "ProxyCommand=tailcat %h 22" tcXXXXXXXXX
    # 或者使用 tailcat 的便捷子命令:
    client$ tailcat ssh tcXXXXXXXXX

🔒 安全机制:此时未经 --allow 授权的任何第三方即使拿到了你的 Token,其 WireGuard 握手也会被服务端在底层直接丢弃,连端口探测都无法进行。


场景 2:将 NAT 内部 Web / API / 数据库多端口暴露穿透

假设你的 NAT VPS 内部运行了 Nginx (8080)、Node.js API (3000) 以及 MySQL 数据库 (3306),且这些服务仅监听了 127.0.0.1

1. 服务端暴露端口

在 NAT VPS 上执行:

# 暴露指定端口
tailcat --serve=8080,3000,3306

# 或者暴露所有端口
tailcat --serve=all

输出 Token:tcWebAndDbServerToken...

2. 客户端直连访问

  • 访问 Web 端口
    tailcat tcWebAndDbServerToken... 8080
  • 结合 SOCKS5 代理无缝访问整个远程网络: Tailcat 提供了强大的内置 SOCKS5 代理功能。在本地运行:
    # 直接将流量经由隧道代理至远程 NAT 实例
    tailcat socks tcWebAndDbServerToken... curl http://localhost:8080/
    tailcat socks tcWebAndDbServerToken... curl http://localhost:3000/api/status
  • 在本地浏览器中使用: 你可以在本地启动一个 SOCKS5 监听进程,配置本地 SwitchyOmega 或系统代理,轻松穿透访问内网 Web 面板(如宝塔、1Panel、Prometheus、Grafana 等)。

场景 3:打造专属永久节点:结合 DNS TXT 记录实现域名直连

每次连接都要复制一大长串 Base64 Token 显然不够优雅。Tailcat 原生支持从 DNS TXT 记录 解析服务器地址!

                      ┌─────────────────────────┐
                      │ Cloudflare / DNS 解析商 │
                      │  TXT: tailcat=tc...     │
                      └────────────┬────────────┘
                                   │ DNS 查询
 ┌───────────────┐                 ▼                 ┌───────────────┐
 │ 本地客户端电脑 │ ─────────────────────────────────▶ │ 远程 NAT VPS  │
 │ tailcat ssh   │      P2P Direct UDP Tunnel        │ tailcat serve │
 │ vps.domain.me │ ◀──────────────────────────────── │  (端口 22)    │
 └───────────────┘                                   └───────────────┘

操作步骤:

  1. 在 NAT VPS 服务端生成固定区域密钥

    server$ tailcat genkey --fixed-region
    # 输出:
    # wrote file to ~/.config/tailcat/keys/default.private.json
    # tcMyFixedVpsToken123456789...

    💡 --fixed-region 会在生成密钥时自动探测并锁定延迟最低的 DERP 中继节点,确保后续重启时区域不变。

  2. 在你的域名 DNS 服务商(如 Cloudflare、DNSPod 等)添加 TXT 记录

    • 主机记录(Name)vps(例如 vps.yourdomain.com
    • 记录类型(Type)TXT
    • 记录值(Value)tailcat=tcMyFixedVpsToken123456789...
    • TTL:自动(Auto)或 300 秒
  3. 在 NAT VPS 服务端以后台形式启动

    server$ tailcat --serve=22 --allow=nodekey:你的本地客户端公钥
  4. 在本地客户端一键连接: 现在,你的本地客户端完全不需要记 Token,直接输入域名即可:

    client$ tailcat ssh vps.yourdomain.com
    client$ tailcat ping vps.yourdomain.com
  5. 配置本地 ~/.ssh/config(极致体验): 在本地客户端编辑 ~/.ssh/config

    Host my-nat-vps
        HostName vps.yourdomain.com
        ProxyCommand tailcat %h 22
        User root

    之后只需在终端输入:

    ssh my-nat-vps

    即可像连接内网机器一样秒级登入 NAT VPS!


场景 4:跨 NAT 极速双向文件传输与流式管道同步

在没有公网端口的机器之间传输大文件或数据库备份,通常需要借助第三方网盘或对象存储。Tailcat 具备类似标准 nc 的管道传输能力。

1. 跨机器拷贝大文件 / 压缩包

  • 接收端(NAT VPS)
    tailcat > backup.tar.gz
    # 输出 Token: tcFileTransferToken...
  • 发送端(本地机器)
    cat backup.tar.gz | tailcat tcFileTransferToken...
    数据将通过 WireGuard 加密隧道以 P2P 全速直接写入目标机器,无任何第三方中转落盘。

2. 远程 MySQL / PostgreSQL 数据库实时流式迁移

  • 目标机器(准备还原数据库)
    tailcat | mysql -u root -p my_database
  • 源机器(导出并直接流式写入)
    mysqldump -u root -p my_database | tailcat <TargetToken>

场景 5:将 NAT VPS 作为出口代理节点(Exit Node)

如果你有一台位于特殊网络环境(例如拥有特定原生 IP、机房内网资源或学术内网)的 NAT VPS,你可以将其一键转换为出口节点。

  1. NAT VPS 服务端启动 Exit Node
    server$ tailcat --serve=exit-node
  2. 客户端本地通过 SOCKS 代理上网
    # 测试出口 IP
    client$ tailcat socks <Token> curl https://ipinfo.io
    所有出口请求都将从 NAT VPS 发出。

场景 6:网络连通性与 P2P 打洞状态实时诊断

如何确认两台 NAT 机器之间是通过 P2P 直连还是走了 DERP 中继?Tailcat 提供了内置的 ping 诊断工具。

在客户端执行:

tailcat ping --until-direct <Token或域>

输出示例:

pong in 42.1ms via DERP(sfo)
pong in 41.8ms via DERP(sfo)
pong in 3.2ms via 103.145.22.88:41641
pong in 3.1ms via 103.145.22.88:41641
  • 分析:前两次 ping 是通过 Tailscale 官方的旧金山 DERP 中继(延迟约 42ms),紧接着 magicsock 完成了 STUN 探测与 UDP 打洞,链路瞬间无缝热升级为直连 UDP(103.145.22.88:41641),延迟直接骤降至 3.1ms

场景 7:自建私有 DERP 中继服务器(国内加速与突破限速)

Tailcat 默认使用 Tailscale 提供的免费公共 DERP 中继网络(默认节点列表见 tailcat.dev/derpmap.json)。公共中继在中转流量时存在带宽与速率限制。

如果你希望获得完全私有、无速率限制且国内低延迟的体验,可以自建 DERP 中继服务器(derper)。

1. 启动你的 DERP 中继

在拥有一台具有独立公网 IP 的服务器上(需配置好 SSL 证书与域名 derp.yourdomain.com),安装并运行 Tailscale 的 derper

go install tailscale.com/cmd/derper@latest
derper -hostname derp.yourdomain.com -certmode manual -certdir /etc/ssl/derper

2. 在 Tailcat 服务端绑定你的私有 DERP

在 NAT VPS 上生成绑定私有 DERP 的密钥:

server$ tailcat genkey --region=derp.yourdomain.com
# 输出 Token: tcCustomDerpToken...

使用 tailcat parse 查看生成的 Token:

tailcat parse tcCustomDerpToken...

你会发现 Token 中已经完整内嵌了你的私有 DERP 节点域名信息:

{
  "ServerPublic": "nodekey:8022c28ea8f52ec7a0a51b644ce00fef3aae150731a01c61a3abd3ac26e14a49",
  "Region": [
    {
      "Nodes": [
        {
          "HostName": "derp.yourdomain.com"
        }
      ]
    }
  ]
}

客户端完全不需要做任何额外配置,在连接该 Token 时会自动优先使用你指定的私有 DERP 服务器进行打洞协商与中继!


🌐 多节点组网实战:Tailcat 能否实现多节点互联?

许多用户会好奇:Tailcat 去除了中心控制平面,还能实现多节点组网吗?

答案是:完全可以!而且支持多种灵活的拓扑架构。

从底层源码看,Tailcat 的 Server 并不是一对一的阻塞单连接服务,它的内部 onMeow 调度机制会为每个连入的 Client 动态分配唯一的客户端身份(client2.tailcat, client3.tailcat…),并在内存中维护多节点 WireGuard 对等列表(Peers)。

           ┌───────────────────────────────────────────────┐
           │          Tailcat 多节点组网拓扑架构           │
           └───────────────────────────────────────────────┘

【模式 1:星型多节点汇聚网 (Hub-and-Spoke)】
           ┌───────────────┐
           │   客户端 A    │
           │ (开发笔记本)  │
           └───────┬───────┘


  ┌─────────────────────────────────┐
  │     核心 NAT VPS (Server)       │ ◀────── ┌───────────────┐
  │ tailcat --serve=all,exit-node   │         │   客户端 B    │
  └─────────────────────────────────┘         │ (办公室机器)  │
                   ▲                          └───────────────┘

           ┌───────┴───────┐
           │   客户端 C    │
           │  (NAT VPS 2)  │
           └───────────────┘

【模式 2:去中心化点对点网状互联 (Ad-Hoc P2P Mesh)】
       ┌────────────────────────┐
       │   NAT 节点 A (香港)    │ ◀ - - - - - - - - - - ▶ ┌────────────────────────┐
       │ hk-vps.yourdomain.com  │   P2P Direct Hole-Punch │   NAT 节点 B (东京)    │
       └───────────┬────────────┘                         │ jp-vps.yourdomain.com  │
                   │                                      └────────────┬───────────┘
                   │             P2P Direct Hole-Punch                 │
                   └ - - - - - - - - - - - - - - - - - - - - - - - - - ┘

                                         │ P2P Direct

                             ┌────────────────────────┐
                             │   NAT 节点 C (美国)    │
                             │ us-vps.yourdomain.com  │
                             └────────────────────────┘

拓扑模式 1:星型汇聚与网关中转网(Hub-and-Spoke)

如果你的目标是让多个分支节点(家庭 NAS、多台轻量 NAT VPS、本地办公电脑)连接到一台核心 VPS,并由核心节点统一管理服务或转发流量:

  1. 核心服务端(NAT VPS Hub)
    # 生成固定密钥,启动所有端口转发与出口节点模式
    server$ tailcat genkey --fixed-region
    server$ tailcat --serve=all,exit-node --allow=nodekey:客户端A公钥,nodekey:客户端B公钥,nodekey:客户端C公钥
  2. 多客户端并发连入
    • 客户端 A、B、C 可同时连接核心 Hub 节点,各自执行 SSH、端口调用或 SOCKS5 代理;
    • 客户端通过 SOCKS5 代理可直接访问核心 Hub 所在局域网内的所有子网设备。

拓扑模式 2:全对等去中心化网状网(Ad-Hoc P2P Mesh)

如果你的多台 NAT VPS 之间需要两两相互调用(例如微服务分布式集群、跨机房数据库主从同步、多区域监控探测):

  1. 为每台 NAT VPS 分配独立域名与密钥
    • 香港节点:运行 tailcat genkey --fixed-region,DNS 添加 TXT:hk-vps.example.com
    • 东京节点:运行 tailcat genkey --fixed-region,DNS 添加 TXT:jp-vps.example.com
    • 美西节点:运行 tailcat genkey --fixed-region,DNS 添加 TXT:us-vps.example.com
  2. 相互添加公钥信任白名单: 在每台节点的 Systemd 服务中,将其他节点的 nodekey 写入 --allow 参数:
    # 香港节点上运行
    tailcat --serve=all --allow=nodekey:东京节点公钥,nodekey:美西节点公钥,nodekey:管理员公钥
  3. 任意节点之间秒级 P2P 直连
    • 香港节点同步东京节点数据:
      tailcat socks jp-vps.example.com curl http://localhost:8080/api/sync
    • 美西节点直接 SSH 登入香港节点:
      tailcat ssh hk-vps.example.com
    各节点之间完全对等直连,无任何单点故障,两两通过 magicsock 自动打洞,延迟即物理光纤极限。

🛡️ NAT VPS 生产环境守护进程配置(Systemd)

为了让 NAT VPS 上的 Tailcat 长期在后台稳定运行,并实现开机自启与异常自动重启,建议将其配置为 Systemd 系统服务。

1. 准备固定密钥

确保 VPS 上已经生成了持久化密钥:

tailcat genkey --fixed-region

2. 创建 Systemd 服务文件

新建 /etc/systemd/system/tailcat.service

[Unit]
Description=Tailcat P2P WireGuard Tunnel Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
# 转发本地 SSH 22 端口,并限制允许连接的客户端公钥(将 nodekey 替换为你的客户端公钥)
ExecStart=/usr/local/bin/tailcat --serve=22 --allow=nodekey:cfb6bfa77a0654d7450947fd6acef17d2cd848da1d30b2540b13dac272ddfd16
Restart=always
RestartSec=5s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

3. 启用并启动服务

systemctl daemon-reload
systemctl enable --now tailcat
systemctl status tailcat

查看服务日志获取当前绑定的 Token:

journalctl -u tailcat -n 20 --no-pager

📊 内网穿透方案对比:Tailcat vs 传统方案

比较维度Tailcat完整版 TailscaleFRP / NPSCloudflare Tunnel
底层协议WireGuard + userspace netstackWireGuard (tun / userspace)自定义 TCP/KCP 协议HTTP/2 / QUIC / WebSockets
是否需要 Root / TUN完全不需要需内核 TUN 或手动指定 userspace❌ 不需要❌ 不需要
中心账号依赖零账号、无中心需注册 Tailscale / Headscale需自建服务端需 Cloudflare 账号与域名
P2P 打洞能力顶级 (magicsock STUN/ICE)✅ 顶级⚠️ 基础 (仅支持部分 NAT 打洞)❌ 仅支持经由 Cloudflare 边缘中转
临时随用随销原生支持 (进程退出即毁)❌ 需手动管理节点下线❌ 需手动启停服务端规则❌ 需后台添加/删除路由
SSH 零信任支持原生内置 (--allow=nodekey)✅ 支持 (Tailscale SSH)需自行配置系统防火墙支持 (Cloudflare Access)
部署上手难度极简(单命令运行)⭐⭐ 简单⭐⭐⭐ 繁琐(需配服务端与客户端)⭐⭐ 中等

❓ 常见问题排查与 FAQ

Q1: 运行 tailcat 时提示端口冲突或无法启动?

  • Tailcat 的 --serve=22 仅是将隧道接收到的流量转发至本机的 127.0.0.1:22。请确保系统本身的 SSH 服务正在正常运行(systemctl status sshd)。

Q2: 为什么我的两台机器一直显示 via DERP,无法打洞直连?

  • 请检查两端主机的防火墙(如 iptables / nftables / ufw),确保没有阻断出方向和入方向的 UDP 随机端口。
  • 如果两端网络均处于极其严格的 Symmetric NAT(对称型 NAT,常见于部分校园网、企业内网或特定移动 4G/5G 热点),STUN 端口预测可能会失效。此时 Tailcat 会自动通过 DERP 中继保证数据连通。自建低延迟 DERP 节点可以获得极佳的中继速度。

Q3: Tailcat 会影响我系统原有的路由或网络配置吗?

  • 绝不影响。Tailcat 纯粹是一个用户态应用进程,不创建虚拟网卡、不修改 /etc/resolv.conf、不修改系统默认网关。随时启动、随时关闭,安全干净。

🎯 总结

Tailscale 推出的 tailcat 为 NAT VPS、LXC/Docker 容器与跨网络调试带来了全新的可能性。它既具备了 WireGuard 与 magicsock 顶级的端到端加密与 P2P 打洞穿透实力,又摆脱了中心化控制平面的束缚,真正做到了轻量、免 Root、即开即用、零运维负担

如果你手头有闲置的 NAT VPS 或者正在寻找一款轻量高效的内网穿透与安全运维工具,不妨立即在你的机器上尝试 tailcat