Tailscale自建DERP服务器

2026-02-06

什么是DERP?
DERP 即 Detoured Encrypted Routing Protocol,这是 Tailscale 自研的一个协议,它是一个通用目的包中继协议,运行在 HTTP 之上,而大部分网络都是允许 HTTP 通信的。
它根据目的公钥(destination’s public key)来中继加密的流量(encrypted payloads)。
Tailscale 会自动选择离目标节点最近的 DERP server 来中继流量。

Headscale-server 是取代官方server的开源服务器,更加灵活无现在。此文没有涉及到。

**Tailscale **使用的算法很有趣: 所有客户端之间的连接都是先选择 DERP 模式(中继模式),这意味着连接立即就能建立(优先级最低但 100% 能成功的模式),用户不用任何等待。然后开始并行地进行路径发现,通常几秒钟之后,我们就能发现一条更优路径,然后将现有连接透明升级(upgrade)过去,变成点对点连接(直连)。因此, DERP 既是 Tailscale 在 NAT 穿透失败时的保底通信方式(此时的角色与 TURN 类似),也是在其他一些场景下帮助我们完成 NAT 穿透的旁路信道。换句话说,它既是我们的保底方式,也是有更好的穿透链路时,帮助我们进行连接升级(upgrade to a peer-to-peer connection)的基础设施。

https://blog.csdn.net/u010470258/article/details/147090057?spm=1001.2014.3001.5506

https://www.ghostchu.com/tailscale-安利指南-快速向你的好友推销-tailscale/

安装go环境

在控制台进入服务器控制界面,依次运行以下命令。

  • 安装go
1
2
3
apt install -y wget git openssl curl
wget https://golang.google.cn/dl/go1.21.0.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
  • 将go的路径添加到环境变量
1
export PATH=$PATH:/usr/local/go/bin
  • 检查go是否安装成功
1
go version
  • 将添加环境变量输出到profile文件内,这样每次开机可以自动添加环境变量
1
2
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile
  • 以下命令都要在管理员账户下运行,先进入管理员账户
1
su -
  • 增加go安装的国内镜像,加快go install的安装速度(国内必要)
1
2
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

安装derp

  • 下载
1
go install tailscale.com/cmd/derper@main
  • 进入~/go/pkg/mod/[tailscale]/cmd/derper文件夹内,执行go编译
1
go build -o /etc/derp/derper
  • 编译完成后要修改cert.go文件,注释以下三行代码。

cert.go文件位于~/go/pkg/mod/[tailscale]/cmd/derper

  • 然后再次进入derper文件夹内编译一次
1
go build -o /etc/derp/derper
  • 检查derper是否安装成功,成功的话会有derper文件夹
1
ls /etc/derp

配置derp服务器

  • 自签名方式:~~~~生成ssl证书,其中CN=derp.izheteng.online中的网址可以任意填写
1
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /etc/derp/derp.izheteng.online.key -out /etc/derp/derp.izheteng.online.crt -subj "/CN=derp.izheteng.online" -addext "subjectAltName=DNS:derp.izheteng.online"

自签名方式,实际用下来。一直有dns解析问题。换位真实域名证书后,正常使用。

  • 安装并配置 Certbot 获取证书
1
2
3
4
5
# 1. 安装 Certbot
sudo apt update && sudo apt install -y certbot

# 2. 为域名申请证书(自动验证并生成)
sudo certbot certonly --standalone -d derp.izheteng.online
  1. 绕过云厂商防护:使用 DNS 验证(推荐,彻底解决 403 问题)

HTTP 验证容易被云厂商的 WAF / 安全策略拦截,而 DNS 验证只需要在域名解析里加一条 TXT 记录,无需开放 80 端口,是国内服务器申请证书的最优解。

1
2
# 1. 执行 DNS 验证命令
sudo certbot certonly --manual --preferred-challenges dns -d derp.izheteng.online -v

执行后会出现以下提示(关键步骤):

1
2
3
4
5
6
Please deploy a DNS TXT record under the name:
_acme-challenge.derp.izheteng.online.
with the following value:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Press Enter to Continue

  1. 添加 DNS TXT 记录(核心操作)

  2. 登录你的域名服务商后台(比如阿里云域名、腾讯云域名、Cloudflare 等);

  3. 找到域名 izheteng.online 的 DNS 解析设置;

  4. 添加一条 TXT 记录

  5. 保存后等待 1-2 分钟(DNS 生效),再按回车继续 Certbot 流程。

  1. 验证 DNS 记录是否生效(可选)
1
2
# 检查 TXT 记录是否生效(替换成你的真实值)
nslookup -type=TXT _acme-challenge.derp.izheteng.online

如果输出里能看到你添加的字符串,说明记录生效了。

证书生成后会保存在 /etc/letsencrypt/live/derp.izheteng.online/ 目录下:

fullchain.pem:包含服务器证书和中间证书
privkey.pem:服务器私钥

  1. 创建证书软链接(方便 Derper 读取)
1
2
ln -s /etc/letsencrypt/live/derp.izheteng.online/fullchain.pem /etc/derp/derp.izheteng.online.crt
ln -s /etc/letsencrypt/live/derp.izheteng.online/privkey.pem /etc/derp/derp.izheteng.online.key
  1. 自动续期配置(DNS 验证需要手动处理,建议记录)2026-05-08T09:00:00.000+08:00

DNS 验证的证书无法自动续期(因为需要手动加 TXT 记录),你可以:

1
2
# 提前测试续期流程(证书快过期时执行)
sudo certbot renew --dry-run
  • 成derp的配置文件
1
sudo vim /etc/systemd/system/derp.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]

Description=TS Derper
After=network.target
Wants=network.target

[Service]

User=root
Restart=always
ExecStart=/etc/derp/derper -hostname derp.izheteng.online-a :24330 -http-port 24331 -certmode manual -certdir /etc/derp --verify-clients
RestartPreventExitStatus=1

[Install]

WantedBy=multi-user.target

  • 将以下内容写入到derp.service文件中

• 启动derper

1
2
systemctl enable derp
systemctl start derp
  • 检验是否设置成功

在启动derp后可以在浏览器中进入https://IP:PORT (https://116.198.225.163:24330/),如果看到以下网页则说明成功。其中IP是第一步中记录的服务器公网IP,PORT是derp.service中设置的。

在服务器上安装taiscale

  • 运行自动安装脚本
1
curl -fsSL https://tailscale.com/install.sh | sh
  • 启动tailscale并登陆
1
tailscale up

进入登陆网页登陆tailscale账号

  • 重启derp服务
1
2
systemctl daemon-reload
systemctl restart derp

在Tailscale中增加derp服务器

  • 打开tailscale的网页console,

  • 在access control中JSON editor里的’ssh’之前

  • 粘贴以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
"derpMap": {
// OmitDefaultRegions 用来忽略官方的中继节点,一般自建后就看不上官方小水管了,false为启用官方节点,true为不启用官方节点
"OmitDefaultRegions": false,
"Regions": {
// 这里的 901 从 900 开始随便取数字
"901": {
// RegionID 和上面的相等
"RegionID": 901,
// RegionCode 自己取个易于自己名字
"RegionCode": "suq",
"RegionName": "Suqian",
"Nodes": [
{
// Name 保持 1不动
"Name": "1",
// 这个也和 RegionID 一样
"RegionID": 909、1,
// 域名
// "HostName": "derp.izheteng.site",
"IPv4": "116.198.225.163",
// 端口号
"DERPPort": 24330,
},
],
},
},
},

检测是否配置成功

  • 在自己的电脑上输入以下命令:
1
tailscale netcheck

如果在DERP latency中出现自己刚才设置的服务器Suqian,即为安装成功。

  • 自建前后ping测对比:

  • 原生ACL配置

文章目录
  1. 1. 安装go环境
  2. 2. 安装derp
  3. 3. 配置derp服务器
  4. 4. 在服务器上安装taiscale
  5. 5. 检测是否配置成功