引言
Tailscale 的 Subnet Routers 和 Exit Nodes 是构建零信任网络架构的核心组件,用于扩展 tailnet 访问本地子网或互联网流量。不同于 DERP(中继服务器,仅用于穿透 NAT 的 fallback),Tailscale 强调 WireGuard 内核级加密 + 策略路由,Subnet Routers 暴露物理子网路由(Layer 3 IP 转发),Exit Nodes 劫持默认路由(0.0.0.0/0),支持多跳拓扑和高性能内核模式。
部署基础:Flags 与系统预备
Subnet Router 部署
使用 tailscale up --advertise-routes=<CIDR> 广告路由,例如:
- 前提:Linux/macOS/Windows,支持内核模式(Linux root)或用户空间(non-root/非 Linux)。
- IP 转发启用(Linux 内核模式,必备):
未启用将导致路由黑洞。用户空间模式(
--tun=userspace-networking)无需此步,但仅支持 TCP/UDP 重建。
Exit Node 部署
- 劫持客户端默认路由(0.0.0.0/0, ::/0),所有非 tailnet 流量经此节点上网。
- 客户端启用:
tailscale up --exit-node=<TS-IP|hostname>或--exit-node=auto:any(自动选低延迟)。 - LAN 访问:
--exit-node-allow-lan-access允许客户端保留本地网络(默认禁用,避免泄露)。
Admin 批准:Machines 页 Edit route settings → 启用 “Use as exit node” / “Use as subnet router”。
ACL 授权与策略控制
ACL 在 tailnet policy file(huJSON)中定义,deny-by-default。
子网路由授权
grants语法:route:<CIDR>(子网)、node:exit:*(任意 exit node)。- TagOwners:
tagOwners: ["user:[email protected]"],仅标签所有者广告--advertise-tags=tag:prod。
Exit Node 授权
- 手动:Admin console Machines → Exit Node badge → 批准。
MTU/MSS 问题与修复(Iptables Clamping)
Tailscale WireGuard MTU 默认 1280(IPv4)/1288(IPv6),避免 PMTU 发现碎片。子网/出口路由易遇 MSS(TCP Max Segment Size)黑洞。
常见问题
- 大包(>MTU)碎片失败 → 吞吐暴降、超时。
- 子网路由多跳:累积封装开销(Outer WireGuard ~60B + Inner IP)。
优化修复
- 全局 MTU 调整:
tailscale up --netfilter-mode=on(默认),Tailscale 自动 clamp MSS。 - Iptables MSS Clamping(Linux 内核模式,手动精细):
- 验证:
tailscale netcheck检查 HairPinning/PortMapping;tailscale ping --until-direct测直接路径。
多跳路由(Multi-Hop)
Tailscale 支持链式路由,非扁平 mesh:
-
子网 A → Router1 (192.168.1.0/24) → Router2 (10.0.0.0/8) → Internet (Exit Node)。
-
SNAT 控制:
--snat-subnet-routes=false保留源 IP(穿越多 NAT),默认 masquerade 为路由器 IP。 -
Stateful Filtering:
tailscale up --stateful-filtering启用连接跟踪,仅允许出站响应。
安全强化(Node Auth & 防护)
- 节点认证:WireGuard 密钥 + Tailscale OIDC(ephemeral keys 过期 fail-close,路由保留防泄露)。
- 暴露最小:
--shields-up阻入站,仅出站。 - Key Expiry:禁用
keyExpiryDisabled: true,过期路由自动撤回。 - 日志:Enterprise 启用 exit node destination logging,追踪 0.0.0.0/0 流量。
性能调优
| 模式 | CPU/内存 | 吞吐 | 适用场景 |
|---|---|---|---|
| Kernel (Linux root) | 低(OS 转发) | 高(Gbps,原生 IP) | 高负载、生产 |
| Userspace (netstack/gVisor) | 高(重建流) | 中(~100Mbps) | 非 root、低负载 |
- 优化:
- Kernel 优先:
tailscale up --netfilter-mode=on。 - 高可用:多 exit node +
--exit-node=auto:any。 - 监控:
tailscale status --json+tailscale metrics(Prometheus)。
- Kernel 优先:
- 基准:内核模式下,单核 >1Gbps。