本文将介绍如何在 Ubuntu 服务器上部署 Tailscale 的 DERP 服务器。DERP(“Tailscale’s Distributed Edge Routing Protocol”)服务器用于确保 Tailscale 网络中节点之间的稳定连接,尤其是在某些 NAT(网络地址转换)环境中。
1. 安装 Go 语言
Tailscale 使用 Go 语言进行编译,因此你需要先安装 Go 语言。由于 Ubuntu 默认提供的 Go 版本较旧,我们将使用 Golang 1.23.4 版本。
通过 APT 安装 Go
首先,我们检查系统上可用的 Go 版本:
apt search go-1.23
你会看到类似以下的输出,确认 golang-1.23
已经安装:
golang-1.23/jammy-updates,now 1.23.1-1~22.04 all [installed]
golang-1.23-go/jammy-updates,now 1.23.1-1~22.04 amd64 [installed,automatic]
使用以下命令安装:
sudo apt install golang-1.23
通过 Snap 安装最新版本 Go
如果你需要 Go 语言的最新版本(1.23.4),可以通过 Snap 安装:
snap search go
找到版本 1.23.4 后,执行以下命令安装:
sudo snap install go
配置环境变量
安装完成后,需要设置环境变量以便能够从终端访问 Go:
export PATH=$PATH:/usr/lib/go-1.23/bin
建议将该行添加到 .bashrc
文件中,这样每次登录都会自动加载:
echo 'export PATH=$PATH:/usr/lib/go-1.23/bin' >> ~/.bashrc
source ~/.bashrc
你可以通过运行 go version
来检查 Go 是否安装成功:
go version
配置 Go 代理(针对部分地区)
由于部分地区的网络问题,可能需要设置 Go 代理。使用以下命令来配置国内的 Go 代理:
go env -w GOPROXY=https://goproxy.cn,direct
2. 安装 Tailscale DERP 服务器
使用 Go 安装 Tailscale DERP 服务器:
go install tailscale.com/cmd/derper@latest
安装完成后,DERP 服务器的可执行文件将位于 ~/go/bin/derper
,为了方便使用,可以将其移动到 /usr/bin/
目录:
sudo cp ~/go/bin/derper /usr/bin/
3. 生成 SSL 证书
由于 Tailscale 使用 SSL 加密,DERP 服务器需要一个证书。我们将生成自签名证书(有效期 10 年),并包含 VPS 的 IP 地址。
DERP_IP="0.0.0.0" # 替换为你的 VPS 的 IP 地址
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout ${DERP_IP}.key -out ${DERP_IP}.crt -subj "/CN=${DERP_IP}" -addext "subjectAltName=IP:${DERP_IP}"
此命令将在当前目录下生成两个文件:${DERP_IP}.key
和 ${DERP_IP}.crt
。这将在后续步骤中使用。
4. 启动 DERP 服务器
使用生成的证书启动 DERP 服务器。以下是基本命令:
derper --hostname="0.0.0.0" -certmode manual -certdir ./
您可以通过添加额外的命令参数来自定义 DERP 服务器的配置。以下是常用的参数说明及其用途:
-
-a string
指定服务器的 HTTP/HTTPS 监听地址。格式为":端口"
、"ip:端口"
或 IPv6 地址"[ip]:端口"
。如果未指定 IP,默认监听所有接口。如果端口为 443 和/或-certmode
为manual
,则提供 HTTPS 服务;否则,提供 HTTP 服务。默认值为":443"
。 -
-accept-connection-burst int
设置接受新连接的突发限制。默认值为9223372036854775807
,表示没有限制。 -
-accept-connection-limit float
设置接受新连接的速率限制。默认值为+Inf
,即无限制。 -
-bootstrap-dns-names string
可选参数,指定以逗号分隔的主机名列表,这些主机名会在/bootstrap-dns
下可用。 -
-c string
配置文件的路径。 -
-certdir string
存储证书的目录。如果监听地址使用端口 443,默认目录为/root/.cache/tailscale/derper-certs
。 -
-certmode string
获取证书的模式。可选的模式为manual
或letsencrypt
。默认值为letsencrypt
。 -
-derp
设置是否运行 DERP 服务器。默认值为true
。将其设置为false
,仅运行 bootstrap DNS 功能。 -
-dev
以本地开发模式运行,覆盖-a
参数设置。 -
-hostname string
指定 Let’s Encrypt 主机名。如果端口为 443,默认值为derp.tailscale.com
。 -
-http-port int
设置 HTTP 服务的端口。如果设置为 -1,禁用 HTTP 服务。监听器绑定到-a
标志指定的地址。 -
-mesh-psk-file string
如果指定,该路径包含 mesh 预共享密钥文件,文件内容应为十六进制字符串。空白表示不使用预共享密钥。 -
-mesh-with string
可选参数,以逗号分隔的主机名列表,指定与哪些主机进行 mesh 网络连接。服务器自身的主机名也可以在列表中。 -
-stun
设置是否运行 STUN 服务器。默认值为true
,它会绑定到与-a
标志指定的相同 IP。 -
-stun-port int
设置运行 STUN 服务的 UDP 端口。默认值为3478
。 -
-unpublished-bootstrap-dns-names string
可选参数,以逗号分隔的主机名列表,这些主机名会在/bootstrap-dns
下可用,但不会公开。 -
-verify-clients
通过本地tailscaled
实例验证客户端的身份。
5. 配置为系统服务
为了让 DERP 服务器在系统启动时自动启动,我们将其配置为系统服务。
创建 DERP 服务文件
使用 vim
创建并编辑服务文件:
sudo vim /etc/systemd/system/derp.service
将以下内容粘贴到文件中:
[Unit]
Description=TS Derper
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/usr/bin/derper -a :8443 -http-port -1 -stun -stun-port 3478 -hostname www.baidu.com -certmode manual -certdir /etc/derp -verify-clients
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
启用并启动服务
保存并退出文件(按 Esc
,输入 :wq
)。然后,运行以下命令启动并使服务开机自启:
sudo systemctl daemon-reload
sudo systemctl enable derp
sudo systemctl start derp
查看服务状态:
sudo systemctl status derp
配置定时任务确保 DERP 服务始终运行
由于 DERP 服务器偶尔可能会停止工作,建议配置定时任务确保每 12 小时重新启动一次 DERP 服务。
启用 cron 服务:
sudo systemctl start cron
sudo systemctl enable cron
编辑 cron 任务:
crontab -e
添加以下任务:
0 */12 * * * systemctl start derp
6. 测试 DERP 服务器
在浏览器中访问你的 DERP 服务器地址:
https://0.0.0.0:[设置的端口,默认 443]
如果无法访问,检查 VPS 是否已开放 TCP 443 端口(或者你设置的 -a
端口)和 UDP 3478 端口(或者你设置的 -stun-port
端口)。
7. 在 Tailscale 控制台添加 DERP 服务器
在 Tailscale 控制台中添加你的 DERP 服务器配置,确保其能够被正确识别并作为节点使用。以下是示例配置:
"randomizeClientPort": true, //这里建议设定为true
"derpMap": {
"OmitDefaultRegions": false, // 控制是否启用官方DERP服务器。设置为false启用官方DERP服务器。如果不特别自信,最好不要设置为true,因为在自己搭建的 DERP 服务器出现异常时,官方 DERP 服务器可以作为备选,确保连接正常。
"902": { // 这是一个区域ID为902的DERP服务器配置,通常用于指定具体的区域。
"RegionID": 902, // 唯一标识区域的ID。这个值需要与您所选择的区域一致。
"RegionCode": "xxx", // 区域代码,可以是您选择的区域的代号或标识符。
"RegionName": "xxxxxxx", // 区域名称,可以是描述该区域的名称,便于理解。
"RegionScore": 0.1, // 魔法字段,控制区域的延迟优化。填写0到1之间的值可以让某个区域的DERP服务器延迟显示更低。例如,如果实际延迟是100ms,而您填0.1,后台会将延迟处理为10ms,从而在DERP选择时优选此服务器。如果不需要精确控制,可以忽略此项。
"Nodes": [
{
"Name": "xxxxxxx", // 节点名称,表示这个DERP服务器的名称。
"RegionID": 902, // 该节点所属的区域ID,应该与父级区域ID一致。
"HostName": "www.baidu.com", // 指定该DERP服务器使用的主机名。通常是自签名的域名,用于TLS证书验证。如果选择了自签名证书,推荐使用域名;如果使用的是普通IP地址,也可以填IP地址。
"DERPPort": 8443, // 该DERP服务器使用的HTTPS端口。需要与实际运行的DERP服务的端口一致,默认值通常为443,但在配置中选择了8443。
"IPv4": "x.x.x.x", // 指定主机名对应的IPv4地址。如果使用域名,必须提供IPv4地址,否则DNS解析可能无法正常工作。
"IPv6": "x.x.x.x", // 可选,指定主机名对应的IPv6地址。如果有IPv6支持,可以填写此项。
"InsecureForTests": true, // 在测试环境中,设置为true可以跳过客户端的验证步骤。这是为了方便测试使用,不推荐在生产环境中启用,因为这会降低连接的安全性。
"STUNPort": 3478 // 用于STUN协议的端口,通常是3478。STUN用于NAT穿透,如果需要修改端口,确保与DERP服务的配置一致。
}
]
}
}
将 RegionID
、HostName
、STUNPort
、DERPPort
和 IPv4
替换为你的实际配置,确保 DERP 服务器可以正确连接。
建议开启 randomizeClientPort: true
,这一选项在官方文档中较为隐蔽,但实测开启后,对 NAT 穿透成功率 有显著提升。
开启的原理:
- Tailscale 默认使用 端口 41641 进行连接,而某些网络环境(如 ISP 运营商的限制、绿坝工程或其他网络封锁机制)可能会在光猫层面直接屏蔽该端口,导致打洞失败。
- 开启
randomizeClientPort: true
后,客户端会随机选择可用端口,从而 绕过部分网络封锁,提高连接成功率。
如果你的 Tailscale 网络环境复杂,或者经常遇到 NAT 穿透失败,建议启用此选项,以提升连接稳定性和可用性。
在配置 Tailscale DERP 服务器并确保其正常运行后,建议进行以下操作来验证部署状态:
验证 DERP 服务器状态
-
使用
tailscale netcheck
命令部署完成后,可以运行以下命令来检查 DERP 服务器的状态:
tailscale netcheck
该命令将会检测你的网络配置,并验证是否能够成功连接到 DERP 服务器。它会提供延迟信息、STUN 连接状态以及连接到 Tailscale 网络的其他详细信息。确保输出中没有错误,并且 DERP 服务器的连接状况良好。
-
检查 DERP 服务器的网络连接
如果
tailscale netcheck
命令显示 DERP 服务器无法连接,可以通过以下步骤进行排查:-
检查端口开放情况:确保你 VPS 上的防火墙已开放 443 端口(用于 HTTPS,或者是使用-a设置的端口)以及 3478 端口(用于 STUN或者是使用-stun-port设置的端口)。如果你更改了端口设置,确保相应的端口也已开放。
使用以下命令检查端口是否开放:
sudo ufw allow 443/tcp sudo ufw allow 3478/udp sudo ufw reload
-
检查证书配置:确认在
derper
启动时,指定的证书路径正确且证书有效。确保自签证书中的 IP 信息与你的 VPS 地址一致。 -
检查 DERP 服务器配置:验证
/etc/systemd/system/derp.service
中的配置项是否正确,特别是-a
和-stun-port
等参数是否与实际配置相符。
-
-
测试客户端连接
配置完成后,连接到 Tailscale 网络的客户端设备也应能够成功通过 DERP 服务器进行通信。可以尝试使用 Tailscale 应用在客户端上进行访问,查看是否能够正常连接。
总结
通过上述步骤,你已经成功部署并配置了 Tailscale DERP 服务器,并确保它在系统重启后自动启动以及定期重启以保持稳定性。使用 tailscale netcheck
命令可以检查服务器的状态,并根据需要调整配置。