Tailscale 是基于 WireGuard 的零信任组网平台
- 虚拟子网 (tailnet)
- 加入同一 tailnet 的设备互相可见
- 默认走端到端的 WireGuard 隧道, 没有必须经过的中心节点
- 也可以配置 exit node, 指定某台设备为流量出口
- 端到端加密
- 数据面是 WireGuard, Tailscale 看不到业务流量, 中继也解不开业务包
- 控制面用独立加密协议分发公钥和策略
- NAT 穿透与中继
- 用 STUN / ICE 打洞, 打不通时走全球 DERP 中继 (NAT 原理见 NAT)
- 支持自部署 DERP 节点 / Peer relay
- 稳定地址: 每个设备有固定的 100.x.y.z (CGNAT) IPv4 和 IPv6
- MagicDNS: 设备名直接当主机名用, 不必记 100.x 地址
- Split tunneling: 默认只把 tailnet / 宣告的子网走隧道, 普通上网仍走本地出口, 避免把所有流量塞进 VPN
控制平面与数据平面分离
和传统 VPN 最大的不同, Tailscale 的控制平面与数据平面是分离的
| 平面 | 作用 |
|---|---|
| 控制平面 | 负责身份认证、设备注册、密钥分发、ACL 策略下发、节点信息同步 |
| 数据平面 | 各个设备节点之间直接建立 WireGuard 加密隧道 |
当你在一台设备登录 Tailscale 时:
- 它向协调服务器注册自己, 获得 Tailnet 内其他节点信息
- 设备之间尽力建立点对点连接, 失败时退而用 官方 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 内部的访问, 不依赖传统防火墙
附加功能
- MagicDNS
- HTTPS 证书
- Subnet Router (子网路由)
- Exit Node (出口节点)
- Node Sharing (共享节点)
- Taildrop