前言

在此前,我都是通过一些硬件设备来构建一个私有网络,并且能有一个稳定的公网 IP,外部可以通过设备厂商对应的外部资源来构建一个私有网络,随时随地访问家中设备,如:NAS 。但,人生无常,大肠包小肠,最近很不稳定,于是准备了一个后手方案,防止意外。

之前,就有了解过各种方案,其中 Tailscale 是其中一个,比较青睐它的协议本身,并且现在已经可以自建,协议本身也开源,于是最近就折腾起来了。

一开始了解到 Tailscale 并不是因为它本身,而是它写的一篇有关 NAT 的一篇博客,我觉得是原理解释的非常清晰的一篇博客了,所以我就顺便去看了它本身是做什么的。
https://tailscale.com/blog/how-nat-traversal-works/

有关它本身的原理我建议直接看官方文档,直接看配图就能懂 https://tailscale.com/kb/1151/what-is-tailscale/

安装

安装非常简单,我不过多赘述,记得先去官网注册一个账号

Linux

https://tailscale.com/download/linux

Mac

由于 AppStore 没办法上架国内,所以只能选择 Cli 或者 Standalone
https://tailscale.com/download/mac

建议使用老版本的 cli 工具 https://github.com/tailscale/tailscale/wiki/Tailscaled-on-macOS

1
go install tailscale.com/cmd/tailscale{,d}@v1.38.2

Standalone 版本 在下方链接的最下面一个
https://pkgs.tailscale.com/stable/#macos

使用

Linux

1
2
$ tailscale up       # (any optional arguments)
$ tailscale status

会让你访问一个网址,通过授权就可以了。

MacOS

如果你使用的是 GUI 版本,一定记得要给权限,到隐私下面把权限开了,否则会一直卡主不动

1
2
3
4
5
6
# 启动后台程序
$ sudo $HOME/go/bin/tailscaled
# 开机自启动
$ sudo $HOME/go/bin/tailscaled install-system-daemon
# 删除开机自启动
$ sudo tailscaled uninstall-system-daemon

启动之后到官网的管理后台就可以看到各个设备的情况了。当然你可以再界面或者通过命令行看到各个节点的状态,并且能看到对应的内网 ip。通过内网 ip 就可以直接访问了。

部署私有 DERP 中继服务器

官方的中继服务都不在国内,并且用的人多,不花钱肯定慢,如果有条件还是建议自建。一方面是速度有明显的改善,有的时候突然晚上我会出现非常卡的情况,而自建的延时很低很低。另一方面,自建从心里角度能让你安心,毕竟节点访问就不通过官方服务器了(虽然按照它开源的协议本身,其实中继节点本身无法做什么劫持,不过心里安慰很大)。

条件

  1. 需要你有一个带有公网 ip 的服务器
  2. 需要你有一个备案的域名(虽然我知道你可能没有,但极大建议有一个,方便很多)
  3. 我有 HTTPS 证书(你没有也没事 Tailscale 会帮你自动申请)

部署

自建 DERP Servers 官方文档 https://tailscale.com/kb/1118/custom-derp-servers/

安装

1
go install tailscale.com/cmd/derper@main

启动

1
derper -hostname xxx.com -c=derper/derper.conf -http-port=-1 -a :8443 -certmode manual -certdir /cert-dir/ -stun -verify-clients
  1. hostname 为你的域名
  2. -c 指定的是配置文件存放的路径,没有会自动创建,你也不需要提前创建文件
  3. http-port = -1 是禁用 http ,因为 http 太危险了,这种服务必须加密
  4. -a 指定启动端口,默认占用 443,也就是 HTTPS
    1. 注意:它本身还还需要占用 3478
  5. -certmode manual 证书手动模式,支持手动通过 -certdir 指定证书位置,注意证书文件名词必须为 域名.crt
  6. -verify-clients 必须要加!!!我看很多教程都没有,但是没有这个你的节点就有可能被扫描到被滥用

配置 Access Controls

进入官网的管理界面,配置 Access Controls,仅需加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
// 上面已有的都不动
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {"900": {
"RegionID": 900,
"RegionCode": "derper",
"Nodes": [{
"Name": "1",
"RegionID": 900,
"HostName": "xxx.com",
"DERPPort": 8443,
}],
}},
},
}

其中 DERPPort 为之前你启动时配置的端口,如果你还自定义指定了 STUNPort,那也需要配置一下。

然后重启节点,就可以从官网的控制台查看是否正常。在 machines 中,点击一个节点详情,最下方 Relays,如果出现如下样子,证明已经成功。

1
Relays Relay #900**: 8.59 ms

可能的问题

中继节点启动后,如果出现类似下面的日志不停地有,你需要再中继节点服务器上本地运行一个 Tailscale 就可以了

1
2
derp: 102.72.254.106:56228: client 6e6f64656
rejected: client nodekey:30e6f9e2e9154709095 not in set of peers

起飞🛫

总的来说,使用如果是自建感受还是很不错的,如果非自建,有时候会不太稳定,本人暂时没有出现打洞不成功的情况,一切都非常顺利。

参考链接