异地组网工具的讨论以及tailscale Derper部署

写在前面

随着手中设备的不断增多,管理与互联的需求也在快速膨胀。无论是 iPad Pro 与 Windows 主机间的丝滑串流,HomeLab 通过云服务器的反向代理对外服务,还是使用 Portainer 对多台服务器的 Docker 容器进行统一管理,都需要稳定且高效的网络支撑。
相比单纯依赖 Frp 进行内网穿透,我更渴望为这些分布在不同地域的设备打造一个专属内网。评估了 EasyTierZeroTierWireGuard 等多种方案后,Tailscale 成为了我的最终选择——它几乎完美契合了我的使用场景。


选择原因

以下内容仅为个人体验与观点,受限于个人知识面与能力,难免存在不全面或偏颇之处,仅供参考与探讨。

ZeroTier

在组网体验方面,ZeroTier 的表现令人满意,与 Tailscale 相比在稳定性和连接速度上不相上下。然而,由于两者的中转服务器均位于海外,受国内运营商 UDP 限制,仍存在打洞失败的情况。在必要场景下需要自建中继(Derper)以保障通信。相较之下,ZeroTier 的中继部署与配置相对繁琐,且其管理界面偏复古风格,交互体验不够现代化,因此未被列入我的最终方案。

EasyTier

EasyTier 的去中心化异地组网理念颇具新意,从概念上令人眼前一亮。然而,在我阅读其文档(2025-05)并进行实践后,发现无论是命令行还是 GUI 的使用逻辑都较为混乱,学习成本较高。其 GUI 由第三方设计,可视化操作与 JSON 导入功能体验并不友好;日志信息也难以直观定位问题。更为关键的是,iOS 与 Android 设备无法参与组网。这些因素使得我暂时难以将 EasyTier 作为主要的异地组网工具,但仍期待其未来的功能完善。

WireGuard

WireGuard 是一款极为简洁且安全的隧道协议,需自行部署与维护。在隐私性与安全性方面,它几乎无可挑剔,但在我的个人使用场景中,由于缺乏集中化服务支持,整体稳定性不如成品化的异地组网方案。此外,配置与维护需要一定的网络基础,这对于想要“即开即用”的场景而言并非最佳选择。

Tailscale

Tailscale 的综合体验最契合我的需求。它基于 WireGuard 协议,安全性与隐私性有着天然保障,同时提供了完整的集中化管理服务,无需自行搭建复杂的控制节点。其客户端覆盖 iOS、Android、Windows、macOS、Linux 等主流平台,安装与配置都极为简单,几乎可做到“开箱即用”。

在连接稳定性方面,Tailscale 同样依赖海外中转节点,因此在国内网络环境下也会遇到 UDP 打洞失败的情况,但通过自建 Derper 中继即可有效解决。在启用强制中转(Derper)的情况下,Tailscale 会让各节点通过 Derper 中继服务器转发流量,将 WireGuard 数据封装在 TCP(HTTPS)连接中,从而规避国内运营商对 UDP 的限制。综合来看,Tailscale 在易用性、功能完善度与安全性之间达到了较好的平衡,这也是我最终将其作为异地内网核心方案的主要原因。


Derper 的搭建

中转服务器配置

我采用的是 Docker 部署方案,使用域名搭建中转服务(如需使用 IP 搭建可参考下方资料)。

version: '3.8'
services:
  derper:
    image: ghcr.io/yangchuansheng/derper:latest
    container_name: derper
    restart: always
    environment:
      - DERP_CERT_MODE=manual  # 手动设置证书
      - DERP_ADDR=:10080  # 中转端口
      - DERP_DOMAIN=xxx.xxx.com  # 服务器域名
      - DERP_VERIFY_CLIENTS=true  # 验证客户端身份
    ports:
      - "10080:18888"
      - "19999:3478/udp"
    volumes:
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock  # tailscale 客户端进程,用于验证客户端身份
      - /data/certs:/app/certs  # SSL 证书存放地址

Tailscale 配置

Access controls → JSON editor 中,增加以下配置以启用 Derper:

"derpMap": {
"OmitDefaultRegions": false, // 是否不启用官方中转服务器
	"Regions": {
		"900": {
			"RegionID":   900, // tailscale 900-999 是保留给自定义 derper 的
			"RegionCode": "aliyun",
			"RegionName": "GuangZhou",
			"Nodes": [
				{
					"Name":     "1",
					"RegionID": 900, //对应上面的900序号
					"HostName": "xxx.xxx.com", //# 域名
					"DERPPort": 10080, // 中转接口
					"STUNPort": 19999, // UDP接口
					"STUNOnly": false,
				},
			],
		},
	},
},

验证部署是否成功

tailscale netcheck

如输出中包含自建节点,例如:

Nearest DERP: GuangZhou
- aliyun: 27.4ms  (GuangZhou)

尝试Ping组网内的设备

root@ubuntu:~# tailscale ping 100.88.0.1
pong from yuwei-win11 (100.88.0.1) via DERP(aliyun) in 51ms

即可确认已通过中继服务器(Derper)通信。


强制使用中继服务器通信

即使在打洞成功的情况下,由于国内运营商对 UDP 的限制,在异地且非同运营商的环境中,强制通过中转服务器进行通信的整体体验,往往优于直接打洞连接。

Windows

管理员权限打开 PowerShell 执行以下命令:

启用

$reg = "HKLM:\SYSTEM\CurrentControlSet\Services\Tailscale"
$val = "TS_DEBUG_ALWAYS_USE_DERP=true"
if (Get-ItemProperty -Path $reg -Name Environment -ErrorAction SilentlyContinue) {
  $cur = Get-ItemPropertyValue -Path $reg -Name Environment
  if ($cur -notcontains $val) {
    Set-ItemProperty -Path $reg -Name Environment -Value ($cur + $val)
  }
} else {
  New-ItemProperty -Path $reg -Name Environment -Value $val -PropertyType MultiString
}
Restart-Service Tailscale -Force

禁用

$reg = "HKLM:\SYSTEM\CurrentControlSet\Services\Tailscale"
$val = "TS_DEBUG_ALWAYS_USE_DERP=true"
if (Get-ItemProperty -Path $reg -Name Environment -ErrorAction SilentlyContinue) {
  $cur = Get-ItemPropertyValue -Path $reg -Name Environment
  $new = $cur | Where-Object { $_ -ne $val }
  if ($new.Count -eq 0) {
    Remove-ItemProperty -Path $reg -Name Environment
  } else {
    Set-ItemProperty -Path $reg -Name Environment -Value $new
  }
}
Restart-Service Tailscale -Force

Linux

启用

sudo mkdir -p /etc/systemd/system/tailscaled.service.d
echo -e "[Service]\nEnvironment=TS_DEBUG_ALWAYS_USE_DERP=true" | sudo tee /etc/systemd/system/tailscaled.service.d/override.conf
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart tailscaled

禁用

sudo rm -f /etc/systemd/system/tailscaled.service.d/override.conf
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart tailscaled

注意事项

  1. 中转服务器需启动 Tailscale 客户端进程。
  2. /data/certs 内的证书文件名必须为:
    xxx.xxx.com.crt
    xxx.xxx.com.key
  3. 截至 Tailscale 1.84.2 版本,由于 bug,如果同一台 Linux 服务器既作为 DERP 中转服务器,又运行 Tailscale 客户端并启用强制中转,该客户端自身的 Tailscale 会掉线。
    请勿在 DERP 服务器上启用强制中转,否则会导致其自身的 Tailscale 服务中断。

参考资料

  1. 云原生实验室:https://icloudnative.io/posts/custom-derp-servers

  2. Sleepstars 的记录室:https://blog.sleepstars.net/archives/ji-yu-docker-compose

  3. 如何强制Tailscale走Derp中转:https://linux.do/t/topic/752216


异地组网工具的讨论以及tailscale Derper部署
https://blog.yuweinfo.com/2025/08/08/异地组网工具的讨论以及tailscale Derper部署/
作者
YuWei
发布于
2025年8月8日
许可协议