Tailscale 在很多场景有着广泛应用,k3s
天然有针对它的支持,最近在基于这个方案构建遍布全球的分布式私有网络。官方的 DERP
服务质量并不稳定, 自建后稳定很多,本文记录详细的过程。
申请 ssl 证书
install acme.sh
这里给出了两种源,国内源为个人自用,不保证可用性。
# global
$ curl https://get.acme.sh | sh -s [email protected]
# install acme.sh in china
git clone https://ghproxy.mirror.skybyte.me/https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m [email protected]
因为我的服务器80/443
都被占用,无法采用HTTP
验证,故示例Cloudflare
和DNSPod
两家DNS
验证方法,根据自己实际情况选择即可,其他用法请查阅官方文档 dnsapi。
CloudFlare DNS
# derper.xxx.xxx.com 是你的域名,需要解析到你的服务器
$ CF_Token="xxxxxx" CF_Zone_ID="xxxxxx" acme.sh --dns dns_cf --issue -d derper.xxx.xxx.com
...
[Tue Apr 22 04:54:20 AM PDT 2025] The domain key is here: /root/.acme.sh/derper.xxx.xxx.com_ecc/derper.xxx.xxx.com.key
...
$ mkdir -p /opt/derper/certs
$ acme.sh --install-cert -d derper.xxx.xxx.com --ecc --key-file /opt/derper/certs/derper.xxx.xxx.com.key --fullchain-file /opt/derper/certs/derper.xxx.xxx.com.crt
DndPod DNS Check
# derper.xxx.xxx.com 是你的域名,需要解析到你的服务器
$ DP_Id="xxxxxx" DP_Key=xxxxxx acme.sh --dns dns_dp --issue -d derper.xxx.xxx.com
$ mkdir -p /opt/derper/certs
$ acme.sh --install-cert -d derper.xxx.xxx.com --ecc --key-file /opt/derper/certs/derper.xxx.xxx.com.key --fullchain-file /opt/derper/certs/derper.xxx.xxx.com.crt
配置 Derper
install go
$ GOVERSION=1.23.4 GOARCH=amd64 rm -rf go${GOVERSION}.linux-${GOARCH}.tar.gz && wget https://mirrors.nju.edu.cn/golang/go${GOVERSION}.linux-${GOARCH}.tar.gz -O go${GOVERSION}.linux-${GOARCH}.tar.gz
$ rm -rf /usr/local/go && tar -C /usr/local -xzf go${GOVERSION}.linux-${GOARCH}.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ go version
build derper
go install tailscale.com/cmd/derper@main
cp /root/go/bin/derper /usr/local/bin/
script
/opt/derper/runderper
#!/bin/sh
cd /usr/local/bin/
nohup ./derper -hostname derper.xxx.xxx.com -c=derper.conf -a :1214 -http-port -1 -certdir /opt/derper/certs -certmode manual -stun-port 1214 -verify-clients -stun > console.log 2>&1 &
echo $! > app.pid
/opt/derper/stopderper
#!/bin/sh
kill `cat app.pid`
rm -rf app.pid
/etc/systemd/system/derper.service
[Unit]
Description=Derper service
After=network.target
[Service]
Type=forking
ExecStart=/opt/derper/runderper
ExecStop=/opt/derper/stopderper
[Install]
WantedBy=multi-user.target
Usage
# 开机自启并立即启动
systemctl enable --now derper.service
配置到 Tailscale
在你的 Tailscale
管理界面找到 Access Controls
(直达 )
{
"acls": [
// ...
],
"ssh": [
// ...
],
// ...
"derpMap": {
"OmitDefaultRegions": true, // true 表示不使用官方节点,仅使用自建,默认为 false,按需配置
"Regions": {
"900": {
"RegionID": 900, // 900以上
"RegionCode": "cn-gz", // 区域代码,会在 `tailscale netcheck` 显示
"RegionName": "中国-广州", // 区域名称,会在 `tailscale netcheck` 显示
"Nodes": [
{
"Name": "1",
"RegionID": 900, // 对应上方ID
"HostName": "xxxxx.xxx", // 填写你的DERP服务域名
"DERPPort": 12345, // 你的 DERP 服务端口
"STUNPort": 1214, // 你的 STUN UDP 服务端口
},
],
},
// 更多DERP节点
},
},
// ...
}
检查可用性
# 检查 DERP 连接情况
$ tailscale netcheck
Report:
* Time: 2025-04-22T13:25:12.257986394Z
* UDP: true
* IPv4: yes, xx.xx.xx.xx:59494
* IPv6: no, but OS has support
* MappingVariesByDestIP: false
* PortMapping:
* CaptivePortal: false
* Nearest DERP: xx xx
* DERP latency:
- xx: 9.2ms (xx xx)
- xx: 26.9ms (xx xx)
- xx: 152.7ms (xx xx)
# 检查 Peer 连接情况
$ tailscale status
100.xx.xx.xx xx-node1 YOURNAME@ linux -
100.xx.xx.xx xx-node2 YOURNAME@ linux active; relay "xx", tx 43624652 rx 4118764
References
- 自建Tailscale DERP服务教程
- DERP servers - Tailscale Docs
- [大内网战略(6):自建 Tailscale DERP 中继服务器 保姆级教程](https://zhuanlan.zhihu.com/p/638910565
- 浅探 Tailscale DERP 中转服务
- Self built derper failed. Port 443 is OK by default and other ports are not. #4716
- 说明 - acme.sh github
- dnsapi - acme.sh wiki
- Heath check, what does this mean?
- acmesh-official/acme.sh