在我的个人网络规划中,tailscale的核心地位越来越突出,其作用也非常明显,所以在查阅部分资料,并了解了相关应用后我最终决定自建DERP中继服务器。提高在国内网络环境下的服务质量,进而提高个人网络综合可用性。

环境介绍

  • 云服务商:Huawei CLoud

  • 主机架构:x86-64

  • 操作系统:Debian11.1

  • tailscale版本:1.62.0

目标环境

  • Golang 版本:1.22.1(当前官网最新版)

  • tailscale DERPer服务器

操作步骤

安装Tailscale客户端

  1. 安装Tailscale客户端,并完成绑定,参考以往文章tailscale的安装配置和使用 | 光溯星河 (tsio.top)

  2. 这里注意,安装完成后不要启动tailscale,或完成绑定后关闭tailscale,因为我出现了tailscale导致的无法联网问题,不知道是不是华为云规则的问题,后续再仔细排查

安装Golang环境

参考文章:Linux 下安装 Golang(适用于1.18及以上版本)_linux 安装golang-CSDN博客

  • 下载Golang,前往官方Release页面挑选适合自己的版本,下载到合适位置

  • 解压文件到/usr/local 目录下

wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz
  • 打开/etc/profile,严格大小写在文末添加如下配置

#golang env config

export GOROOT=/usr/local/go 
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
  • 保存并退出后,执行source /etc/profile ,使配置修改生效

  • 使用go version命令验证是否成功安装

安装derper服务

  • su进入超级用户权限执行以下任务

  • 配置go代理并安装tailscale derper

go env -w GOPROXY=https://goproxy.cn,direct
go install tailscale.com/cmd/derper@main
  • 进入~/go/pkg/mod/[tailscale]/cmd/derper文件夹内执行go编译

go build -o /etc/derp/derper
  • 编译完成后,在该目录下修改cert.go文件,注释以下代码

  • 然后再次编译

  • 执行ls /etc/derp如果显示derper目录则安装成功

注册为系统服务

  • 生成ssl证书,注意修改为自己的域名

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /etc/derp/derp.test.com.key -out /etc/derp/derp.test.com.crt -subj "/CN=derp.test.com" -addext "subjectAltName=DNS:derp.test.com"
  • 编写derper的配置文件

sudo nano /etc/systemd/system/derper.service
  • 将以下内容写入到derper.service文件中

[Unit]

Description=TS Derper

After=network.target

Wants=network.target

[Service]

User=root

Restart=always

ExecStart=/etc/derp/derper -hostname derp.test.com -a :<端口> -http-port 33446 -certmode manual -certdir /etc/derp --verify-clients

RestartPreventExitStatus=1

[Install]

WantedBy=multi-user.target

注意修改域名和-a后的端口。

放行云服务器相关端口

  • tailscale直连端口:TCP 41641

  • derp端口:TCP 与上方文件-a端口保持一致

  • derp stun端口:UDP 3478

启动tailscale

  • sudo tailscale up 将tailscale启动

  • 处理iptables端口规则,解决无法连接外网问题

iptables -L --line-numbers #查看当前规则
iptables -D INPUT <num> #删除num对于的入站规则,本例为1
再输入 iptables -L --line-numbers 就会发现ts-input的规则被删掉了

此时再ping接外网网站就能正常连接了。

  • 启动服务并设置自启规则

sudo systemctl start derper
sudo systemctl enable derper
  • 访问域名+端口看到以下页面表示服务正常运行:

Tailscale Admin后台修改derp服务器

登录后台,进入Access Controls,在ssh前添加如下配置:

	"derpMap": {
		// OmitDefaultRegions 用来忽略官方的中继节点
		"OmitDefaultRegions": true,
		"Regions": {
			// 这里的 901 从 900 开始随便取数字
			"901": {
				// RegionID 和上面的相等
				"RegionID": 901,
				// RegionCode 自己取个易于自己名字
				"RegionCode": "HWCloud-DERP",
				"Nodes": [
					{
						// Name 保持 1不动
						"Name":     "1",
						// 这个也和 RegionID 一样
						"RegionID": 901,
						// 域名
						"HostName": "derp.test.com",
						// 端口号
						"DERPPort": <端口>,
					},
				],
			},
		},
	},

检验

回到终端设备,执行tailscale check,如果DERP latency中显示了刚刚添加的服务器则说明配置添加成功。

image-xgbywaly.png

参考阅读