在已部署的 Tailscale 网络中添加 DERP 私有节点可以显著提升网络性能和安全性(未必,可能需要防范中间人攻击)。 本文将描述如何在不使用域名和 SSL 证书的情况下,仅依赖一枚公网IP地址,在现有 Tailscale 网络中添加一个 DERP 节点。

什么是 DERP?

DERP 是 Tailscale 使用的中继协议,用于在 NAT 打洞失败时帮助节点之间相互通信。 私有 DERP 服务器可以提供更好的隐私保护和更低的延迟。

前提条件

  • 一台具有公网 IP 地址的服务器或 VPS,或者随便什么他妈的云,只要有公网 IP 地址就可以的。
  • 基本的命令行操作能力的人。
  • 你的私有网络,已经可以通过 Tailscale 的公共服务进行互联互通,确保你的 Tailscale 网络已经可以正常使用。
  • 安装好的 Golang 环境,可以进行 Go 程序编译

部署步骤

1. 将用于部署 DERP 服务的 VPS 加入到 Tailscale 网络

确保你新采购的服务器或 VPS 资源,已经接入到你的 Tailscale 网络,这样做有助于直接开启 DERP 的认证模式。

2. 下载和编译安装 DERPER

(1)首先从 Go PKG 上 install DERPER 的源码

go install tailscale.com/cmd/derper@latest

(2)然后进入文件夹 ~/go/pkg/mod/[tailscale]/cmd/derper, 修改文件 vim cert.go 删掉验证相关内容:

if hi.ServerName != m.hostname {
   return nil, fmt.Errorf("cert mismatch with hostname: %q", hi.ServerName)
}
# 这部分代码注释掉

(3)编译 DERPER: go build -o /etc/derp/derper

3. 给 DERPER 做一个开机自启动服务,使用 SystemD

[Unit]

Description=TS Derper
      
After=network.target
      
Wants=network.target
      
[Service]
      
User=root
      
Restart=always
      
ExecStart=/etc/derp/derper -hostname derp.mylab.internal -a :10333 -certmode manual -certdir /etc/derp --verify-clients
      
RestartSec=5

StartLimitInterval=0
      
[Install]
      
WantedBy=multi-user.target

保存到 /etc/systemd/system/derp.service

4. 创建自签名证书给 DERPER 使用

使用如下命令行创建一组公钥和私钥:

openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes -keyout /etc/derp/derp.mylab.internal.key -out /etc/derp/derp.mylab.internal.crt -subj "/CN=derp.mylab.internal" -addext "subjectAltName=DNS:derp.mylab.internal"
#里面参数根据自己需求改改

5. 启动DERP服务器

使用以下命令启动DERP服务器:

systemctl restart derp
systemctl enable derp

6. 配置 Tailscale 以使用私有 DERP 服务器

打开 Tailscale Admin Console, 点击 Access Controls, 把一下内容复制在ssh上面:

"derpMap": {
  "OmitDefaultRegions": true, // 如果为true,即不使用 Tailscale 的默认 DERP 节点
  "Regions": {
   "900": {  // 可以是任意大于 900 的数字
 		 "RegionID":   900, // 同上
  		 "RegionCode": "myDerp",
 		 "Nodes": [
 			 {
 				 "Name":             "1", 
 				 "RegionID":         900, // 同上
 				 "HostName":         "xxx.xxx.xxx.xxx", // 你的 IP
 				 "DERPPort":         12345, // 你的 port
 				 "InsecureForTests": true, // 必须为 true,以跳过证书验证 # 这里其实不安全,防不住基于SSL证书的中间人攻击
 			 },
 		 ],
 	 },
  },
 },
# 其中主要注意的就是 HOSTNAME 要指定为 VPS 的公网 IP 地址,还有端口号要对应上

验证设置

要验证 DERP 服务器是否正常工作,可以在 Tailscale 网络中的任何设备上运行:

tailscale netcheck

如果工作正常,应该能看到您的自定义 DERP 服务器被列出并可用,并且不会提示什么错误。

资料参考: Tailscale 不需要域名和SSL证书,自建DERP中继服务 tailscale自建derp中继可以不用域名和不用443端口吗 FR: support using self-signed ip-only certificate in custom DERP server #11776 Custom DERP Servers 无需域名,自建 Tailscale Derp 节点