部署私有 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.cn.crtderper.hikoutei.cn.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%