前言

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

derper安装完成

参数说明

完整说明参考 官方文档

  • -a
    修改Https访问地址, 比如 1.2.3.4:5678, 默认 :443

  • -stun-port
    修改STUN端口, 默认 3478

  • -hostname
    修改主机名

  • -c
    配置文件路径(需要有读写权限)

  • -verify-clients
    验证用户 (需要配置SSL证书才能开启, 开启后只有 Tailscale 入网的客户端能使用此 DERP 节点)

  • -certmode
    证书模式 可选 manualletsencrypt

  • -certdir
    证书目录, 需要有 hostname.crt 和 hostname.key 这两个证书文件

举个例子组合一下就是

derper -a=:9443 -stun-port=3478 -hostname=你的域名 -c=config

对了别忘记在防火墙放行对应的端口

如果配置成功, 访问服务器 IP+端口 可以看到 DERP 的页面

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

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 节点列表

netcheck

再使用命令 tailscale debug derp 节点regionid 查看是否能连接

debug

显示 Successful 就说明连接成功了,下面的报错是因为局域网不支持 IPv6

最后修改:2025 年 01 月 23 日
如果觉得我的文章对你有用,请随意赞赏