Tailscale 通识
Posted on July 17, 2023 (Last modified on June 19, 2024) • 5 min read • 2,090 wordsthe application of tailscale
早期在一期播客内,听到 livid 提及 tailscale 的妙用。由此萌生了兴趣,专门去看了看这个产品。tailscale 联合创始人兼首席技术官 David Crawshaw 曾就职谷歌。官方介绍也很详尽,我在此总结下,什么是 tailscale。它是异地组网的一个网络工具,有客户端和服务中继 derper, 基于 WireGuard 构建。
可以在手机,PC, linux 端安装 tailscale 的守护进程,然后通过官方的 derper 中继,联通客户端内网,支持设置 acl 。 使用几个小场景作为例子介绍,方便快速理解这个东西可以做什么。
例子1:我在家怎么访问公司内网自用的测试服务器?
家和公司的电脑都要安装 tailscale 客户端,然后两端同时打开 tailscaled deamon 程序的情况下,在家就可以直接访问公司内网的目标服务器,包含 ssh, web 等全部的端口服务。
例子2:我在公司如何访问家里的威联通 nas ?
平常的解决方案是家内开通运营商的动态 IP, 然后通过 阿里云/腾讯云 域名控制台使用 DDNS 映射家内的 nas, 直接用域名走公网访问家内的 nas 设备。如果家里没有 DDNS,怎么访问?
这个时候就可以使用 tailscale 。威联通在 2022 年及之前是没有在商店中集成 tailscale 的,只可以在 QNAP Store 的三方社区中找到开发者提供的 tailscale 程序。早期三方社区的 tailscale 小程序会出现一个小问题,就是设置 home 局域网内路由出口(如下例子)192.168.2.x 如果和公司内网段 192.168.2.x 出现 IP 网段资源相同的情况下,会有 IP 冲突,影响使用。
## 早期 nas 后台安装完社区插件后,需要手动添加出口路由,否则无法使用。正是这个,导致不可调和的冲突。
./tailscale -socket var/run/tailscale/tailscaled.sock up --advertise-routes=192.168.2.0/24 --advertise-exit-node
2023年中,威联通适配了 tailscale ,官方商店可以直接安装了,经过测试现在就没这个网络冲突的问题了。因此家里设备只要 tailscaled daemon 程序正常运行,且通网的情况下。公司客户端(已安装 tailscaled daemon 也保持正常开启),就可以在公司直接访问家里的 nas 设备了。有点像是物联网,只要两端的设备联网。他们内部直接走中继 derper 就可以互通了。
默认 tailscale 会有自己的中继服务器来转发你局域网内的流量,但是官方的 derper 中继节点的转发速度和延迟,对大陆地区并不友好。 基于此,官方提供了自定义 derper 中继的功能。可以让你在国内设备间访问如丝般顺滑。自建中继可以参考官方和三方的文档。主要分为两个部分:
第一部分:先搭建 derper 服务器。可以用阿里云,腾讯云等轻量化服务器或者家内已开通 ISP 动态 IP 直接在内网机器上安装(使用 DDNS );
第二部分:官方网站的 admin console acl 的配置文件下添加你的 derper 中继;
基于主参考1,在 homelab x86 小主机上自用 docker-compose 创建了 derper 中继的服务器。参考的配置文件如下:
文件目录
root@xx:~/tailscale_derp# tree
├── acl.json.example
├── docker-compose.yaml
└── ssl
├── axx.xx.zone.crt
└── axx.xx.zone.key
derper docker-compose.yaml
version: "3"
services:
derper:
image: ghcr.io/yangchuansheng/derper:latest
container_name: derper
ports:
- 62345:62345
- 3478:3478/udp
volumes:
- ./ssl/:/app/certs/
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
environment:
- DERP_CERT_MODE=manual
#- DERP_CERT_MODE=letsencrypt
- DERP_ADDR=:62345
- DERP_DOMAIN=axx.xx.zone
- DERP_VERIFY_CLIENTS=true
- TZ=Asia/Shanghai
restart: always
acl.json.example
:备份了官方初始的 acl 文件,复制粘贴到了本地。防止 acl 误配, 主要用来记录恢复。
ssl
: 为自己的阿里云 ddns 域名的证书文件目录。
docker-compose.yaml
: 配置文件具体则如上所示。需要将 3478,62345 端口,额外还需要配置路由器的防火墙端口转发暴露到公网给自己的公网域名 axx.xx.zone 使用。
DERP_VERIFY_CLIENTS=true
:主要是防止你的 derper 服务器被盗用而设置的,平时也需要保护好你自己的 derper 中继。
/var/run/tailscale/tailscaled.sock
: 为本机的 tailscaled 的程序进程,我把 docker derper 和 tailscale 的守护进程安装在了同一台 homelab 上。
搭建好 derper 后网页测试打开如下的 URL:
https://axx.xx.zone/62345
注:axx.xx.zone 为你自己的 derper 中转 DDNS 域名, 如果网页结果返回 “derper server” 字样则表示成功。
derper 中继创建成功之后,需要在 admin console 上添加自己的 derper 配置。
acl 局部配置
"groups": {
*******
},
// Access control lists.
"acls": [
*****
],
// ###################### 新增的derper配置
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {"900": {
"RegionID": 900,
// 你自己的自定义的derper名字,举例为examplecust
"RegionCode": "examplecust",
"Nodes": [{
"Name": "1",
"RegionID": 900,
"HostName": "axx.xx.zone",
"DERPPort": 62345,
}],
}},
},
// ###################### End of the cust derper configuration
"ssh": [
****
官网配置好后,本地的 derper 客户端可以使用 tailscale netcheck
检查下延迟,中继 800us 还好。
本地内网 IP 间互 ping, 同城内电信到电信 ping 的延迟在 10ms 内,跨省电信到电信 ping 一般在 50ms 内。
比默认的官方 derper 中继在国内的普遍延迟在几百 ms 要好很多。自建中继后,明显感觉到远程访问很顺滑。
如果你本地电脑用了 clash 记得在 clash 加白你的 DDNS 域名,否则会代理你的中继,操作会卡顿。
root@uub:~/tailscale_derp# tailscale netcheck
*****
Report:
********
* DERP latency:
- examplecust: 800µs ()
docker-compose 中在国内使用 let’s encrypt 会有网络问题因此默认关闭该参数,或者说不做 trick 设置的话,无法很好的使用。当然你可以手动通过三方办法跟新证书,在使用通配符证书时 *.xx.xx.crt/key 的时候,docker derper 内部会存在 derper tls 证书报错,导致 docker derper 中继不得不定期重启才能恢复的问题,这个是官方的一个 bug, 需要持续关注社区的动态,自己 build 跟新镜像。
2022年内,测试问题一直存在,就换用了阿里云免费的年证书,使用就很稳定。唯一不足的是需要每年手动续订免费证书。后续基于新版本会考虑 build 新的镜像,从而使用三方的证书自动续订功能。自定义多中继的问题,暂时没有配置过,原则上也是可以的。官方默认的中继 derper 就支持切换选择。
生产环境下不要在未授权的情况下使用该组网程序,可以在 homelab 和有限的设备内部尝试。虽然当前的 tailscale 功能和安全性,做的相对比较完备,但是也要持续遵守流程安全的问题。避免给公司和自己带来不可挽回的损失。 对比了 zerotier,个人的使用感受是 tailscale 完爆对方。基于 tailscale 的开源应用 headscale 暂时没有使用过。目前免费版本的 tailscale 已经足够自己使用了。