Tailscale 是基于 WireGuard 的零信任组网平台

  1. 虚拟子网 (tailnet)
    • 加入同一 tailnet 的设备互相可见
    • 默认走端到端的 WireGuard 隧道, 没有必须经过的中心节点
    • 也可以配置 exit node, 指定某台设备为流量出口
  2. 端到端加密
    • 数据面是 WireGuard, Tailscale 看不到业务流量, 中继也解不开业务包
    • 控制面用独立加密协议分发公钥和策略
  3. NAT 穿透与中继
    • 用 STUN / ICE 打洞, 打不通时走全球 DERP 中继 (NAT 原理见 NAT)
    • 支持自部署 DERP 节点 / Peer relay
  4. 稳定地址: 每个设备有固定的 100.x.y.z (CGNAT) IPv4 和 IPv6
  5. MagicDNS: 设备名直接当主机名用, 不必记 100.x 地址
  6. Split tunneling: 默认只把 tailnet / 宣告的子网走隧道, 普通上网仍走本地出口, 避免把所有流量塞进 VPN

控制平面与数据平面分离

和传统 VPN 最大的不同, Tailscale 的控制平面与数据平面是分离的

平面作用
控制平面负责身份认证、设备注册、密钥分发、ACL 策略下发、节点信息同步
数据平面各个设备节点之间直接建立 WireGuard 加密隧道

当你在一台设备登录 Tailscale 时:

  1. 它向协调服务器注册自己, 获得 Tailnet 内其他节点信息
  2. 设备之间尽力建立点对点连接, 失败时退而用 官方 DERP 中继服务器转发加密流量

Tailnet 四个核心

Tailnet = 用户 + 设备 + 规则 + 附加功能

用户

用户登录 (支持 Google, Github) 后, 他们的设备才会加入 Tailnet, 用户是访问控制的基本单位, 可以为不同用户分配不同权限

设备

任何安装了 Tailscale 客户端并登录到同一 Tailnet 的设备, 都是一个设备

每个节点在加入 Tailnet 时会获得:

  • 唯一的节点 ID
  • 一个来自 100.64.0.0/10 网段的 IPv4 地址
  • 一个主机名
  • 可选的 ACL 标签

设备之间通过 WireGuard 协议通信, 每个节点都有一对公私钥, 公钥在控制平面分发, 私钥只留在设备本地

访问策略 ACL

Tailnet 内 “谁能访问谁” 由 ACL 决定, 这是 Tailnet 的规则集合

  • 默认策略: 新创建的 Tailnet 默认允许所有设备之间互相访问所有端口
  • 自定义策略: 使用一个 JSON 格式的 ACL 文件

ACL 由 Tailscale 控制平面下发到各个节点, 节点本地强制执行.

注意: ACL 只控制 Tailnet 内部的访问, 不依赖传统防火墙

附加功能