WireGuard、Tailscale 与 Headscale 怎么选
Tailscale 是加入控制平面的 WireGuard:了解 NAT 穿透、DERP 中继、180 天密钥过期的代价,并判断 VPS 应选 WireGuard、Tailscale 还是 Headscale。
WireGuard 与 Tailscale:简短结论
WireGuard 与 Tailscale 并不是两种协议之间的选择,因为 Tailscale 使用的就是 WireGuard。Tailscale 使用相同的加密机制和隧道,然后增加了一个控制平面:协调服务器负责交换公钥、分配地址、穿透 NAT(网络地址转换),并实施访问策略。您需要选择的是:希望自行运行多少协调功能。
有三种符合实际的选择。如果只有一台服务器和少量都连接到该服务器的客户端,请使用原生 WireGuard。如果希望所有机器都能互相访问,且无需维护配置文件,请使用 Tailscale。如果希望使用这种网状网络,但不希望由第三方保存节点列表,请使用 Headscale。
控制平面实际带来的功能
原生 WireGuard 不提供节点发现。每个对等节点都由您手动填写一段文本:公钥、AllowedIPs 行,以及在该节点可达时使用的 Endpoint。向包含十台机器的网络添加一台机器,意味着要编辑十个配置文件,因为每一端都需要对方的密钥。因此,几乎所有自行托管的 WireGuard 部署都是中心辐射式:一台具有公网 IP 的服务器,以及只与该服务器通信的客户端。
控制平面不再需要手动编辑。每个节点只需注册一次,就会从 100.64.0.0/10 CGNAT(运营商级 NAT)地址范围获取一个地址,并获知允许其访问的节点公钥。隧道仍然是两个对等节点之间的直接 WireGuard 连接,您的流量不会经过协调服务器。服务器传输的只是元数据:哪些节点存在、哪个公钥属于哪个节点,以及哪些节点可以相互通信。
由此可以获得以下三项具体功能。
NAT 穿透。 两台笔记本电脑分别位于两个家庭路由器后面,彼此之间没有公网 IP。Tailscale 使用 STUN(NAT 会话穿越实用工具)发现两端的外部地址和端口,然后让两端同时发送数据包,使每个路由器先看到出站流,再接受返回数据。穿透失败时,流量会回退到 DERP 中继。DERP 是由 Tailscale 运行的加密中继。由于中继不会持有密钥,您的数据经过中继时仍保持端到端加密。运行 tailscale status,每个对等节点行都会显示 direct 或 relay。运行 tailscale netcheck,可查看距离最近的中继,以及您的网络是否完全允许 UDP。
支持过期时间的密钥轮换。 WireGuard 密钥不会过期。除非您手动删除对等节点配置块,否则三年前签发的密钥仍可永久使用。Tailscale 会让节点密钥过期;截至 2026 年 7 月,新 tailnet 的默认过期时间为 180 天。未重新进行身份验证的机器将停止连接。对于服务器或子网路由器等无人登录的设备,您可以单独关闭密钥过期。
使用策略而非路由控制。 在原生 WireGuard 中,AllowedIPs 同时充当路由表和访问控制列表,因此“alice 可以访问数据库”必须表示为一个 IP 地址范围。Tailscale 使用独立的策略文件,其中的规则可以指定用户、组和标签。规则可以规定 tag:laptop 只能通过端口 5432 访问 tag:db,不能访问其他内容;即使机器获取了新地址,该规则仍然有效。
控制平面会带来哪些代价
协调服务器了解您的网络。它保存每个节点的公钥、节点名称、分配的地址和策略。使用托管式 Tailscale 时,这些信息由您无法控制的公司持有。由于 WireGuard 私钥保留在您的设备上,对方无法读取您的数据包;但对方可以查看您的网络结构。您能否建立连接,还取决于其服务是否正常运行,以及您的账户是否状态正常。这些因素的重要程度,取决于协调服务器遭到入侵或身份账户被盗后,攻击者实际能利用其中信息做什么。Tailscale 的信任模型值得完整阅读。
还有一个容易忽略的代价。每台设备都要运行 Tailscale 守护进程,因此您必须在每台设备上持续安装安全更新。Ubuntu 24.04 中的原生 WireGuard 是随发行版提供的内核模块,会随内核一同更新。
第三个代价是费用。截至 July 2026,Personal 计划免费,最多支持 6 名用户使用不限数量的设备;Standard 计划为每位用户每月 $8;Premium 计划为每位用户每月 $18。家庭用户可以一直免费使用。10 人团队则不能。是否超过免费计划的范围,取决于用户席位数,而不是设备数。在邀请第 7 位用户之前,建议先阅读免费计划实际涵盖的内容。
纯 WireGuard 适用的场景
当网络拓扑确实是中心辐射结构时,应选择纯 WireGuard。使用一台具有公网 IP 的 VPS,另外有三到四台设备连接到该 VPS,且不要求这些设备彼此访问。配置文件可以放在一个屏幕内完成,不需要更新守护进程,不存在账号丢失的问题,也没有任何外部服务介于您和服务器之间。
如果您想了解其他方案所依赖的底层机制,纯 WireGuard 也是合适的选择。在 VPS 上自行搭建 WireGuard VPN 将介绍密钥生成、wg0.conf、IP 转发、NAT 和握手失败问题。tailnet 底层仍在运行这些机制。如果您仍在考虑较早的方案,WireGuard 与 OpenVPN 对比介绍 OpenVPN 仍具优势的四种情况。
安装过程很短:
sudo apt update && sudo apt install -y wireguard
sudo modprobe wireguard && echo ok当每台设备都必须访问其他所有设备时,纯 WireGuard 就不再易于维护。包含 N 个节点的全互联网络需要 N 乘以 N 减一 个 peer 配置块。以六台设备为例,需要手动保持三十个配置块同步;重复的 AllowedIPs 条目会静默地从原本先配置它的 peer 夺走流量,而且不会在任何地方输出错误。
Tailscale 适用的场景
当机器经常移动时,应选择 Tailscale。例如,连接酒店网络的笔记本电脑、使用移动数据的手机,或位于您无法控制的路由器之后的家用服务器。这些场景正是普通 WireGuard 难以处理的情况,因为双方都没有稳定的公网端点可填入 Endpoint。
从官方安装程序安装客户端只需执行一条命令:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale statustailscale up会输出一个 URL。打开该 URL,登录,机器就会加入网络。您无需复制密钥,也无需开放入站端口,因为 daemon 会向协调服务器发起出站连接并保持连接。这也是 Tailscale 节点能够在完全无法控制防火墙的网络上工作的原因。
之后,两个设置可以完成大部分常用功能。子网路由器会将整个 LAN 发布到网络中,因此您无需在每台设备上安装客户端:
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale set --advertise-routes=192.0.2.0/24在管理控制台中批准路由之前,该路由会保持非活动状态。这是有意设计的:节点不能自行向您的网络注入路由。Linux 客户端还需要 sudo tailscale set --accept-routes,因为 Linux 默认不接受已发布的路由。因此,即使服务器端显示路由已批准,在 Linux 笔记本电脑上设置该选项之前,路由仍不会生效。如果您需要这种网络结构,请参阅在 VPS 上运行子网路由器,其中按可避免路由无法正常工作的顺序介绍批准步骤和转发设置。
出口节点会将客户端的所有流量通过一台机器转发。这就是人们通常所说的“VPN”全隧道行为:
sudo tailscale set --advertise-exit-node该标志本身很简单;将 VPS 配置为出口节点介绍后续步骤:在管理控制台中批准路由,然后修复 DNS 和 IPv6 行为,否则流量可能会从错误的路径发出。如果您只需要访问一个 Web 服务,而不是整个网络,请使用serve 和 funnel在单个本地端口前提供 HTTPS。该服务可以仅对 tailnet 开放,也可以对公网开放。
Headscale 适用的场景
Headscale 是协调服务器的开源实现,运行在您自己拥有的 VPS 上。官方 Tailscale 客户端会连接到它,而不是连接托管服务:
sudo tailscale up --login-server https://headscale.example.com数据路径完全不变。它仍然使用 WireGuard;在网络条件允许时,节点之间仍会直接连接。变化在于,节点列表、密钥和策略都存储在您自己拥有的磁盘上的 SQLite 文件中。外部任何人都无法查看您网络的拓扑、禁用您的账户,也不会按用户向您收费。
代价是需要自行维护。现在,您需要运行一个公开的 HTTPS 服务,这意味着需要 DNS 名称、证书,以及能够正确转发 WebSocket 升级请求的反向代理。您需要负责服务的正常运行时间。协调服务器宕机会导致新节点无法注册,已有节点也无法获知变更。Headscale 目前仍低于 1.0 版本,其次要版本发布可能包含破坏性变更,因此每次升级前都应阅读变更日志。将 Headscale 作为您自己的 Tailscale 控制服务器运行介绍了安装过程、config.yaml、预授权密钥以及需要开放的端口。
有一个注意事项经常被人忽略。Headscale 不包含 Tailscale 的全球中继网络。当两个节点无法直接连接时,您需要在自己的服务器上启用内置中继,或将配置指向其他中继。该中继位于单个区域的单台服务器上,而不是覆盖全球的服务器集群。位于地球另一端的节点会明显受到影响。如果您不想自行搭建这一部分,自行托管 NetBird 是将控制平面保留在自有基础设施中的另一种方案,因为其快速入门流程会在一台 VPS 上同时启动管理、信令和中继服务。
如何一次判断
先确认需要彼此通信的机器数量。如果它们都只需与服务器通信,直接使用 WireGuard 即可达到相同效果,所需软件更少。
再确认这些机器是否具有稳定的公网地址。如果大多数机器位于您无法控制的 NAT 后面,就需要控制平面,因为打洞是最困难的部分,不值得自行重新实现。
再确认谁可以了解您网络的拓扑。如果答案不包括外部公司,或者用户数量使按席位计费难以接受,可以运行 Headscale,但需要自行运维控制服务器。如果费用是促使您迁移的主要原因,请在确定迁移前先计算成本,因为您这个规模的团队实际需要支付多少取决于拥有账户的人数,而不是运行的机器数量;这两个数字通常相差很大。
您可以低成本改变决定。三种方案的数据平面使用相同协议,因此从直接使用 WireGuard 迁移到协调式网状网络,只需安装客户端,无需重新设计;从 Tailscale 迁移到 Headscale,则只需让每个节点重新注册到另一台登录服务器。
三者都无法提供的功能
三者都不是防火墙。隧道决定传输哪些数据包,而不决定哪些服务监听端口。通过隧道可访问的服务器,只要有端口保持开放,互联网仍可直接访问这些端口。因此,请继续让 VPS 上的 UFW 防火墙规则发挥作用。Tailscale 的策略文件可以限制其他节点能够访问的内容,但不会影响公网接口。
三者都不提供按服务进行的身份验证,也都不会记录用户连接后执行的操作。请将三者都视为传输层,并在应用中执行登录验证。
FAQ
Tailscale 只是增加了额外步骤的 WireGuard 吗?
Tailscale 的数据路径使用 WireGuard 协议,因此加密方式和隧道本身相同。它增加的是协调功能:密钥交换、地址分配、使用 STUN 和 DERP 中继进行 NAT 穿透、密钥过期,以及使用用户而不是 IP 地址范围的策略文件。原生 WireGuard 将这些工作留给您;当设备在不同网络之间移动时,这些工作会变得复杂。
我的流量会经过 Tailscale 的服务器吗?
通常不会。协调服务器介绍对等端后,对等端通常会直接连接,tailscale status 会在这些对等端行中显示 direct。如果无法建立直接路径,流量会回退到 DERP 中继,此时该行会显示 relay。即使如此,中继传输的仍是加密数据包,也不会持有您的 WireGuard 私钥,因此无法读取数据内容。运行 tailscale netcheck,查看您的网络是否阻止了直接连接所需的 UDP 流量。
我可以将 Headscale 与官方 Tailscale 应用结合使用吗?
可以。Headscale 使用相同的控制协议,因此官方客户端可以通过 sudo tailscale up --login-server https://headscale.example.com 加入。桌面和移动应用也可以指向自定义登录服务器,但每个平台的设置位置不同;移动应用尤其可能要求特定版本。在迁移整个网络前,先测试一部手机。
使用 Tailscale 或 Headscale 时仍需要开放端口吗?
Tailscale 客户端不需要入站端口,因为它会主动连接协调服务器并保持该连接。自行托管的 Headscale 服务器需要入站端口:控制协议使用 443;使用 HTTP-01 证书质询时使用 80;仅在启用内置中继时使用 3478/udp。原生 WireGuard 需要在服务器上开放其 UDP 监听端口,通常为 51820;如果服务商还提供独立的网络防火墙,也需要在那里开放该端口。
三者中哪个速度最快?
吞吐量相同,因为三者都使用 WireGuard 传输数据包。差异体现在连接建立过程和路径质量上。配置正确的 Endpoint 原生 WireGuard 每次都会直接连接。Tailscale 和 Headscale 大多数情况下会直接连接;当网络阻止打洞时,它们会回退到中继,而中继路径会增加延迟。使用 tailscale ping <node> 测量您自己的路径,该命令会报告路径是直接连接还是经过中继;也可以使用 iperf3 测量隧道上的吞吐量。如果直接路径下该数值远低于线路速率,那么问题不在于三者之间的选择;通常原因是路径 MTU 不匹配,无论是否使用控制平面,都会产生相同影响。