自建 Derp 中继节点

发布于:2025-06-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

第一次搞的时候很久都不通,最近618腾讯云搞活动弄了一台机器,再搭建一次好像又挺简单的了,没几分钟就搞定了。这里还是记录一下操作过程。

安装 Golang

还好我们平时就是Go语言开发,这一步驾轻就熟了。不过要注意国内比较难直接从官方下载Golang安装包。可以从阿里云的镜像上拉取。

我安装的是 1.24 最新版:https://mirrors.aliyun.com/golang/go1.24.3.linux-amd64.tar.gz

下载后,是一个 tar.gz 压缩包。解压一下。

tar -xzvf go1.24.3.linux-amd64.tar.gz

然后,把Go加到环境变量,修改.bashrc

export GO_HOME="~/go1.24.3"
export PATH=$PATH:"$GO_HOME/bin"

⚠️ 注意:因为解压后默认目录名是 go,容易和默认的GOPATH重合,所以我改了一下名字是go1.24.3

安装Derp

go install tailscale.com/cmd/derper@main

这一步没啥可说的。

生成自签名证书

DERP_IP="12.12.12.12"
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout ${DERP_IP}.key -out ${DERP_IP}.crt -subj "/CN=${DERP_IP}" -addext "subjectAltName=IP:${DERP_IP}"

最好把生成的这两个文件放到一个单独目录中,例如~/derp/下。

运行服务

sudo /home/ubuntu/go/bin/derper --hostname="12.12.12.12" -c derp.conf -a :18476 -certmode manual -certdir ./
  • hostname 用于指定绑定的域名,现在新版本的derper也支持绑定IP了
  • c:用于指定derper的配置文件,如果配置文件不存在,会自动生成一个默认的,所以这一步可以不用预先生成;但必须指定文件
  • a:指定derper绑定的地址,这里主要用于修改端口为自定义端口
  • certmode:设置为 manual 用于手动指定证书
  • certdir:证书目录位置,因为我是在证书目录下执行的,所以直接./

⚠️ 注意:必须使用 sudo 权限才能运行,否则会报权限不足。

配置防火墙

一般现在的云服务厂商都会有类似「安全组策略」或者「防火墙」之类的功能,只允许指定的端口访问。这里我们开了一个自定义的 18476 端口,就必须配置 18476 端口允许外部进行访问才行。

以腾讯云为例:

Tailscale 配置

去到 Tailscale 的 admin 控制台网页,修改 Access control。https://login.tailscale.com/admin/acls/file

在 acls 的下方增加 derpMap 配置:

// Example/default ACLs for unrestricted connections.
{
	// 省略部分默认配置……
	"acls": [
		// 省略部分默认配置……
	],
	"derpMap": {
		"OmitDefaultRegions": true,
		"Regions": {
			// 这里的 901 从 900 开始随便取数字
			"901": {
				// RegionID 和上面的相等
				"RegionID": 901,
				// RegionCode 自己取个易于自己名字
				"RegionCode": "tencent",
				"RegionName": "Guangzhou",
				"Nodes": [
					{
						"Name":             "custom",
						"RegionID":         901,
						"HostName":         "12.12.12.12",
						"DERPPort":         18476,
						"InsecureForTests": true,
					},
				],
			},
		},
	},

	// 省略部分默认配置……
}

验证

去到客户端执行 tailscale netcheck

tailscale netcheck

Report:
	* Time: 2025-06-05T09:34:53.161265896Z
	* UDP: false
	* IPv4: (no addr found)
	* IPv6: no, but OS has support
	* MappingVariesByDestIP: 
	* PortMapping: 
	* CaptivePortal: false
	* Nearest DERP: Guangzhou
	* DERP latency:
		- tencent: 7.8ms   (Guangzhou)

我发现windows、linux上安装的 tailscale 默认都会带 tailsacle 的命令行工具。唯独 MacOS 上没有。

后经我研究发现 MacOS 上的 tailscale 也是可以有命令行模式的:

/Applications/Tailscale.app/Contents/MacOS/Tailscale netcheck

Derp 服务化

默认你只能在当前 Shell 运行命令启动 derper,不方便运维。总不能一直开着 shell,或者一重启机器就要重新人工执行命令。

最好的方案是将 Derp 制作成 Ubuntu 的 Service,然后设置开机启动。

生成服务配置文件:/etc/systemd/system/derp.service

[Unit]
Description=TS Derper
After=network.target
Wants=network.target

[Service]
User=root
Restart=always
ExecStart=/home/ubuntu/go/bin/derper --hostname="12.12.12.12" -c /home/ubuntu/derp/derp.conf -a :18443 -certmode manual -certdir /home/ubuntu/derp/
RestartPreventExitStatus=1

[Install]
WantedBy=multi-user.target

⚠️ 注意:这里不再是在derp目录下执行了,所以-c-certdir指定的路径都必须是绝对路径。

然后执行如下命令:

# 开机启动
sudo systemctl enable derp
# 现在立即启动
sudo systemctl start derp

去到客户端执行 tailscale netcheck

tailscale netcheck

Report:
	* Time: 2025-06-05T09:58:17.150311805Z
	* UDP: false
	* IPv4: (no addr found)
	* IPv6: no, but OS has support
	* MappingVariesByDestIP: 
	* PortMapping: 
	* CaptivePortal: false
	* Nearest DERP: Guangzhou
	* DERP latency:
		- tencent: 7.5ms   (Guangzhou)

网站公告

今日签到

点亮在社区的每一天
去签到