简记 TailScale 自建 DERP 服务器流程

你说咕咕咕了快一年的那个项目是不是该提上日程了?

哪个?就是那个,那个……

简记 TailScale 自建 DERP 服务器流程

relay延迟动辄300ms有点难顶。

反正开学期间也挺闲的 虽然要速通三科 折腾了一天就出来了,记录一下。

要不是因为把udp防火墙开成了tcp怎么会卡了一整天呢

Derper 官方文档流程

参考官方文档走流程即可,golang版本1.22可用。

1
go install tailscale.com/cmd/derper@main

完成后,derper二进制文件位于./go/bin/derper

加入证书

假设使用域名derp.example.com

  • 证书文件为derp.example.com.crt,PEM格式
  • 私钥文件为derp.example.com.key

两个文件放在同一目录下备用。

使用acme.sh默认参数申请的证书就可以,不过要改个后缀.cer->.crt

配置项总结

  • 更改默认https/stun端口号

    • 更改默认http端口号/禁用http

      -http-port $port

      $port为-1,则禁用http。建议禁用。

    • 更改默认https端口号

      -a :$port

      $port为端口号。

    • 更改默认stun端口号

      -stun-port $port

      $port为端口号。

  • 指定域名

    -hostname derp.example.com

    请注意证书名称应与此处hostname后的FQDN一致,本例中应为derp.example.com.crtderp.example.com.key

  • 指定证书(手动模式)

    -certmode manual -certdir /path/to/cert

    /path/to/cert为证书文件所在目录,上文两个文件放在同一目录下备用的那个目录。

  • 仅允许你tailscale网络内的客户端连接

    -verify-clients

    这个选项要求你的DERP服务端环境内有Tailscale客户端,且已经加入网络。

防火墙放行

请各显神通。但记住stun端口是udp,https端口是tcp。

测试

通过访问https站点测试

https://$FQDN:$https_port,如https://derp.example.com:443

有显示DERP This is a Tailscale DERP server.即为成功。

通过depprobe测试

1
go install tailscale.com/cmd/derpprobe@latest

准备map.json文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "Regions": {
      "233": {
        "RegionID": 233,
        "RegionCode": "useless-region-code",
        "Nodes": [
          {
            "Name": "test-derp",
            "RegionID": 233,
            "HostName": "derp.example.com", // 这里填写你的DERP服务器域名
            "DERPPort": 443,                // 这里填写你的DERP服务器https端口
            "IPv4": "xx.xx.xx.xx",          // 这里填写你的DERP服务器IPv4地址
            "STUNPort": 3478,               // 这里填写你的DERP服务器stun端口
            "InsecureForTests": true
          }
        ]
      }
    }
  }

完成后转到./go/bin/,执行下列指令:

1
./derpprobe -map file:///path/to/map.json

三个good就是OK的。

在Tailscale网络中的设备上使用Tailscale客户端测试

1
2
3
tailscale netcheck
tailscale status
tailscale ping xx.xx.xx.xx

netcheck中应可以看到新建DERP服务器的延迟,但请注意此处只检测STUN端口是否开放,不保证可用性。

status中可以看到与各个设备之间的连接状态,若成功会在链路上看到relay及你服务器名称。

在Tailscale官网ACL中添加DERP服务器

下文中的900可取900-999之间的任意数字。

第一行被注释掉的意义为禁用官方提供的DERP服务器。若在服务调试过程中且没有备用直连手段,请谨慎开启。

Nodes节中的InsecureForTests选项是为了在测试时不验证证书,若证书可用,正式环境中请删除;若自签名,请保留。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
"derpMap": {
		//"OmitDefaultRegions": true,
		"Regions": {
			"900": {
				"RegionID":   900,
				"RegionCode": "any",
				"RegionName": "any",
				"Nodes": [
					{
						"Name":             "any",
						"RegionID":         900,
						"DERPPort":         443,
						"STUNPort":         3478,
						"IPv4":             "xx.xx.xx.xx",
						"HostName":         "derp.example.com",
						//"InsecureForTests": true,
					},
				],
			},
		},
	},

You are good to go!

Enjoy your DERP server!

Optional: 写入systemd服务

请自行替换以$开头的变量。下文中derper_psk_path只需要目录有权限可写即可,默认值为/var/lib/derper/derper.key

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Tailscale derp service
After=network.target

[Service]
ExecStart=$derper_bin_path \
    -c $derper_psk_path \
    -a :$https_port \
    -http-port -1 \
    -stun-port $stun_path \
    -hostname $host_fqdn \
    -certmode manual \
    -certdir $cert_path \
    -verify-clients
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

Optional: 反向代理

常规写法即可,但在proxy节中需要添加下面两行,参考这里

1
2
proxy_ssl_server_name on;
proxy_ssl_name $host;

且注意proxy_pass后面的地址应为https://

web页面套上一层cloudflare似乎是不影响延迟的。

参考

Official: Custom DERP Servers

反向代理的一个坑,以及解决方案

一篇写的比较全的文章

0%