Tailscale 搭建 DERP 节点
准备
带公网 ip 的服务器
安装软件
安装 derper
sudo apt install golang-go
go install tailscale.com/cmd/derper@latest
sudo install -m 755 "$(go env GOPATH)/bin/derper" /usr/local/bin/derper
安装 tailscale
可选,用于开启 derper 的客户端验证
客户端验证:derper 只服务同一个网络内的机器,没有被其他人滥用的风险
安装
curl -fsSL https://tailscale.com/install.sh | sh
启动并加入网络
sudo tailscale up
配置 derper
本机配置
如果域名和服务器已经备案,可以跳过获取证书环节
由于我的域名和服务器没有备案,无法使用80或443端口,需要手动获取域名证书,为了方便,直接用 tailscale 提供的域名和证书
tailscale status 可以看到分配的域名,一般是 主机名.xxxx.ts.net,后文用 xxx.ts.net 代替
获取证书
需要在DNS设置页面上开启 HTTPS Certificates,点击直达
sudo tailscale cert xxx.ts.net
会在当前目录下生成 xxx.ts.net.crt xxx.ts.net.key 两个文件
将证书文件拷贝到 /var/lib/derper/certs 目录下
配置 systemd 启动
注意根据自己的情况修改
如果没有安装 tailscaled 服务
- 去掉 After 和 Requires的 tailscaled.service
- 去掉 -verify-clients
如果域名和服务器备案了
- 去掉 -certmode=manual
- 去掉 -certdir=/var/lib/derper/certs
- 也可去掉 -a=:10443,保持默认使用 443 端口
/etc/systemd/system/derper.service
[Unit]
Description=Tailscale DERP Server
After=network-online.target tailscaled.service
Wants=network-online.target
Requires=tailscaled.service
[Service]
Type=simple
ExecStart=/usr/local/bin/derper \
-hostname=xxx.ts.net \
-a=:10443 \
-http-port=-1 \
-certmode=manual \
-certdir=/var/lib/derper/certs \
-stun \
-stun-port=13478 \
-verify-clients
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启动服务
sudo systemctl daemon-reload
sudo systemctl start derper
服务端配置
打开 Access controls 界面,点击直达
顶层 json 中加入如下配置,注意不要破坏原有 json 文件
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "cd",
"RegionName": "chengdu",
"Nodes": [
{
"Name": "cd1",
"RegionID": 900,
"HostName": "xxx.ts.net",
"IPv4": "x.x.x.x",
"IPv6": "none",
"DERPPort": 10443,
"STUNPort": 13478
}
]
}
}
},
注意:
- OmitDefaultRegions 为 true 就会去掉官方的节点,不过一般推荐保留,不然自己的节点挂了就没了,保留的话,也会自动连接延迟最低的节点,官方节点都在海外,肯定还是自己的快
- 如果使用的是自己的域名,正常 dns 能解析的话,可以不用写 IPv4
- 自定义 DERP Region ID 通常使用900–999
- 每个 Region ID 必须唯一
- RegionCode 建议使用 2-3 个字母、唯一的小写名称
禁止 derp 节点访问其他节点
可选,这个主要是怕 derp 服务器被攻破的话,家里的设备就全暴露了
在 Access controls 界面建立 tag,点击直达
我这里设置了两个:node derp
derp 服务器设置为 derp,其他节点 tag 均设置为 node
修改 access-rules 为如下内容,点击直达
"grants": [
{
"src": [
"tag:node"
],
"dst": [
"*"
],
"ip": [
"*"
]
}
],
tailscale 里面,不存在的规则默认为禁止;上述规则的意思是,node 节点可以访问所有网络;因为默认禁止,非 node 节点无法访问其他内容
需要注意的是 tailscale 的规则没有优先级一说,多个规则是叠加
参考文档
由于个人水平有限,文中若有不合理或不正确的地方欢迎指出改正