使用域名搭建Tailscale的DERP服务

参考及注意事项

Headscale协调服务器搭建参考: Tailscale纯IP的双栈DERP和Headscale协调服务器搭建

参考: 两种方式自建Tailscale的 DERP 中继教程

注意国内服务器域名需要备案

搭建使用鸡仔云的成都轻量NAT,具有三线入口,无惧QOS

创建derper服务的代码中,已经开启了放白嫖,所以必须将服务器加到tailscale中后才能让其它机器使用自建的derp中转服务器中

derp搭建官方教程: Custom DERP Servers · Tailscale Docs

derp搭建: DERP servers · Tailscale Docs

官方安装文档: Official releases - Headscale

参考: 两种方式自建Tailscale的 DERP 中继教程

非常重要的注意事项

如果使用NAT机搭建derp中转服务器,需要注意,在创建derper服务时,里面的端口要填NAT本地端口,在Access Contorls中要填写映射出去的端口,这一点非常重要。

举例

  • 映射端口
NAT本地端口 NAT映射端口
3478 10001
33445 10002
  • 创建derper服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cat > /etc/systemd/system/derp.service <<EOF
    [Unit]
    Description=TS Derper
    After=network.target
    Wants=network.target
    [Service]
    User=root
    Restart=always
    ExecStart=/root/go/bin/derper -hostname aaa.com -a :33445 -http-port -1 -certmode manual -certdir /usr/local/cert --verify-clients
    RestartPreventExitStatus=1
    [Install]
    WantedBy=multi-user.target
    EOF
  • Access Contorls

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
// *************************主要是以下部分****************************
"derpMap": {
// "OmitDefaultRegions": false, // 忽略官方中继节点配置,自建后就不用官方的小水管了
"OmitDefaultRegions": true,
"Regions": {
// 这里的从900开始随便取数字
"900": {
"RegionID": 900, // 和上面的相等
"RegionCode": "Aliyun-cloud", // 自己取个易于记名字
"RegionName": "Aliyun-cloud1-derper",
"Nodes": [
{
"Name": "900a", // 节点名称
"RegionID": 900, // 这个也和 RegionID 一样
"DERPPort": 10002, // 端口号
"HostName": "aaa.com", // 域名
},
],
},
// 这里可以接着写其它的DERP中继服务配置
//"901": {
// ...
//}
},
},
// *************************主要是以上部分***************************
  • 检查中转服务器是否搭建成功
1
2
# 浏览器输入下面链接(注意是https协议),应该可以看到中转服务器在运行
https://aaa.com:10002

搭建流程

1
2
3
4
# 查看架构
uname -m
# 更新一下软件
apt update && apt upgrade

DERP 搭建

打开33445端口(tcp),3478端口(udp),其中33445端口可以更改

  • 安装go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# go官网:https://go.dev/dl/
# 获取go最新版本
wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz

# 检验go是否安装成功,输出版本号则成功
export PATH=$PATH:/usr/local/go/bin
go version

# 将go加入系统变量
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile

# 更改go使用国内代理源
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
  • 拉取编译derper
1
2
# 拉取编译derper中转服务器
go install tailscale.com/cmd/derper@main
  • 上传域名证书
    1
    2
    3
    # 创建/usr/local/cert文件夹
    # 创建其它文件夹也可以,对应后面的文件夹也需要改动
    sudo mkdir /usr/local/cert

将 ssl 证书上传到/usr/local/cert,只需要上传.key.crt文件

注意:

  1. 上述创建的证书文件夹,只有 root 账号才有权限操作上传证书
  2. 如果没有.crt文件,可将.pem后缀改为.crt
    3.证书的名称要和你的域名保持一致

假设域名为aaa.com,则证书名为aaa.com.crt,私钥名为aaa.com.key

  • 创建 derper 服务
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
cat > /etc/systemd/system/derp.service <<EOF
[Unit]
Description=TS Derper
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/root/go/bin/derper -hostname aaa.com -a :33445 -http-port -1 -certmode manual -certdir /usr/local/cert --verify-clients
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
EOF

## 或者按照以下命令创建
sudo vim /etc/systemd/system/derp.service
# 按`i`进入编辑模式,粘贴如下代码
[Unit]
Description=TS Derper
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/root/go/bin/derper -hostname aaa.com -a :33445 -http-port -1 -certmode manual -certdir /usr/local/cert --verify-clients
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target

注意: /root/go/bin这个路径要根据实际情况更换,这个路径是编译的derper位置,这个路径不是/root/go/bin就是/usr/local/go/bin

  • 启动derper
1
2
3
4
5
6
7
8
# 自启动derper服务
systemctl enable derp

# 启用derper服务
systemctl start derp

# 查看derper状态(是否启动成功)
systemctl status derp
  • 检查中转服务器是否搭建成功
1
2
# 浏览器输入下面链接(注意是https协议),应该可以看到中转服务器在运行
https://aaa.com:33445

注意: aaa.com要换成自己的,端口33445也要根据实际情况更换

  • Access Contorls
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 去官方管理界面Access Contorls中写入如下命令
// Example/default ACLs for unrestricted connections.
{
// Declare static groups of users. Use autogroups for all users or users with a specific role.
// "groups": {
// "group:example": ["alice@example.com", "bob@example.com"],
// },
// *************************主要是以下部分****************************
"derpMap": {
// "OmitDefaultRegions": false, // 忽略官方中继节点配置,自建后就不用官方的小水管了
"OmitDefaultRegions": true,
"Regions": {
// 这里的从900开始随便取数字
"900": {
"RegionID": 900, // 和上面的相等
"RegionCode": "Aliyun-cloud", // 自己取个易于记名字
"RegionName": "Aliyun-cloud1-derper",
"Nodes": [
{
"Name": "900a", // 节点名称
"RegionID": 900, // 这个也和 RegionID 一样
"DERPPort": 33445, // 端口号
"HostName": "aaa.com", // 域名
},
],
},
// 这里可以接着写其它的DERP中继服务配置
//"901": {
// ...
//}
},
},
// *************************主要是以上部分***************************
// Define the tags which can be applied to devices and by which users.
// "tagOwners": {
// "tag:example": ["autogroup:admin"],
// },

// Define access control lists for users, groups, autogroups, tags,
// Tailscale IP addresses, and subnet ranges.
"acls": [
// Allow all connections.
// Comment this section out if you want to define specific restrictions.
{"action": "accept", "src": ["*"], "dst": ["*:*"]},

// Allow users in "group:example" to access "tag:example", but only from
// devices that are running macOS and have enabled Tailscale client auto-updating.
// {"action": "accept", "src": ["group:example"], "dst": ["tag:example:*"], "srcPosture":["posture:autoUpdateMac"]},
],

// Define postures that will be applied to all rules without any specific
// srcPosture definition.
// "defaultSrcPosture": [
// "posture:anyMac",
// ],

// Define device posture rules requiring devices to meet
// certain criteria to access parts of your system.
// "postures": {
// // Require devices running macOS, a stable Tailscale
// // version and auto update enabled for Tailscale.
// "posture:autoUpdateMac": [
// "node:os == 'macos'",
// "node:tsReleaseTrack == 'stable'",
// "node:tsAutoUpdate",
// ],
// // Require devices running macOS and a stable
// // Tailscale version.
// "posture:anyMac": [
// "node:os == 'macos'",
// "node:tsReleaseTrack == 'stable'",
// ],
// },

// Define users and devices that can use Tailscale SSH.
"ssh": [
// Allow all users to SSH into their own devices in check mode.
// Comment this section out if you want to define specific restrictions.
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot", "root"],
},
],

// Test access rules every time they're saved.
// "tests": [
// {
// "src": "alice@example.com",
// "accept": ["tag:example"],
// "deny": ["100.101.102.103:443"],
// },
// ],
}

注意: aaa.com要换成自己的,端口33445也要根据实际情况更换

注意: 只需要在官方管理界面Access Contorls中加入如下部分代码,并做相应更改

1
2
3
4
5
*************************主要是以下部分****************************

代码

*************************主要是以上部分****************************
  • 防止白嫖关键步骤
1
2
3
4
5
6
7
8
9
10
# 服务器安装tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# 下载的tailscale在如下目录
/var/cache/apt/archives

# 然后加入tailscale
tailscale up
# 将云服务器加入tailscale网络中
# 退出tailscale
tailscale logout
  • 检查是否连接中转服务器
1
2
3
4
5
6
7
8
# 查看是否已经连接中转服务器
tailscale netcheck

# 查看中转服务器是不是正常状态,没报错是正常的,出错找之前的步骤
tailscale status

# tailscale ping 工具,ping通则正常
tailscale ping 分配的内网ip

如下为存档

  • 创建脚本
1
2
3
# 启动脚本
sudo vim /root/go/bin/runderper
# 按`i`进入编辑模式,粘贴如下代码
1
2
3
4
#!/bin/sh
cd /root/go/bin
nohup ./derper -hostname aaa.com -c=derper.conf -a :33445 -http-port -1 -certdir /usr/local/cert -certmode manual -verify-clients -stun > console.log 2>&1 &
echo $! > app.pid

注意: #!/bin/sh中的#也需要粘贴进去,在代码中不是注释的意思

注意: 域名aaa.com要换成自己的,端口33445也要根据实际情况更换

注意: cd /root/go/bin这个路径也要根据实际情况更换,这个路径不是在/root/go/bin就是在/usr/local/go/bin

注意: 参数-verify-clients用来防止中继服务被滥用的(被白嫖);如果你有这方面需求,可去掉这个参数

注意: Esc退出编辑模式,:wq保存并退出

1
2
3
# 停止脚本
sudo vim /root/go/bin/stopderper.sh
# 按`i`进入编辑模式,粘贴如下代码
1
2
3
#!/bin/sh
kill `cat app.pid`
rm -rf app.pid

注意: #!/bin/sh中的#也需要粘贴进去,在代码中不是注释的意思

1
2
3
# 给启动脚本和停止脚本赋权
chmod +x /root/go/bin/runderper
chmod +x /root/go/bin/stopderper.sh
  • 创建 derper 服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo vim /etc/systemd/system/derper.service

# 按`i`进入编辑模式,粘贴如下代码

Description=derper
After=network.target

[Service]
Type=forking
ExecStart=/root/go/bin/runderper
ExecStop=/root/go/bin/stopderper.sh

[Install]
WantedBy=multi-user.target

注意: /root/go/bin这个路径要根据实际情况更换,这个路径不是/root/go/bin就是/usr/local/go/bin