前言
Headscale 是 Tailscale 的开源服务端实现,自建以后可以绑定多个 subnet 不需要购买订阅。
Tailscale 组网后优先选择直连,但是如果 P2P 的节点连通性不佳,就会需要 Derp 节点辅助连接,Tailscale 官方的 Derp 节点速度比较感人,Headscale 本身自带 Derp 功能,但是如果 Headscale 部署的位置比较远,就需要再部署一些 Derp 节点来降低连接延迟,以下是安装过程
安装过程
安装 Go
已经安装过的可以跳过这一步
在 官网 可以找到最新的安装包
假设下载的文件是 go1.23.5.linux-amd64.tar.gz
#解压
tar -xzf go1.23.5.linux-amd64.tar.gz
mv go /usr/local/
#添加 PATH (需要重新登录 SSH 才能生效)
echo "export PATH=\$PATH:/usr/local/go/bin:\$HOME/go/bin" | sudo tee -a /etc/profile
#测试
go version
创建用户
#创建用户
sudo useradd -m -d /opt/derp -s /bin/bash derp
#设置密码(可选)
#sudo passwd derp
安装 Tailscale Derper
#切换到 Derp 用户
sudo - derp
#为 go 设置代理 (https://goproxy.cn/)
#海外地区不需要
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
#安装 Derper
go install tailscale.com/cmd/derper@latest
#测试 Derper
derper -help
参数说明
完整说明参考 官方文档
-
-a
修改Https访问地址, 比如1.2.3.4:5678
, 默认:443
-
-stun-port
修改STUN端口, 默认3478
-
-hostname
修改主机名 -
-c
配置文件路径(需要有读写权限) -
-verify-clients
验证用户 (需要配置SSL证书才能开启, 开启后只有 Tailscale 入网的客户端能使用此 DERP 节点) -
-certmode
证书模式 可选manual
和letsencrypt
-
-certdir
证书目录, 需要有 hostname.crt 和 hostname.key 这两个证书文件
举个例子组合一下就是
derper -a=:9443 -stun-port=3478 -hostname=你的域名 -c=config
对了别忘记在防火墙放行对应的端口
如果配置成功, 访问服务器 IP+端口 可以看到 DERP 的页面
顺便说一下, Derp 如果使用证书或者开启了 -verify-clients 就不能用 nginx 反代, 不然会导致证书校验失败
配置服务
创建文件 /lib/systemd/system/derper.service
, 并输入以下内容
务必使用绝对路径
[Unit]
Description=DERP Server
After=network.target
[Service]
WorkingDirectory=/opt/derp
ExecStart=/opt/derp/go/bin/derper -stun-port=3478 -a=:443 -hostname=你的域名 -c=/opt/derp/config
Restart=always
User=derp
Group=derp
[Install]
WantedBy=multi-user.target
设置服务
systemctl daemon-reload
systemctl enable derper.service
systemctl start derper.service
测试服务
systemctl start derper.service
systemctl status derper.service
配置 Headscale
Derp 节点配置好以后需要在 Headscale 中注册
首先需要新建一个 derp.yaml
文件
# If you plan to somehow use headscale, please deploy your own DERP infra: https://tailscale.com/kb/1118/custom-derp-servers/
regions:
1001:
regionid: 1001
regioncode: custom-derp-server
regionname: Custom Derp Server
nodes:
- name: 1001
regionid: 1001
hostname: chrxw.com
ipv4: 1.1.1.1
ipv6: null
stunport: 3478
stunonly: false
derpport: 443
参数说明
-
regionid
derp 节点的ID, 相同地区的 Derp 节点设置为同一个 Id, 以实现高可用, 否则请设置为不同的 Id -
regioncode
地区代码, 可以随便填写 -
regionname
地区名称, 可以随便填写 -
name
节点名称 -
hostname
derp 节点的域名, 保持和 -hostmane 参数用同一个域名就行 -
ipv4
derp 节点的 IPv4 地址 -
ipv6
derp 节点的 IPv6 地址, 没有的话可以删掉 -
stnport
derp 的 STUN 端口, 保持和 -stun-port 参数一致 -
derpport
derp 的 Http 端口, 保持和 -a 参数一致
最后编辑 /etc/headscale/config.yaml , 把 derp.yaml 文件路径添加到 derp.server.paths
中
derp:
#省略无关配置
urls:
- https://controlplane.tailscale.com/derpmap/default
paths:
- /etc/headscale/derps.yaml
最后重启 Headscale 服务即可
Derp 测试
使用命令 tailscale netcheck
查看当前 Derp 节点列表
再使用命令 tailscale debug derp 节点regionid
查看是否能连接
显示 Successful 就说明连接成功了,下面的报错是因为局域网不支持 IPv6
本文链接:https://blog.chrxw.com/archives/2025/01/22/1780.html
转载请保留本文链接,谢谢