本页目录

Tailscale 架构

在 WireGuard 之上构建零配置 mesh VPN——coordination server 交换公钥和 ACL,NAT 穿透建立直接隧道,不可穿透时自动 fallback 到 DERP 中继。控制平面集中但数据平面去中心化:流量不经过中心服务器。

概述

Tailscale(2019)在 WireGuard 之上构建了零配置 mesh VPN:coordination server 交换公钥和 ACL,节点之间通过 NAT 穿透(STUN/UPnP/端口预测)建立直接 WireGuard 隧道;不可穿透时自动 fallback 到 DERP 中继。核心创新是将 WireGuard 的静态配置变为自动管理的 mesh overlay,同时保持数据平面不经过中心服务器。开源替代 headscale 允许完全自建。

控制平面与数据平面分离

Tailscale 不是 peer-to-peer — 它是 mesh overlay with centralized coordination:

控制平面 (Coordination Server):
  - HTTPS (REST + long-poll): 交换公钥, endpoint, ACL
  - 不传输用户数据
  - 开源替代: headscale

数据平面:
  - WireGuard 隧道 (user-space: wireguard-go or kernel: wireguard.ko)
  - 对端之间: 直接 UDP (如果 NAT traversal 成功) or via DERP relay

coordination server 提供的是 peer list + public keys + endpoint hints + ACL rules。建立连接后,节点之间用 WireGuard 直接通信。

DERP

DERP (Detoured Encrypted Routing Protocol) 是 Tailscale 的中继网络,当直接连接失败时使用:

[Node A] → TLS → DERP Server → TLS → [Node B]

DERP 协议:
  1. Node → DERP: HTTPS(TLS) connect to :443 or custom port
     → 验证: node 用自己的 tailscale private key 签名 — DERP 不用登录 tailnet
  2. DERP → Node: server info (region, version)
  3. 后续: 
     - DERP 转发 WireGuard 加密的包 (不能解密)
     - 对端发现 (Peer Present / Peer Gone 消息)
     - ping/pong keepalive

自建 DERP: 需要 TLS 证书 + 公网端口。verify-clients 选项依赖 tailscaled 连上 coordination server 验证 client 身份 — 如果在中国 deployment,coordination server 连不上 (被墙),则此选项不可用。

NAT Traversal

Tailscale 在建立 WireGuard tunnel 前,先做穿透:

策略 (按优先级):
  1. 双方在同一局域网 → 直接 LAN IP (host firewall must allow)
  2. 一方 Full Cone NAT → STUN → get external IP:port → remote connects
  3. 双方 Symmetric NAT → port prediction + birthday attack:
     每个 peer 同时向对方猜测的 port 发 UDP (探测多端口)
     → 某对 pair 匹配 → 直接连通
  4. UPnP/NAT-PMP/PCP: 如果路由器支持 → 映射端口 → 等同于公网 IP
  5. 以上全失败 → DERP relay (保底)

端口预测:
  观察 NAT 的 port 分配模式 (increment, hash, random):
    递增: port_N = base_port + N
    hash: port_N = f(proto, src_ip, src_port, dst_ip, dst_port)
    random: 不可预测 → 打洞不可能 → only DERP

参考

  • tailscale blog: "How NAT traversal works"
  • headscale: github.com/juanfont/headscale
  • DERP: tailscale.com/kb/1232/derp

Keywords: Tailscale, coordination server, DERP, NAT traversal, port prediction, wireguard-go, headscale, ACL