Tailscale 搭建 DERP 节点

准备

带公网 ip 的服务器

安装软件

安装 derper

sudo apt install golang-go
go install tailscale.com/cmd/derper@latest
sudo install -m 755 "$(go env GOPATH)/bin/derper" /usr/local/bin/derper

安装 tailscale

可选,用于开启 derper 的客户端验证

客户端验证:derper 只服务同一个网络内的机器,没有被其他人滥用的风险

安装

curl -fsSL https://tailscale.com/install.sh | sh

启动并加入网络

sudo tailscale up

配置 derper

本机配置

如果域名和服务器已经备案,可以跳过获取证书环节

由于我的域名和服务器没有备案,无法使用80或443端口,需要手动获取域名证书,为了方便,直接用 tailscale 提供的域名和证书

tailscale status 可以看到分配的域名,一般是 主机名.xxxx.ts.net,后文用 xxx.ts.net 代替

获取证书

需要在DNS设置页面上开启 HTTPS Certificates点击直达

sudo tailscale cert xxx.ts.net

会在当前目录下生成 xxx.ts.net.crt xxx.ts.net.key 两个文件

将证书文件拷贝到 /var/lib/derper/certs 目录下

配置 systemd 启动

注意根据自己的情况修改

如果没有安装 tailscaled 服务

  • 去掉 After 和 Requires的 tailscaled.service
  • 去掉 -verify-clients

如果域名和服务器备案了

  • 去掉 -certmode=manual
  • 去掉 -certdir=/var/lib/derper/certs
  • 也可去掉 -a=:10443,保持默认使用 443 端口

/etc/systemd/system/derper.service

[Unit]
Description=Tailscale DERP Server
After=network-online.target tailscaled.service
Wants=network-online.target
Requires=tailscaled.service

[Service]
Type=simple
ExecStart=/usr/local/bin/derper \
  -hostname=xxx.ts.net \
  -a=:10443 \
  -http-port=-1 \
  -certmode=manual \
  -certdir=/var/lib/derper/certs \
  -stun \
  -stun-port=13478 \
  -verify-clients
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

启动服务

sudo systemctl daemon-reload
sudo systemctl start derper

服务端配置

打开 Access controls 界面,点击直达

顶层 json 中加入如下配置,注意不要破坏原有 json 文件

"derpMap": {
  "OmitDefaultRegions": false,
  "Regions": {
    "900": {
      "RegionID": 900,
      "RegionCode": "cd",
      "RegionName": "chengdu",
      "Nodes": [
        {
          "Name": "cd1",
          "RegionID": 900,
          "HostName": "xxx.ts.net",
          "IPv4": "x.x.x.x",
          "IPv6": "none",
          "DERPPort": 10443,
          "STUNPort": 13478
        }
      ]
    }
  }
},

注意:

  • OmitDefaultRegions 为 true 就会去掉官方的节点,不过一般推荐保留,不然自己的节点挂了就没了,保留的话,也会自动连接延迟最低的节点,官方节点都在海外,肯定还是自己的快
  • 如果使用的是自己的域名,正常 dns 能解析的话,可以不用写 IPv4
  • 自定义 DERP Region ID 通常使用900–999
  • 每个 Region ID 必须唯一
  • RegionCode 建议使用 2-3 个字母、唯一的小写名称

禁止 derp 节点访问其他节点

可选,这个主要是怕 derp 服务器被攻破的话,家里的设备就全暴露了

在 Access controls 界面建立 tag,点击直达

我这里设置了两个:node derp

derp 服务器设置为 derp,其他节点 tag 均设置为 node

修改 access-rules 为如下内容,点击直达

"grants": [
  {
    "src": [
      "tag:node"
    ],
    "dst": [
      "*"
    ],
    "ip": [
      "*"
    ]
  }
],

tailscale 里面,不存在的规则默认为禁止;上述规则的意思是,node 节点可以访问所有网络;因为默认禁止,非 node 节点无法访问其他内容

需要注意的是 tailscale 的规则没有优先级一说,多个规则是叠加

参考文档

  1. https://tailscale.com/docs/reference/derp-servers/custom-derp-servers