部署私有DERP中继服务器

警告
本文最后更新于 2022-07-23,文中内容可能已过时。

如果在使用Tailscale的过程中,发现连接或者传输速度比较慢,可以看看这篇文章。

问题点

之前我们介绍了如何用Headscale来替代Tailscale官方的控制服务器,并接入各个平台,但现在有个问题。由于家里带宽没有外网,是通过NAT的方式连接的,而且这个还是最复杂的,因此如果我想要从我的mac访问家里的windows,只能通过一台拥有公网的服务器来做中继。

Tailscale有自己的中继服务器,但是都绕过了国内,所以如果通过Tailscale的话,速度会变得很慢,因为我们需要自建中继服务器。

自建私有DERP服务

为了实现低延迟、高安全性,我们可以参考Tailscale 官方文档自建私有的DERP服务器。有两种部署模式,一种是基于域名,另外一种不需要域名,可以直接使用IP,不过推荐大家使用域名,因此我这里不会介绍IP的方法。

原文是直接使用docker,而我是直接在服务器下安装的

安装golang环境

Tailscale项目使用的golang环境比较新,部署自定义derper服务要求golang版本1.16以上。推荐尽可能安装最新的版本。

1
2
wget https://golang.google.cn/dl/go1.18.4.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz

更改环境变量

1
vim /etc/profile
1
2
3
4
5
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
export PATH=$PATH:$GOPATH/bin

保存退出后,执行生效命令

1
source /etv/profile

检查golang是否安装成功

1
go version

安装derper服务

设置go代理,并安装

1
2
go env -w GOPROXY=https://goproxy.cn,direct
go install tailscale.com/cmd/derper@main

检查

1
derper -h

在安装路径下编写启动脚本,由于443端口已经被nginx使用,这个就指定了10443,为准了,

1
vim /usr/local/gopath/bin/runderper
1
2
3
4
#!/bin/sh
cd /usr/local/gopath/bin
nohup ./derper -hostname <HOSTNAME> -c=derper.conf -a :<PORT> -http-port -1 -certdir <CERTDIR> -certmode manual -stun &
echo $! > app.pid
  • -hostname:域名
  • -c:配置文件
  • -a:指定端口
  • -http-port:-1为不使用http端口
  • -certdir:存放证书的文件夹`

然后给文件授予可执行权限

1
chmod +x /usr/local/gopath/bin/runderper

编写停止脚本

1
vim /usr/local/gopath/bin/stopderper
1
2
3
#!/bin/sh
kill `cat app.pid`
rm -rf app.pid

然后给文件授予可执行权限

1
chmod +x /usr/local/gopath/bin/stopderper

/data/cert放入ssl证书,一定要放入derper.hikoutei.com.crtderper.hikoutei.com.key的证书文件。

添加服务脚本

1
vim /etc/systemd/system/derper.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=derper
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/gopath/bin/runderper
ExecStop=/usr/local/gopath/bin/stopderper

[Install]
WantedBy=multi-user.target

启动服务并设置开机启动

1
2
systemctl start derper
systemctl enable derper

至此derper就部署完毕,接下来配置Headscale来使用自定义的的derp服务器了

1
vim /etc/headscale/derp.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
regions:
  900:
    regionid: 900
    regioncode: sh
    regionname: Shanghai
    nodes:
      - name: sh_ali
        regionid: 900
        hostname: <HOSTNAME>
        ipv4: <IP>
        stunport: 3478
        stunonly: false
        derpport: 10443
  • regions:下面的每一个对象表示一个可用区,可用区必须是数字,每个可用区里面可设置多个DERP节点,即nodes
  • 每个可用区的regionid不能重复
  • 每个nodename不能重复
  • regionname一般用来描述可用区,regioncode一般设置成可用区的缩写
  • ipv4字段不是必须的,如果你的域名可以通过公网解析到你的DERP服务器地址,这里可以不填。如果你使用了一个二级域名,而这个域名你并没有在公共DNS server中添加相关的解析记录,那么这里就需要指定IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了

接下来还需要修改Headscale的配置文件

1
vim /etc/headscale/config.yaml
1
2
3
derp:
  paths:
   - /etc/headscale/derp.yaml

修改完配置后,重启headscale服务

1
systemctl restart headscale

在Tailscale客户端上使用以下命令查看目前可以使用的DERP服务器

1
tailscale netcheck

tailscale netcheck只检测3478/udp的端口, 就算netcheck显示能连,也不一定代表10443端口可以转发流量。最简单的办法是直接打开DERP服务器的 URL:https://xxxx:10443,如果看到如下页面,且地址栏的SSL证书标签显示正常可用,那才是真没问题了

derp页面

防止DERP被白嫖

默认情况下DERP服务器是可以被白嫖的,只要别人知道了你的DERP服务器的地址和端口,就可以为他所用。如果你的服务器是个小水管,用的人多了可能会把你撑爆,因此我们需要修改配置来防止被白嫖。

特别声明:只有使用域名的方式才可以通过认证防止被白嫖,使用纯 IP 的方式无法防白嫖,你只能小心翼翼地隐藏好你的 IP 和端口,不能让别人知道

只需要做两件事情:

  1. 在 DERP 服务器上安装 Tailscale。

第一步需要在 DERP 服务所在的主机上安装 Tailscale 客户端,启动 tailscaled 进程

  1. derper 启动时加上参数 --verify-clients

总结

关于中继协议等等更多知识,请查看原始文章

0%