Janvh's Blog

Janvh's Blog

自建tailscale derp中转服务器

14
2025-09-29

文章转载

浅探 Tailscale DERP 中转服务 | Kiprey's Blog
本篇主要是记录一下配置derp的过程,基本上所有的内容都是来源于上面的文章,有需要的可以直接查阅上面的文章,写的非常好,过程剖析的很到位,吾辈楷模!

配置要求

  • 公网ip
  • 允许tcp/udp进站

配置derp服务器

安装golang

# 需要最新版的golang
$ wget https://go.dev/dl/go1.25.1.linux-amd64.tar.gz
$ sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.25.1.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin

# 验证安装版本
$ go version
# 配置代理以便于国内vps下载,国外vps不需要配置
$ go env -w GOPROXY=https://goproxy.cn,direct

# 安装tailscale-derper
$ go install tailscale.com/cmd/derper@latest

配置Derp服务并用systemd管理

# 配置环境变量
$ DERP_HOST="dawnz-derp" #这个名字随意,但需要记住后面自签名证书和derpMap需要用  
$ DERP_PORT=8888  
$ STUN_PORT=8889

# 自签名证书
$ mkdir ~/.certdir && cd ~/.certdir
$ openssl genpkey -algorithm RSA -out ${DERP_HOST}.key   
$ openssl req -new -key ${DERP_HOST}.key -out ${DERP_HOST}.csr  
$ openssl x509 -req \
-days 36500 \
-in "${DERP_HOST}.csr" \
-signkey "${DERP_HOST}.key" \
-out "${DERP_HOST}.crt" \
-extfile <(printf "subjectAltName=DNS:%s\n" "${DERP_HOST}")

# 用systemd service启动derp服务
## 1. 如果derp是公用的可以直接启动derp服务即可,但是这样如果别人知道你的ip和port,那么其他人也可以连接,使用你中转服务器的流量。
## 2. 如果配置derp为私有服务器,则需要把中转服务器也作为一个节点,安装tailscaled登录认证,并在启用derp服务时使用 --verify-clients

# 安装tailscaled 并登录验证
$ curl -fsSL https://tailscale.com/install.sh | sh
$ sudo tailscale up
# 注意如果是阿里云的机器,需要启用另外2个参数,要不无法dns出错,无法访问。
$ sudo tailscale up --accept-dns=false --netfilter-mode=off

# 创建tailscale-derp.service
echo "[Unit]  
Description=Tailscale derp service  
After=network.target  
  
[Service]  
ExecStart=/home/${USER}/go/bin/derper \  
    -c /home/${USER}/.derper.key \  
    -a :${DERP_PORT} -http-port -1 \  
    -stun-port ${STUN_PORT} \  
    -hostname ${DERP_HOST} \  
    --certmode manual \  
    -certdir /home/${USER}/certdir \  
    --verify-clients  
Restart=always  
User=${USER}  
  
[Install]  
WantedBy=multi-user.target" \  
	| sudo tee /etc/systemd/system/tailscale-derp.service

# 启动服务
$ sudo systemctl start tailscale-derp.service
# 查看状态
$ sudo systemctl status tailscale-derp.service
# 开机自启动
$ sudo systemctl enable tailscale-derp.service

配置iptables允许端口流量入站并配置安全组

# iptables 配置8888/tcp,8889/udp允许入站
$ sudo iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 8889 -j ACCEPT

# 有些云服务商需要配置安全组,在网页控制台安全组也要配置这两个入站。

配置ACL

Tailscale登录管理控制台,选择 Access Controls

  1. 添加单个中转服务器
    注意:HostName配置和上面的DERP_HOST配置的要相同
...  
{  
	...  
	"acls": [...],  
	...  
	"ssh": [...],  
  ...  
	"derpMap": {  
		"Regions": {  
			"900": {  
				"RegionID":   900,  
				"RegionCode": "Dawnz1",  
				"Nodes": [  
					{  
						"Name":             "dawnz-derp1",  
						"RegionID":         900,  
						"HostName":         "dawnz-derp",  
						"IPv4":             "xx.xx.xx.xx",  
						"DERPPort":         8888,  
						"STUNPort":         8889,  
						"InsecureForTests": true,  
					},  
				],  
			},  
		},  
	},  
  ...  
}
  1. 添加多个中转服务器
...  
{  
	...  
	"acls": [...],  
	...  
	"ssh": [...],  
  ...  
	"derpMap": {  
		"OmitDefaultRegions": false,
		"Regions": {  
			"900": {  
				"RegionID":   900,  
				"RegionCode": "Dawnz1",  
				"Nodes": [  
					{  
						"Name":             "dawnz-derp1",  
						"RegionID":         900,  
						"HostName":         "dawnz-derp",  
						"IPv4":             "xx.xx.xx.xx",  
						"DERPPort":         8888,  
						"STUNPort":         8889,  
						"InsecureForTests": true,  
					},  
				],  
			},  
			"901": {
				"RegionID":   901,
				"RegionCode": "Dawnz2",
				"Nodes": [
					{
						"Name":             "Dawnz-derp2",
						"RegionID":         901,
						"HostName":         "danwz-derp2",
						"IPv4":             "xx.xx.xx.xx",
						"DERPPort":         8888,
						"STUNPort":         8889,
						"InsecureForTests": true,
					},
				],
			},
		},  
	},  
  ...  
}

检查中转服务器的状态

  1. 任意一台节点上利用 $ tailscale netcheck 命令即可查看derp上线情况,有看到延迟即配置完成。
  2. 因为公用服务器延迟很大,我不想用公用服务器,可以配置 "OmitDefaultRegions": true, 看上节的多个derp配置即可

Enjoy!

tailscale的组网能力是真的可以呀,各方面都非常的完全和健壮,免费基本够个人使用了,非常的Nice!
唯一的问题是我用电信5g的手机打洞回家600m的联通宽带,测速的上限一直是50m的带宽,不知道是不是udp限制了,不过也足够使用了。