TailScale中继服务derper的部署
DERP 即 Detoured Encrypted Routing Protocol,这是 Tailscale 自研的一个协议:
它是一个通用目的包中继协议,运行在 HTTP 之上,而大部分网络都是允许 HTTP 通信的。
它根据目的公钥(destination’s public key)来中继加密的流量(encrypted payloads)。
Tailscale 会自动选择离目标节点最近的 DERP server 来中继流量
Tailscale 使用的算法很有趣,所有客户端之间的连接都是先选择 DERP 模式(中继模式),这意味着连接立即就能建立(优先级最低但 100% 能成功的模式),用户不用任何等待。然后开始并行地进行路径发现,通常几秒钟之后,我们就能发现一条更优路径,然后将现有连接透明升级(upgrade)过去,变成点对点连接(直连)。
因此,DERP 既是 Tailscale 在 NAT 穿透失败时的保底通信方式(此时的角色与 TURN 类似),也是在其他一些场景下帮助我们完成 NAT 穿透的旁路信道。 换句话说,它既是我们的保底方式,也是有更好的穿透链路时,帮助我们进行连接升级(upgrade to a peer-to-peer connection)的基础设施。
1.安装go环境
wget https://golang.org/dl/go1.22.1.linux-amd64.tar.gz
tar -xzf go1.22.1.linux-amd64.tar.gz
sudo mv go /opt/go
sudo ln -s /opt/go/bin/* /usr/local/bin/
设置环境变量
echo "export GOROOT=/opt/go" >> /etc/profile
echo "export GOPATH=/home/root/.go" >> /etc/profile
echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> /etc/profile
source /etc/profile
检查go是否安装成功
go version
2.安装derper服务
go install tailscale.com/cmd/derper@main
如果安装失败,换国内镜像安装:
go env -w GOPROXY=https://goproxy.cn,direct
3.启动derper服务
derper -c=/root/derper.conf -hostname=www.mydomain.com -a=:443 -stun
2024/03/14 23:51:44 STUN server listening on [::]:3478
2024/03/14 23:51:44 derper: serving on :443 with TLS
derper 的参数-hostname
:有效的公网域名,会自动为这个域名申请letsencrypt tls证书。-a
:指定监听的tcp端口,默认为443,非443端口必须使用手动配置证书的方式。-stun
:stun协议的udp端口,health check的时候会用到。-certmode
:获取证书的模式。可能的选项:manual、LetsEncrypt(默认“LetsEncrypt”)-http-port
:提供HTTP服务的端口。设置为-1以禁用。绑定到-a标志中指定的相同IP(默认 80)-stun
:是否运行 STUN 服务器,默认为true-stun-port
:提供 STUN 服务的 UDP 端口(默认3478)-verify-clients
:通过本地实例验证此DERP服务器的客户端
手动证书名称必须与hostname同名,如:
www.mydomain.com.crt和www.mydomain.com.key
且存放在-certdir指定的目录下
tailscale 的协议时常会更新,官方建议时常更新 derper server
go install tailscale.com/cmd/derper@main
4.设置自启动服务
- 创建服务单元文件
vi /etc/systemd/system/derper.service
[Unit]
Description=derper service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/home/root/.go/bin/derper -c=/home/root/derper.conf -hostname=www.mydomain.com -a :18443 -stun -http-port=18180 -verify-clients=true -certmode=manual -certdir=/root/ssl/
[Install]
WantedBy=multi-user.target
- 设置执行权限
chmod 644 /etc/systemd/system/derper.service
- 重新加载Systemd以识别新服务
systemctl daemon-reload
- 启动服务
systemctl start derper.service
- 设置服务开机自启
systemctl enable derper.service
5.配置 ACL
在 Access Controls 最下面最后一个花括号之前,添加以下内容:
注:区域 ID 值的范围为900-999,保留用作自定义、用户指定的区域。
为了保证您的流量仅流经您自己的 DERP 节点,您可以通过在 DERP 映射中设置OmitDefaultRegions
标志来删除 Tailscale 的所有默认 DERP 区域。
"derpMap": {
// 这个是设置不使用官方默认的derp节点
"OmitDefaultRegions": true,
"Regions": {
"971": {
"RegionID": 971,
"RegionCode": "CN",
"RegionName": "China",
"Nodes": [
{
"Name": "derper",
"RegionID": 971,
"HostName": "www.mydomain.com",
"DERPPort": 18443,
},
],
},
},
},
查看tailscale状态
tailscale netcheck
tailscale status
-verify-clients=true:选择开启 DERP_VERIFY_CLIENTS 客户端验证功能,服务器将通过本地的 Tailscale 客户端,验证使用 Derper 的是否为本账号下的客户端。