引言

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> 广告路由,例如:

s u d o t a i l s c a l e u p - a d v e r t i s e - r o u t e s = 1 9 2 . 1 6 8 . 1 . 0 / 2 4 , 1 0 . 0 . 0 . 0 / 8
  • 前提:Linux/macOS/Windows,支持内核模式(Linux root)或用户空间(non-root/非 Linux)。
  • IP 转发启用(Linux 内核模式,必备):
    e e s c c u h h d o o o ' ' s n n y e e s t t c . . t i i l p p v v - 4 6 p . . i c p e _ n t f f c o . / r a s w l y a l s r . c d f t o l = r . w d 1 a / ' r 9 d 9 | i - n t s g a u i d = l o s 1 c t ' a e l e | e . - s c a u o d n / o f e t t c e / e s y - s a c t / l e . t d c / / 9 s 9 y - s t c a t i l l . s d c / a 9 l 9 e - . t c a o i n l f s c a l e . c o n f
    未启用将导致路由黑洞。用户空间模式(--tun=userspace-networking)无需此步,但仅支持 TCP/UDP 重建。

Exit Node 部署

s u d o t a i l s c a l e u p - a d v e r t i s e - e x i t - n o d e
  • 劫持客户端默认路由(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。

子网路由授权

" ] a c { { l s " " " a a a : c u c t t t [ i o i / o g o n r n 使 " o " : u : p " : " a i a c n c c t c e e e p r p t n t " e " , t , " 使 " s s r r c e c " x " : i : t [ [ " n " u o a s d u e e t r o : g a r l o i u c p e : @ i e n x t a e m r p n l e e t . " c ] o , m " " ] g , r a " n g t r s a " n : t s [ " " : n o [ d " e r : o e u x t i e t : : 1 * 9 " 2 ] . 1 } 6 8 . 1 . 0 / 2 4 " ] } ,
  • grants 语法:route:<CIDR>(子网)、node:exit:*(任意 exit node)。
  • TagOwners:tagOwners: ["user:[email protected]"],仅标签所有者广告 --advertise-tags=tag:prod

Exit Node 授权

" a u t o A p p r o v e r s " : { " e x i t - n o d e " : [ " u s e r : * " ] }
  • 手动: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)。

优化修复

  1. 全局 MTU 调整tailscale up --netfilter-mode=on(默认),Tailscale 自动 clamp MSS。
  2. Iptables MSS Clamping(Linux 内核模式,手动精细):
    i i p p t 6 a t b a l b e l s e s - t - t m a m n a g n l g e l e - A - A F O F R O W R A W R A D R D - p - p t c t p c p - t - c t p c - p f - l f a l g a s g s S Y S N Y , N R , S R T S T S Y S N Y N - j - j T C T P C M P S M S S S - c - l c a l m a p m - p m - s m s s - s t - o t - o p - m p t m u t u
  3. 验证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 Filteringtailscale 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)。
  • 基准:内核模式下,单核 >1Gbps。

参考:tailscale upExit NodesKernel vs Userspace