Tailscale 工作原理深度解析:从 WireGuard 到 NAT 穿透

概述

Tailscale 是基于 WireGuard 协议构建的零信任网状 VPN 网络。它在 WireGuard 的密码学基础之上,封装了自动化 NAT 穿透、DERP 中继、MagicDNS、ACL 访问控制和协调控制平面,使得跨 NAT 的点对点加密连接变得”开箱即用”。本报告深入分析 Tailscale 的核心工作原理,特别聚焦于所有设备都位于 NAT 后面时如何实现连接。


一、WireGuard 协议基础

1.1 核心设计:Cryptokey Routing

WireGuard 的核心概念是 Cryptokey Routing(密钥路由)——将公钥与一组允许通过隧道的 IP 地址关联。每个网络接口拥有一个私钥和一个对等节点列表,每个 peer 拥有一个公钥(WireGuard 官网)。

AllowedIPs 同时扮演路由表(发送方向)和访问控制列表(接收方向)的双重角色(Netmaker),巧妙地将加密、路由和访问控制统一到单一机制中。

1.2 密码学原语

WireGuard 采用”密码学固执”的设计哲学——不提供算法协商灵活性。使用的原语包括 Curve25519(ECDH)、ChaCha20-Poly1305(认证加密)、BLAKE2s(哈希)、HKDF(密钥派生)。握手使用 Noise 协议框架的 Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s 模式,仅需 1-RTT 即可完成(WireGuard 白皮书)。

原语用途
Curve25519椭圆曲线 Diffie-Hellman 密钥交换
ChaCha20对称流加密
Poly1305消息认证(完整性验证)
BLAKE2s密码学哈希
HKDF从 ECDH 结果派生密钥

1.3 安全特性

  • 前向保密(Forward Secrecy):会话密钥从临时密钥派生,握手每隔几分钟自动重新进行密钥轮换
  • 抗重放攻击:第一条消息中包含 TAI64N 时间戳,服务端追踪最大时间戳
  • 抗 DoS 攻击:第一条握手消息需要认证,服务器不为未认证消息分配状态
  • 形式化验证:2019 年 INRIA 使用 CryptoVerif 发布了机器验证证明

1.4 与传统 VPN 的关键差异

维度WireGuardOpenVPNIPSec
代码量~4,000 行~600,000+ 行庞大
运行空间内核空间用户空间内核/用户空间
性能约为 OpenVPN 3x 吞吐量因上下文切换较慢中等
配置复杂度简洁灵活但复杂非常复杂
网络切换无缝漫游可能断连可能断连

二、Tailscale 架构:控制平面与数据平面分离

2.1 混合集中-分布式模型

Tailscale 将网络操作分为两个平面(Tailscale Docs):

  • 控制平面(Control Plane):通过协调服务器(login.tailscale.com)运行,负责认证、密钥分发、ACL 编译、DNS 配置。几乎不传输实际数据——本质上是一个”公钥的共享投递箱”
  • 数据平面(Data Plane):在每个设备上运行,采用网状(mesh)拓扑,使用 WireGuard 端到端加密处理实际数据传输

这种设计的关键优势是弹性:即使协调服务器宕机,已建立的连接继续工作,设备密钥存储在本地,网络策略在本地缓存(Tailscale)。

协调服务器的核心职责:

  1. 设备发现:管理所有 tailnet 设备的注册和发现
  2. 密钥分发:收集和分发设备公钥
  3. 认证:通过 OAuth/SSO 身份提供商验证用户身份
  4. 策略执行:编译并分发 ACL 访问控制策略到各节点
  5. NAT 穿越协助:管理端点信息,选择最优 DERP 区域
┌─────────────────────────────────────────────────────────────┐
│                    Tailscale 整体架构                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌───────────────┐     Noise IK / TLS      ┌────────────┐  │
│  │   Node A      │◄──────────────────────►  │ 协调服务器   │  │
│  │ (tailscaled)  │   控制平面 (公钥、ACL、   │ (login.    │  │
│  │               │    DNS、网络映射)         │ tailscale  │  │
│  │ ┌───────────┐ │                          │  .com)     │  │
│  │ │LocalBackend│ │                          └─────┬──────┘  │
│  │ │ wgengine  │ │                                │         │
│  │ │ magicsock │ │     Noise IK / TLS      ┌─────┴──────┐  │
│  │ │ netstack  │ │                          │   Node B   │  │
│  │ └───────────┘ │                          │(tailscaled)│  │
│  └───────┬───────┘                          └────────────┘  │
│          │            数据平面                      ▲         │
│          │     (WireGuard 端到端加密)               │         │
│          └────────────────────────────────────────┘         │
│                    直连 (UDP) 或 DERP 中继                    │
└─────────────────────────────────────────────────────────────┘

2.2 密钥层次结构

Tailscale 使用分层密钥架构(Tailscale Key Management):

  • Machine Key:Curve25519 机器私钥,用于与协调服务器的 ECDH 通信
  • Node Key:登录时生成的独立 Curve25519 密钥,用于 WireGuard 对等节点配置,默认 180 天过期
  • Control Key:控制平面加密通信,使用 Noise IK 协议(X25519 + ChaCha20-Poly1305 + BLAKE2s),通过 WebSocket 升级建立持久加密通道
  • Tailnet Lock Key:Ed25519 签名密钥,用于 Tailnet Lock 机制

核心安全原则:私钥永远不会离开其所在节点。 协调服务器仅收集和交换公钥,因此即使协调服务器被入侵,攻击者也无法解密设备间的流量。

2.3 Tailnet Lock:无需信任 Tailscale 基础设施

Tailnet Lock 的核心思想:即使不信任 Tailscale 的基础设施,也能安全使用 TailscaleTailscale Blog)。

启用后,新节点的公钥必须由受信任的 Ed25519 签名密钥签名后,才会被其他节点接受。本地管理的 TKA(Tailnet Key Authority)确保控制平面无法在未被检测到的情况下插入未授权节点(Tailscale)。

关键设计:

  • 签名密钥由本地管理,控制平面从不看到或存储签名密钥
  • 状态变更摘要使用 BLAKE2 生成(类似 Git 的 commit hash)
  • 建议每 tailnet 最多 20 个签名节点,每年轮换一次 Tailnet Lock 密钥
  • 禁用 Tailnet Lock 需要使用 disablement secret,防止被入侵的控制平面绕过

三、NAT 穿透全流程(核心重点)

这是本报告的核心章节。当所有设备都在 NAT 后面时,Tailscale 通过一系列精巧的技术组合来建立点对点连接。

3.1 NAT 类型与挑战

NAT 设备按映射行为分为两大类(Tailscale Blog):

Easy NAT(Endpoint-Independent Mapping)

  • Full Cone、Restricted Cone、Port Restricted Cone NAT
  • 同一内部 IP:Port 始终映射到相同的外部 IP:Port
  • STUN 发现的地址可靠,UDP 打洞通常可行
  • 大多数家用路由器属于此类

Hard NAT(Endpoint-Dependent Mapping / Symmetric NAT)

  • 每个到不同目标 IP:Port 的请求产生不同的外部映射
  • STUN 发现的地址对其他 peer 无效
  • 大多数企业防火墙、CGNAT、云 NAT 网关(AWS/Azure/GCP)属于此类

关键洞察:只要 NAT 的映射行为是 Endpoint-Independent 的,UDP 打洞就能成功。 因为 STUN 服务器告诉我们的外部 IP:Port 对所有目的地都一致,peer 就知道应该向哪里发送数据包。

3.2 STUN:发现公网地址

STUN(Session Traversal Utilities for NAT)的原理非常简单:当 NAT 后面的客户端与互联网服务器通信时,服务器看到的是 NAT 设备创建的公网 IP:Port,服务器将这个地址告诉客户端。

Tailscale 客户端在 UDP 3478 端口向所有 DERP 服务器发送 STUN 请求(Tailscale Docs)。核心判断字段 MappingVariesByDestIP

  • false → Easy NAT,标准 UDP 打洞可行
  • true → Hard NAT(Symmetric NAT),打洞极其困难

tailscale netcheck 命令可以查看完整的网络连接信息,包括 UDP 可达性、公网 IPv4/IPv6 地址、NAT 映射类型、端口映射协议支持情况。

3.3 UDP 打洞详解

UDP 打洞是建立直连的核心技术。

核心问题:有状态防火墙的死锁

对于 UDP,防火墙规则很简单:只有在之前看到过匹配的出站数据包时,才允许入站 UDP 数据包。这产生了根本性的死锁:双方都必须先发送数据包,但双方又都无法先发送

解决方案:同时发送David Anderson, Tailscale Blog

David Anderson 的关键洞察:

数据包之间不需要有任何关联关系,只要 IP 和端口对得上就行。只要有某个数据包以正确的源地址和目的地址流出,任何看起来像是回复的数据包都会被放行,即使对方从未收到你的数据包!

步骤详解:

  1. STUN 发现:双方通过 STUN 发现自己的公网 IP:Port
  2. 协调服务器同步:双方将端点信息上报给协调服务器,再分发给对方
  3. 同时发送(关键技巧):
    • 设备 A 向设备 B 通过 STUN 发现的公网 IP:Port 发送 UDP 包
    • 设备 B 向设备 A 通过 STUN 发现的公网 IP:Port 发送 UDP 包
    • 两个操作同时进行
  4. 防火墙打开:双方的防火墙都已经看到了到对方地址的出站流量,回传流量在两侧都被接受
  5. 保活维持:定期发送 keepalive 包防止 NAT 映射过期(常见超时 30 秒

多层防火墙的可扩展性:不需要担心两个 peer 之间有多少层防火墙——只要它们是有状态的并允许出站连接,同时发送技术就能穿过任意层数。逻辑只需实现一次,到处都能工作。

94% 的 NAT 配置下 UDP 打洞可以成功。

3.4 生日悖论穿透 Symmetric NAT

当遇到 Symmetric NAT(Hard NAT)时,标准 UDP 打洞无法工作。Tailscale 应用生日悖论的数学原理来提高穿透成功率(Tailscale Blog)。

一侧 Hard NAT + 一侧 Easy NAT

  • Hard NAT 一侧打开 256 个端口(通过 256 个 socket 发送数据包)
  • Easy NAT 一侧随机探测目标端口
  • 以 100 端口/秒探测,约 2 秒即有 50% 成功概率,20 秒内几乎 100%
  • David Anderson 开源了概率计算器

双侧 Hard NAT

  • 搜索空间从 ~65,000 膨胀到 ~65,000^2 = ~42 亿
  • 需要 170,000 个探测包才能达到 99.9% 成功率
  • 以 100 包/秒速率,需要 ~28 分钟
  • 会耗尽路由器的整个会话表(如 Juniper SRX 300 最多 64,000 个会话)
  • 还会触发入侵检测系统(IDS)告警
  • 结论:两个 Hard NAT 后的设备几乎总需要中继

3.5 DERP:加密中继服务器

DERP(Designated Encrypted Relay for Packets)是 Tailscale 创建的中继协议(Tailscale)。Tailscale 没有使用标准的 TURN 协议,因为”TURN 不是一个特别友好的协议,而且互联网上没有开放的 TURN 服务器”。

核心特性:

  • 运行在 HTTPS(TCP 443) 上——即使 UDP 被完全封锁也能工作
  • 双重用途
    1. 数据中继:NAT 穿透失败时的回退通道
    2. 穿透辅助:帮助升级到 P2P 的侧信道(传递 DISCO 发现消息)
  • 不解密流量:DERP 盲目转发已加密的 WireGuard 包,使用 WireGuard 公钥(而非 IP 地址)寻址
  • 使用 TCP 的代价:TCP 握手、缓冲区、丢包重传带来额外延迟,存在队头阻塞问题

全球基础设施(截至 2025 年底):

  • 28 个 DERP 区域,每区域至少 3 个节点
  • 双栈(IPv4+IPv6),可在 IPv4-only 和 IPv6-only 设备间中继
  • 区域内节点互相 mesh 连接,数据包只转发一跳
  • 区域之间没有路由——降低成本,避免使用云负载均衡器
  • 每个客户端根据延迟选择 Home DERP 服务器

每个 DERP 服务器提供三项服务:

服务协议端口
DERP 中继HTTPS (TCP)443
强制门户检测HTTP (TCP)80
STUNUDP3478

3.6 连接升级路径:“先连接,再优化”

Tailscale 与传统 ICE 实现的关键区别在于其连接升级策略。ICE 规范将协议构建为”探测阶段”后跟”通信阶段”,但 Tailscale 认为没必要严格分开(Tailscale Blog)。

  1. 所有连接立即通过 DERP 开始——连接几乎瞬时建立,零延迟启动
  2. 路径发现并行运行:收集所有候选端点,通过 DISCO 协议探测
  3. 通常几秒内升级:找到更优路线后透明切换为直连
  4. 如果直连失败:流量继续通过 DERP 流动
  5. 故障回退与重新发现:检测到路径失败时回退到 DERP,重新启动路径发现

从用户角度,连接永远不会失败——总有一条路径可用。内部直连成功率超过 90%

3.7 DISCO 协议:认证对等发现

DISCO(Discovery Protocol)是 Tailscale 自定义的 NAT 穿透和路径验证协议,运行在 UDP 之上,使用每节点的 disco 密钥进行认证(Go Packages)。

核心消息类型:

消息类型用途
CallMeMaybe仅通过 DERP 发送,请求接收方尝试打开一条回到发送方的 magicsock 路径
CallMeMaybeVia类似 CallMeMaybe,但候选路径通过中间 relay 提供,需要 3 次握手
Ping探测路径可达性和延迟,包含发送方的 WireGuard 公钥
PongPing 回复,包含发送方的源 IP:Port(类似 STUN 响应)

路径选择:收到 Pong 回复后,基于往返延迟(RTT)通过 betterAddr() 函数选择最佳地址。直连路径优先于 CallMeMaybeVia 路径。

3.8 MagicSock:自适应传输层

magicsock 包实现了能在使用中动态切换通信路径的 socket(Go Packages):

  • WireGuard 和 DISCO 共享单个 UDP socket——没有端口冲突
  • magicsock.Conn 管理多个 UDP socket,维护到 DERP 中继服务器的连接,追踪 peer 端点
  • 作为 WireGuard 的 bind 层,拦截和路由所有 WireGuard 流量
  • 从 v0.100.0 开始,基于实际延迟测量选择最优路径,而非硬编码优先级

3.9 端口映射协议

Tailscale 的 portmapper 包支持三种端口映射协议(Go Packages):

  • UPnP:最广泛支持但最复杂,历史上安全漏洞最多
  • NAT-PMP:只做端口转发,实现极简
  • PCP:NAT-PMP 的继任者,功能更丰富

不幸的是,很多设备只有一个”UPnP”复选框同时切换三种协议。担心 UPnP 安全性的用户最终会禁用完全安全的替代方案。企业防火墙和云 NAT 几乎不支持这些协议。

3.10 Peer Relays:高性能中继(2025-2026)

2025 年 10 月推出,2026 年 2 月正式 GA(Tailscale Blog):

  • 基于 UDP(而非 DERP 的 TCP),使用原生 WireGuard UDP
  • 性能接近直连,比 DERP 高出数个数量级
  • 用户自管,没有 DERP 的速率限制和公平使用策略
  • 每用户免费 2 个 peer relay
  • 需要 Tailscale v1.86+

连接优先级:直连 > Peer Relay > DERP

典型应用场景:印度 ISP 由于 IPv4 稀缺大规模采用 CGNAT,通常使用 Symmetric NAT,Peer Relay 提供了比 DERP 显著更好的体验。


四、连接建立全流程

将所有技术串联,Tailscale 的完整连接建立流程如下:

┌──────────────────────────────────────────────────────────────┐
│                    Tailscale 连接建立全流程                     │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  1. 启动阶段                                                  │
│     ├─ STUN 探测:向所有 DERP 服务器发 STUN 请求 (UDP 3478)  │
│     ├─ 发现公网 IP:Port                                      │
│     ├─ 判断 MappingVariesByDestIP (Easy/Hard NAT)           │
│     ├─ 探测端口映射协议 (UPnP/NAT-PMP/PCP)                  │
│     └─ 选择 Home DERP 服务器                                 │
│                                                              │
│  2. 连接初始化                                                │
│     ├─ 通过 DERP 立即建立连接(零延迟启动)                   │
│     └─ 开始传输数据(通过 DERP 中继)                         │
│                                                              │
│  3. 路径发现(并行运行)                                      │
│     ├─ 收集候选端点 (LAN/STUN/端口映射/DERP)                │
│     ├─ 通过 DERP 发送 CallMeMaybe                           │
│     ├─ 向所有候选端点发送 DISCO Ping                         │
│     ├─ 收集 Pong 回复,测量 RTT                              │
│     └─ 同时进行 UDP 打洞尝试                                 │
│                                                              │
│  4. 路径升级                                                  │
│     ├─ Easy+Easy: 标准 UDP 打洞 → 秒级成功                  │
│     ├─ Easy+Hard: 生日悖论探测 → 数秒成功                    │
│     ├─ Hard+Hard: 极难成功 → 保持 DERP / Peer Relay         │
│     └─ 选择最低延迟路径,透明切换                             │
│                                                              │
│  5. 持续维护                                                  │
│     ├─ 自适应心跳保持 NAT 映射                               │
│     ├─ 持续监控路径质量                                       │
│     ├─ 检测故障 → 回退 DERP → 重新发现                      │
│     └─ 监控端口映射 epoch → 路由器重启时自动恢复             │
│                                                              │
└──────────────────────────────────────────────────────────────┘

五、其他核心功能

5.1 MagicDNS

MagicDNS 为 tailnet 中每台设备自动注册稳定、人类可读的 DNS 名称(Tailscale)。

架构实现:

  • Tailscale 告诉操作系统 DNS 服务器地址是 100.100.100.100
  • 安装路由将该地址的流量回送到 Tailscale 进程
  • tailnet 私有名称查询不会离开设备——采用推送式更新,网络映射变更时立即推送到每台设备
  • 公共域名查询透明升级为 DNS-over-HTTPS,防止 DNS 请求被篡改或嗅探
  • 支持 Split DNS(受限名称服务器),按域名将查询路由到不同服务器

5.2 ACL 访问控制

Tailscale ACL 遵循最小权限零信任原则(Tailscale):

  • 默认拒绝(deny-by-default)
  • 方向性(directional):允许 A→B 不意味着 B→A
  • 本地执行(locally enforced):规则在每台设备上独立执行,无需协调服务器参与
  • 使用 HuJSON 格式定义,支持用户、组(groups)、标签(tags)等选择器
  • 标签可拥有其他标签,实现层级化权限管理
  • 下一代语法 Grants 提供应用层访问控制能力,ACL 将继续无限期工作但不再接收新功能

5.3 子网路由器与出口节点

  • 子网路由器:通过运行 Tailscale 的设备充当网关,允许访问无法直接安装 Tailscale 的内部设备
  • 出口节点:将所有非 tailnet 流量通过指定设备路由(通告 0.0.0.0/0::/0
  • 两者均支持高可用部署(多个路由器通告重叠路由)
  • 密钥过期时路由保持配置但变得不可达(“fail close”策略),防止流量泄漏

5.4 Tailscale SSH、Taildrop、Funnel

  • Tailscale SSH:由 Tailscale 接管端口 22 的 SSH 连接,通过 WireGuard 加密和 node key 认证,无需分发公钥或维护 authorized_keys
  • Taildrop:基于 peerapi 的设备间文件共享,通过 P2P 加密链路传输,从不存储在云端
  • Tailscale Funnel:将 tailnet 内部服务暴露到公共互联网,通过 TCP 代理和 Funnel relay 建立加密隧道,设备 IP 永不暴露

5.5 Netstack(用户态网络栈)

基于 Google gVisor 的 TCP/IP 栈,完全在用户空间运行。适用于无法创建 TUN 设备的容器环境。在此模式下 tailscaled 作为 SOCKS5/HTTP 代理运行。


六、竞品对比

6.1 核心功能对比

功能TailscaleZeroTierNebulaWireGuard 原生
NAT 穿透优秀(DERP+Peer Relays,>90%直连)良好(Root Servers)良好(Lighthouse)
Mesh 支持全自动全自动全自动手动(O(n^2)复杂度)
底层协议WireGuard自定义(256-bit ECC)Noise IX + AES-256-GCMWireGuard
网络层Layer 3Layer 2Layer 3Layer 3
身份模型OAuth/SSO设备密钥证书 PKI公钥对
自托管需 Headscale完全可自托管完全可自托管完全自主
开源客户端开源,服务器闭源客户端 MPL-2.0完全开源(MIT)完全开源(GPL v2)
配置复杂度极低较高(需 CA 管理)中高
内存占用可变(>1GB)~27MB~27MB极低

6.2 选型建议

  • 个人/Homelab:首选 Tailscale(零配置、MagicDNS、免费层 100 设备)
  • 中小企业:首选 Tailscale(SSO 集成、ACL、最低运维)
  • 需要 L2 网络:ZeroTier(组播、广播支持)
  • 零供应商依赖:Nebula(完全开源,Slack 5 万台生产主机验证)
  • 最高性能:WireGuard 原生内核模块(~8+ Gbps)
  • 公网服务暴露:Cloudflare Tunnel(生产级)、ngrok(API 调试)

6.3 Headscale

Headscale 是 Tailscale 协调服务器的开源自托管替代(BSD 许可),由欧洲航天局的 Juan Font 创建。支持 OIDC、ACL、MagicDNS,但仅支持单 tailnet,缺少 Funnel/Serve 等功能。Tailscale 的一位活跃维护者已加入 Headscale 团队,双方保持兼容性协作。


七、2025-2026 前沿发展

7.1 产品更新

  • Peer Relays GA(2026-02):基于 UDP 的高性能中继,支持静态端点和 Prometheus 指标
  • LM Link(2026-02):与 LM Studio 合作,加密点对点访问远程 GPU 上的 LLM
  • Aperture(2026-03,alpha):AI 网关,集中式 LLM 访问控制和使用追踪
  • Border0 收购(2026-03):获得特权访问管理(PAM)能力
  • Workload Identity Federation GA(2026-02):使用 OIDC 令牌替代静态凭据,支持 AWS/Azure/GCP/GitHub Actions
  • Multi-Tailnet(alpha):组织可在同一身份提供商下创建多个 tailnet
  • 可视化策略编辑器 GA:图形界面替代 HuJSON 编辑
  • 静态数据加密:客户端状态文件加密存储

7.2 性能优化

  • wireguard-go 突破 10Gb/s:通过内核接口卸载和 UDP 分段卸载,用户态 wireguard-go 甚至超越了内核 WireGuard
  • FreeBSD PF 补丁:Tailscale 赞助为 PF 添加 Endpoint-Independent Mapping,改善 pfSense/OPNsense 用户的直连率

7.3 未来方向

  • 后量子密码学:计划通过 WireGuard PSK + ML-KEM 实现后量子安全
  • AI 基础设施:将 Tailscale 定位为 AI agent 访问企业数据的”空中交通管制系统”
  • IPO 计划:CEO 确认打算最终 IPO,但”还需数年”

7.4 商业数据

  • 超过 10,000 家付费企业客户,ARR 同比增长 >100%
  • 14.5 亿美元估值(2025 C 轮,1.6 亿美元融资)
  • 客户包括 Instacart、Duolingo、Perplexity、Mistral、Groq、Hugging Face 等

关键数据速查

指标数据
直连成功率>90%(典型条件)
Easy+Hard NAT 打洞时间~2-20 秒(生日悖论)
Hard+Hard NAT 打洞时间~28 分钟(99.9%),实际不可行
UDP 防火墙超时常见值 30 秒
STUN 端口UDP 3478
WireGuard 直连端口UDP 41641
DERP 端口TCP 443
DERP 全球区域28 个,每区域 ≥3 节点
免费 Peer Relay2 个/用户
Node Key 默认过期180 天
付费企业客户>10,000 家
估值14.5 亿美元(2025 C 轮)

参考资料

  1. How NAT traversal works - David Anderson, Tailscale Blog
  2. How Tailscale works - Tailscale Blog
  3. NAT Traversal Improvements Part 1 - Tailscale Blog, 2025
  4. NAT Traversal Improvements Part 2 - Tailscale Blog, 2025
  5. NAT Traversal Improvements Part 3 - Tailscale Blog, 2025
  6. Tailscale Key Management - Tailscale Blog
  7. DERP Servers - Tailscale Docs
  8. Tailnet Lock Whitepaper - Tailscale Docs
  9. WireGuard Protocol - WireGuard
  10. WireGuard Whitepaper - Jason Donenfeld
  11. Peer Relays GA - Tailscale Blog, 2026
  12. Headscale - GitHub
  13. FreeBSD Endpoint-Independent NAT - FreeBSD Status Report
  14. magicsock package - Go Packages
  15. disco package - Go Packages
  16. Control and Data Planes - Tailscale Docs
  17. Defined Networking Benchmarks - Defined.net Blog
  18. nat-birthday-paradox calculator - David Anderson, GitHub
  19. Tailscale Encryption - Tailscale Docs
  20. Noise protocol package - Go Packages