如何利用 Caddy 搭建 Tailscale 的 Custom DERP Servers

date
May 30, 2022
slug
how-to-deploy-tailscale-custom-derper-servers-by-caddy
status
Published
summary
由于众所周知的原因,国内的宽带网络拿到的 IP 基本都是大内网地址,根本无法在公网被访问,而此时访问家庭内网的资源将非常麻烦。而租用云服务器作为主要服务载体则也存在很多问题,比如说带宽、性能、延迟等等。因此目前来说,很多朋友会使用 frp 等针对特定协议和端口的内网穿透方案,但是这一方案也存在配置繁琐、无法访问家庭内网中任意资源、速度和延时取决于某一个中继服务器等问题。
tags
Tailscale
Wireguard
P2P
VPN
type
Post

为什么用 Tailscale

由于众所周知的原因,国内的宽带网络拿到的 IP 基本都是大内网地址,根本无法在公网被访问,而此时访问家庭内网的资源将非常麻烦。而租用云服务器作为主要服务载体则也存在很多问题,比如说带宽、性能、延迟等等。因此目前来说,很多朋友会使用 frp 等针对特定协议和端口的内网穿透方案,但是这一方案也存在配置繁琐、无法访问家庭内网中任意资源、速度和延时取决于某一个中继服务器等问题。
而针对无法访问家庭内网中任意资源这一痛点,我们可以考虑使用 Wireguard 来搭建 VPN,强烈不建议其他的 VPN 协议。有了 Wireguard 搭建 VPN,我们可以做到使用 VPN 来访问家庭内的所有资源,甚至不需要改变 IP,可以直接使用内网 IP 访问。
同时由于 Wireguard 可以不配置传统 VPN 网关性质的节点,因此可以做到所有节点之间都 P2P 连接的全互联模式。但是如果某个节点没有公网 IP 的话还是得找台中继服务器充当网关才能访问(也有利用 Netmaker 进行 P2P 打洞的做法,但是痛点在于如果打洞失败无法自动改为中继)。
上述方案我大概用了一年多,过程中也遇到了诸如中继服务器挂掉需要重新配置、中继速度慢等等问题。因此也开始寻找解决方案,最终找到了 Tailscale。

Tailscale 是什么

Tailscale 是一个基于 Wireguard 的 VPN 服务。直接使用 Wireguard 会比 Tailscale 性能更好,在 Linux 上,Wireguard 可以作为内核模块,而 Tailscale 是利用 userspace 的 WireGuard 来实现功能。但是经过我的测试发现,两者差距在绝大部分情况下并不大,且在复杂网络环境下 Tailscale 的表现更好。对我来说 Tailscale 相对于 Wireguard 最大的优势有 3 点:
  1. 配置简单
  1. 支持 P2P 和中继自动切换
  1. 支持自建中继节点
另外,关于费用:Tailscale 是收费服务,但是免费服务支持 20 台设备,一个子网网段,完全是够用的(有一个开源的 Headscale,感兴趣可以自己了解)。
可能在我介绍完 Tailscale 之后,有人会说 Zerotier 不也能实现么,为啥不用 Zerotier 呢?其实我在很早之前是用过的,但是在之前我用到的版本中无法强制通过自建 Moon 节点走流量、手机客户端更是不支持加入自建 Moon,所以无奈只能选择放弃了。而且根据我个人的测试,Tailscale 的打洞成功率和性能表现都会相对更加好一点点,当然这个取决于个人网络环境等外在因素,仅供参考。
这里给大家介绍一下 Tailscale 在 2020 年发布的 https://tailscale.com/blog/how-nat-traversal-works/。其中讲述了 NAT 穿透是如何工作的,文章写得很细致,说实话我喜欢 Tailscale 的一个原因就是他们的博客 0.0。这里是这篇文章的中文翻译:https://arthurchiao.art/blog/how-nat-traversal-works-zh/

如何利用 Caddy 搭建 Tailscale 的 Custom DERP Servers

关于 Tailscale 具体怎么使用可以看官方帮助文档,写得很细(本身也简单),所以下面主要介绍一下如何利用 Caddy 搭建 Tailscale 的 Custom DERP Servers

准备工作

  • 一台服务器
  • 一个域名
这里我假定你是有一定的 Docker 背景知识的,如果你不知道什么是 Docker,请自行搜索了解。

编译部署 Caddy

Caddy v2.5.0 后才开始集成 tailscale 插件,因此我因为需要还要用到其他插件所以写了一个 Dockerfile 自行编译https://github.com/xukecheng/caddy/blob/main/Dockerfile
建议直接使用 Beta 版的。
经过测试,现在直接用官方 latest 就可以了。

部署 Custom DERP Servers

如何手动获取 SSL 证书

如果没有 443 端口的权限,所以无法做到自动生成证书,只能手动处理。因此建议不要用持续时间太短的 SSL 证书,建议起码一年期。可以考虑使用腾讯云等云服务商提供的一年免费证书服务。
notion image
生成完成后,下载 Nginx 版本
notion image
然后解压下载的文件,并将其中文件名中的 “_bundle” 去掉并上传到 <cert path>,这样就可以使用非 443 端口提供 Derper 服务了。
 

示例文件

假如你想要 Docker Compose 部署,可以参考下面的内容。

示例 docker-compose.yaml

示例 Caddyfile

假如使用上面的 docker-compose.yaml 进行部署,那么 Caddyfile 可以按照下面的方式进行编写:
 

配置 Access Controls

到这一步还不算完成,我们需要去 Tailscale 配置一下 Acls,入口在这:
notion image
下面是关于如何配置的说明:
 

参考资料