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

标签: Tailscale

仅有一条评论

  1. -verify-clients=true:选择开启 DERP_VERIFY_CLIENTS 客户端验证功能,服务器将通过本地的 Tailscale 客户端,验证使用 Derper 的是否为本账号下的客户端。

添加新评论

您是第 67967 位访客