Headscale下篇-自定义中转derper

derper是 tailscale 已经开源的 tailscale 中转服务,可以进行自己搭建,不然就是使用 tailscale 提供的 derper 节点,我的体验是在晚上高峰期会比较卡,所以有能力可以自建的话也是比较推荐的,不过相对比前面的设置会麻烦点

第一个就是默认这个是需要 https 的,所以需要给 derper 服务申请个域名,或者有了域名就加个解析,比如 dp.hello.com,申请完域名就需要申请证书了,这个刚好就学习下使用 acme.sh这个工具,还是非常不错的,我用的是腾讯云的域名解析服务,其实是收购的 dnspod 的服务,acme.sh 安装就很简单,一条命令

`

1
curl  https://get.acme.sh | sh

然后成功了之后就要把.zshrc 生效下,默认会把脚本路径加入到当前的 shell 的 rc 文件里,然后就是申请证书,但是有两种方式,一种就是在域名指定的 ip 机器对应的访问路径下放置验证的文件

1
acme.sh  --issue  -d domain.tld -d www.domain.tld  --webroot  /home/wwwroot/domain.tld/

比如这样指定 webroot,另一个中更方便的方式就是通过 dns 认证的方式,我这边以 dnspod 举例,这边要特别注意的是 dnspod 虽然被腾讯云收购,但是这个方式还是需要用 dnspod 原来自己的 api token 验证的

然后拿到生成的 id 跟 token 设置到环境变量里,需要保存好这个 token,后面是看不到了的

1
2
export DP_Id=123456
export DP_Key=xxxxxx

然后就可以用命令进行验证了

1
acme.sh --issue --dns dns_dp -d xxx.hello.com

这个是 dnspod 家的,其他的也可以在这里找到验证方式

申请完成后会把证书放在用户目录下的.acme.sh 目录中,记得把cer文件改成 crt,并且文件名只能是域名 xxx.hello.com.crt,我没试过其他的行不行,从别的文章里看到需要一致,然后就是启动 derper 了

我们通过 docker 的方式,

1
2
3
4
5
6
7
8
9
sudo docker run --restart always \
--name derper -p 12345:12345 -p 3478:3478/udp \
-v /$dir/.acme.sh/xxxxx.hello.com_ecc/:/app/certs \
-v /run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
-e DERP_CERT_MODE=manual \
-e DERP_ADDR=:12345 \
-e DERP_DOMAIN=xxxxx.hello.com \
-e DERP_VERIFY_CLIENTS=true \
-d ghcr.io/yangchuansheng/derper:latest

 前一个端口 12345可以自己随意定,后面$dir改成自己的.acme.sh目录所在的路径,然后

-v /run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \ 这一行 和-e DERP_VERIFY_CLIENTS=true \ 是为了能够让 derper 能够安全一些,就是在本机开一个 tailscale 客户端,连接接到 headscale 服务,可以参考前面的添加节点,然后把这个启动客户端的进程映射进docker里面,因为本身 derper 就没有特别的认证逻辑,所以就让同一个headscale服务的客户端进程来验证是属于同一个headscale服务的节点才允许加入中转,实际这样就跑起来了一个 derper 服务这样可以用 docker 命令查看日志

sudo docker logs -f derper 查看是不是有问题,然后如果没有问题的话还不一定代表 derper 起来了,比较直接的方法就是直接打开域名加上端口的地址,比如 xxxx.hello.com:12345 这个,

image

显示这个就代表服务已经正常启动运行了,然后就是需要修改 headscale 的配置文件了,首先要设置 derper 的配置文件,类似这样

1
2
3
4
5
6
7
8
9
10
11
12
13
regions:
100:
regionid: 100
regioncode: ahk
regionname: Aliyun Hongkong
nodes:
- name: 100a
regionid: 100
hostname: xxxxx.hello.com
ipv4:
stunport: 3478
stunonly: false
derpport: 12345

regionid表示区域 id,一个区域下可以后多个 node,node的 name 是节点的唯一识别码,ipv4 可以不填,有 hostname 就可以,然后stunonly 是 false 表示不只使用 stun还可以使用 derp

然后就是修改 headscale 自身的配置文件,把共用的 derper 配置改成

image

上面的 urls 注释掉,后面的 paths 添加刚才的配置文件路径,这样就可以了,至于连接是不是走的这个

可以用 tailscale netcheck 查看最近的 derper 节点已经延迟,看到使用了自己的 derper 就对了