Tailscale搭建derp中继,不需要域名,纯ip

一、准备工作

(一)所需材料

  1. 阿里云 ECS 服务器

    • 建议选择公网 IP 稳定、配置中等的实例,推荐使用Debian 12系统 ​
  2. TailScale 账号

  3. 客户端设备

(二)防火墙放行

需放行以下端口:

  • UDP/3478 (用于 STUN 协议)
  • TCP/<PORT>(自定义服务端口,需替换为实际端口号)

二、安装 Tailscale 客户端

1
curl -fsSL https://tailscale.com/install.sh | sh

三、安装 Golang

(一)卸载旧版本(如有);

1
sudo apt remove --autoremove -y golang

(二)下载并解压最新版本;

1
2
3
4
5
6
7
8
9
10
11
12

# 替换为官网最新版本号(示例:go1.24.3)

wget https://dl.google.com/go/go1.24.3.linux-amd64.tar.gz
#或者
wget https://go.dev/dl/go1.24.3.linux-amd64.tar.gz

sudo rm -rf /usr/local/go

sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz

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

(三)配置环境变量;

  1. 编辑系统配置文件:
1
vi /etc/profile

在文件末尾添加:

1
2
3
4
5
6
7
export GOROOT=/usr/local/go

export GOPATH=/usr/local/gopath

export GOBIN=\$GOPATH/bin

export PATH=\$PATH:\$GOROOT/bin:\$GOBIN
  1. 刷新环境变量并验证:
1
2
3
source /etc/profile;

go version # 应输出类似 go version go1.24.3 linux/amd64

四、安装 Derper

1
2
3
4
mkdir -p /opt/derper /usr/local/gopath/bin
#如果你的服务器在境内,可以为Go配置代理加速
#go env -w GOPROXY=https://goproxy.cn,direct
go install tailscale.com/cmd/derper@main

五、生成证书

1
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout <自定义路径>/<DOMAIN>.key -out <自定义路径>/<DOMAIN>.crt -subj "/CN=<DOMAIN>" -addext "subjectAltName=IP:<DOMAIN>"

说明:​

  • 首先生成证书,证书是必须的,因为tailscale走的SSL加密
  • <自定义路径>证书保存路径在配置脚本的时候需要使用,例如/opt/certs/x.x.x.x.crt

六、配置脚本

(一)、创建脚本

路径/opt/derper/runderper

1
2
3
4
#!/bin/sh
cd /usr/local/gopath/bin
nohup ./derper --hostname="<DOMAIN>" -verify-clients -certmode manual -http-port -1 -a :<PORT> -certdir <自定义路径> > console.log 2>&1 &
echo $! > app.pid

说明:​

  • 公共服务需移除 -verify-clients 参数
  • <DOMAIN> 替换为公网 IP 或域名
  • <PORT> 替换为防火墙放行的端口号
  • <自定义路径> 生成证书时候自定义的路径

(二)、创建停止脚本

路径/opt/derper/stopderper

1
2
3
#!/bin/sh
kill `cat app.pid`
rm -rf app.pid

(三)、赋予执行权限

1
chmod +x /opt/derper/*

说明:​

  • 如果启动服务失败有可能是执行权限的问题。

(四)、创建服务

路径 /etc/systemd/system/derper.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Derper服务
After=network.target

[Service]
Type=forking
ExecStart=/opt/derper/runderper
ExecStop=/opt/derper/stopderper

[Install]
WantedBy=multi-user.target

(五)、设置开机自启并立即启动

1
2
systemctl enable --now derper.service
systemctl status derper.service # 检查运行状态

正常输出示例

1
2
3
4
5
6
7
8
9
10
11
12
13
● derper.service - Derper服务
Loaded: loaded (/etc/systemd/system/derper.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-06-03 14:38:06 CST; 33min ago
Process: 600 ExecStart=/opt/derper/runderper (code=exited, status=0/SUCCESS)
Main PID: 614 (derper)
Tasks: 7 (limit: 1965)
Memory: 22.9M
CPU: 91ms
CGroup: /system.slice/derper.service
└─614 ./derper --hostname=<DOMAIN> -certmode manual -http-port -1 -a :<PORT> -certdir <自定义路径>

Jun 03 14:38:06 iZ7xvheogbmlay0lurom7aZ systemd[1]: Starting derper.service - Derper服务...
Jun 03 14:38:06 iZ7xvheogbmlay0lurom7aZ systemd[1]: Started derper.service - Derper服务.

七、添加到 Tailscale

(一)配置 DERP 节点映射

  1. 登录 Tailscale 管理界面找到  Access Controls点击直达
  2. 在 derpMap 字段中添加以下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"acls": [
// ...
],
"ssh": [
// ...
],
// ...
"derpMap": {
"OmitDefaultRegions": true, // OmitDefaultRegions 用来忽略官方的中继节点
"Regions": {
"901": {
"RegionID": 901, // 900以上
"RegionCode": "china", // 随便填
"RegionName": "CN Cloud", // 随便填
"Nodes": [
{
"Name": "1", // 随便填
"RegionID": 901, // 对应上方ID
"HostName": "CN", / /这个随便填
"IPv4": "x.x.x.x", // 改成自己的IP
"DERPPort": xxxx, // 自定义服务端口
"InsecureForTests": true, // 因为是自签名证书,所以客户端不做校验
},
],
},
// 更多DERP节点
},
},
// ...
}

(二)自定义 IP 地址池(可选)

nodeAttrs 字段中添加 IP 池规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"acls": [
// ...
],
"ssh": [
// ...
],
// ...
"derpMap": {
// ...
},
"nodeAttrs": [
{
"target": ["autogroup:admin"],
"ipPool": ["100.88.0.0/16"],
},
{ "target": ["group:dev"],
"ipPool": ["100.85.0.0/16"],
},
],
}

注意:禁止使用 Tailscale 保留 IP 段:

  • 100.100.0.0/24
  • 100.100.100.0/24
  • 100.115.92.0/23

八、验证与调试

  1. 检查客户端连接状态:​
1
2
3
tailscale status
tailscale netcheck # 查看是否识别到自定义 DERP 节点
tailscale ping xxxx # ping客户端是否连接,xxxx为客户端名