Featured image of post 自建 Tailscale DERP 服务器

自建 Tailscale DERP 服务器

配置 Go 环境

  1. 在 Go 官网查找并下载最新版

    Downloads - The Go Programming Language

  2. 解压并放到 /usr/local 文件夹中

    1
    
    sudo tar -C /usr/local -xvf go1.19.1.linux-amd64.tar.gz
    
  3. 准备 gopath 文件夹。gopath 文件夹建议放在当前用户自己的文件夹里,否则后面安装会提示没有权限。我习惯在个人文件夹的根目录下创建一个 AppData 文件夹存放数据。

    1
    
    mkdir -p ~/AppData/gopath
    
  4. 配置 shell 环境

    编辑 .profile 文件

    1
    
    sudo nano /etc/profile
    

    在最后一行加上(注意这里的 GOPATH 一定要换成你自己刚才创建的那个文件夹)

    1
    2
    3
    4
    5
    
    export GOROOT=/usr/local/go
    export GOPATH=/home/username/AppData/gopath
    export GOBIN=$GOPATH/bin
    export PATH=$PATH:$GOROOT/bin
    export PATH=$PATH:$GOPATH/bin
    

    刷新设置

    1
    
    source /etc/profile
    

    执行 go version 命令,能看到版本就行

安装 DERP

执行下面的命令安装

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

如果安装速度慢,可以配置下国内镜像

1
2
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

准备 DERP 所需内容

域名

准备一个子域名,解析到当前服务器

SSL 证书

准备域名对应的 SSL 证书,注意名字必须是 <域名>.crt 和 <域名>.key,放在某个文件夹里

启动 DERP

启动服务

1
derper -hostname <域名> -c <存放配置文件的路径>/derper.conf -a :<自定义端口> -http-port -1 -certdir <存放证书的路径> -certmode manual -verify-clients

-c 是存放配置文件的地方,默认可以不需要,启动时会自动创建,你选择好位置就行。比如你选在 /home/username/app 下,那你就写 /home/username/app/derper.conf

-a 是自定义端口,如果不设置,默认是 443

-http-port 是服务启的一个测试页面,用于测试服务是否已经启动,默认是 80,如果启动需要 root 权限。为了避免用 sudo 启动,这里直接设置成 -1,关闭这个测试页面

保活的话,可以把这个做成服务或者直接丢到一个 screen 里跑

设置端口映射

如果服务器在内网中,需要把 3478 和你刚才设置的端口暴露到公网中

配置 ACL

要想自己的 Tailscale 内网设备可以使用自建的 DERP 服务器,需要配置 ACL 文件。在配置文件里添加如下一段,注意把里面的信息替换成自己的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
"derpMap": {
		// "OmitDefaultRegions": true,
		"Regions": {
			"xxx": {
				"RegionID": xxx,
				"RegionCode": "xxx",
				"Nodes": [
					{
						"Name":     "xxx",
						"RegionID": xxx,
						"HostName": "xxx",
						"DERPPort": xxx,
					},
				],
			},
		},
	},

防止被滥用

默认情况下,只要别人知道你这个域名,就可以使用你的 DERP 服务器。

要想不被滥用也很简单,因为我们之前已经在启动的时候添加了 -verify-clients flag,所以现在只需要将这台 DERP 服务器也加入到你的 Tailscale 里就行。

Photo by Martin Sanchez on Unsplash