跳到主要内容

Tailscale 跨平台组网全指北

使用前须知
  1. 虽然不需要公网ip但是可能需要一点点魔法上网
  2. 需要魔法环境
  3. 需要具有一点点的命令行基础
  4. 至少具有Google/微软outlook邮箱/Github/apple 账号*1
  5. The most significant thing is patience(放的什么洋P)

聊聊为什么是tailscale

我用tailscale已经一年多了,之前用的derp节点是有个博客扫描了一圈公网发出来的,猜测是用derp端口会返回构建成功的内容做特征,扫出来十几个能用的derp节点(很不道德),测试了几个防偷的节点,发现有几个不防偷,悄悄地改到自己的acl里开始用

magicdns:每个设备之间都可以用magicdns解析对方的ip,比如在我的电脑上我要访问nas,我不管怎么切换网络(热点、公司网、里网,纯v4、纯v6、双栈线路),只要连上之后在浏览器输入nas-fn:5666永远都是飞牛webui主页,这样就不用处理ip变化的问题。

exitnode: 这个安卓机器上是不能同时存在两个vpn软件,会冲突,这就导致我在访问国际互联网的时候没法同时用tailscale访问nas机器,当然可以用工作空间划分出来实现伪双开,但不够优雅,我的解决方案是把nas设置为exitnode,此时tailscale接管机器上的所有流量,访问国际互联网的流量先传回里,在从里机器的软路由上分流出去,最后走里返回来。这样就能同时访问国际互联网和内网资源了。

Subnet router: 那有些设备比如打印机,3D打印机、路由器这类产品,本身可以通过局域网访问,然而在外的时候没法用内网IP访问,这时候把这些设备设置为subnet router,子网路由,允许nas访问无法安装tailscale的设备。比如里的打印机是192.168.1.100,那么nas上设置subnet router,就能在公司的时候访问192.168.1.100也可以直接打印

几句话总结一下

  • 同一个账号/登录方式下的所有设备默认互联
  • 打洞要靠derp,官方默认的derp都在国外打洞成功率不高
  • 先试试,能连上就别管了直接用,打洞慢再去看我改的免备案IPderp

使用教程

注册一个Tailscale账号

点击这里访问Tailscale官网

  1. 进入之后点击左上角开始注册

Tailscale官网注册入口

  1. Tailscale使用SSO登录,使用图中的这些方式登录。选择最常用的登录就可以了,登录后将看到如图的界面,任意选择几个选项,点底下的add next devices

1772244417136

1772245982126

添加NAS为第一个设备

提示

来来来,这里说个坑哈:这个自动安装脚本一行搞定,但其原理其实是执行了这两个程序:第一个是 curl 下载,通过 |(管道)将获取到的脚本内容不落地保存在本地,而是直接传递给后面的 sh 解释器去运行。

那坑在哪儿呢?假如会自己开代理,比如 v2rayN 默认会给局域网开一个允许接入的 HTTP 端口(默认 10810),又恰好 NAS 和电脑在一个局域网里。会很轻易地想到:“欸,curl 有个 -x 参数可以指定代理,那简单啊,直接在 curl 后面加上 -x 电脑局域网IP:10810 不就能让安装快一点儿了”

结果会发现:脚本确实一瞬间下载好了,但在执行安装那一步时依然死死卡住,然后这玩意就不动了 因为加的 -x 参数,只对第一步的 curl 也就是“下载脚本文件本体”生效。而这个脚本本质上是一串很长的指令集,内部还需要调用系统底层包管理器(比如 apt 或者 dnf)去外网拉取好几十兆真正的 Tailscale 安装包。此时由于内部进程并不知道刚才附带了代理, 正确做法:给的 SSH 会话设置全局的临时代理环境变量后再执行。 只需把IP换成本机的真实局域网IP(如果是 clash/v2rayN 去设置里勾选允许局域网连接),像这样写:

export https_proxy=http://192.168.x.x:10810 http_proxy=http://192.168.x.x:10810
curl -fsSL https://tailscale.com/install.sh | sh
  1. 使用SSH工具连接到NAS主机 有各种不同的方式可以连接到 NAS 主机,如果不知道怎么连接,查看这里学习如何通过SSH连接
curl -fsSL https://tailscale.com/install.sh | sh
  1. 按ctrl+shift+v粘贴上方指令到终端中,看到下图红框中的"installation compolete"就安装好了,可能会很慢,具体看网络情况,如果有代理就按上面的走

  2. 接下来是登录Tailscale,使用这条命令

shell sudo tailscale up && sudo tailscale login ‍

  1. 终端中会给出一个链接

  2. 复制链接到浏览器,点击sign in 将NAS设备连接到Tailscale网络中

  3. 此时在后台就已经可以看到的NAS主机了

Windows客户端配置

  1. 添加windows客户端,点击这里下载,正常安装好之后在任务栏找到tailscale的图标

  2. 点击Log in正常登录

  3. 接下来会自动跳转到控制台界面,这里就能看到Tailscale网络中的设备了,用浏览器访问对应主机名加NAS访问端口即可在公网环境下P2P穿回NAS主机。

比如说主机名是nas,NAS访问端口是5666,那么访问链接是nas:5666

image

主机名在左侧的MACHINE下即可看到

安卓客户端配置

📱 Tailscale 安卓客户端

点击下载最新版本 Tailscale Android 应用程序(v1.80.0)

下载完成后,在安卓设备上安装Tailscale应用程序。

点击Login登录,会自动跳转到系统默认的浏览器进行登录连接操作。

这里需要使用之前创建的Tailscale账号登录一下

然后点击这的Connect

当看到这个下方界面的时候就连接成功了,此时可以关掉浏览器回到Tailscale的安卓端

这里点击左上角vpn开关之后就可以看到分配给NAS的虚拟局域网地址,记住这个地址

image

退出当前的登录方式,用分配到的虚拟内网地址重新登录

提示

点击登录ip右侧的图标可快捷切换连接方式(公网/局域网/vpn/fnid)

image

使用tailscale接管互联

tailscale做了这样一件事,他为每个设备分配了一个100.x.x.x的ip,这是一个CGNAT保留网址,用户访问设备的时候,只需要访问这个ip即可,因为实际上可以写一个stun打洞的软件让多个设备通过isp的公网IP映射过来的端口互联,然而现实的网络条件是复杂多变的,在里可以走局域网,在公司需要走stun,旅行的时候又需要蜂窝网络,高效稳定不变的连接是一种奢侈品,tailscale向上提供一个固定IP,背后帮用户通过derp找到设备实现互联

MagicDNS设置

https://login.tailscale.com/admin/machines打开tailscaleweb管理页面,对每个设备的如下信息进行自定义:

参数说明
machine namemagicdns映射使用
machine ipv4虚拟内网IP
key expiry密钥有效期
route setting路由设置

1771978779574

修改机器名称

首先关闭自动从hostname生成,删掉之后改一个短点的比如server或者nas,别写中文我求们了🤣,写完了记得点update name,打开浏览器,飞牛的话直接输改好的机器名称:5666,比如我改成了nas-fn,那么就是nas-fn:5666,这样就可以访问飞牛了。

1771980558674

开启 Subnet Router 子网路由

Subnet Router 子网路由 的作用是让的 Tailscale 设备能够直接访问那些无法安装 Tailscale 客户端的局域网内部设备。 比如:里的老式打印机、旁路由、光猫后台,或者因为系统限制没法装软件的智能居控制端。只要的 NAS(已安装 Tailscale)开启了子网路由功能,在外地就能直接输入里的局域网 IP(比如 192.168.1.100)访问到这些设备。

1. 开启主机的 IP 转发

因为 NAS 需要把 Tailscale 虚拟网络里的流量转发给里的真实局域网里,首先需要在 系统里开启 IP 转发功能。

打开 NAS 的 SSH 终端,逐行执行以下命令(飞牛系统或其他普通 Linux 机器均通用):

# 开启 IPv4 与 IPv6 转发
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf

# 重新加载 sysctl 让配置立即生效
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

2. 宣告局域网网段

接下来,需要让 NAS 告诉 Tailscale 网络:“我可以作为去往某个网段的路由中转站”。

需要知道真正的局域网网段是什么(假设是 192.168.1.0/24,也就是里设备的 IP 都在 192.168.1.X 这个范围)。在终端执行以下命令重新启动 tailscale 进程:

sudo tailscale up --advertise-routes=192.168.1.0/24

(把 192.168.1.0/24 对应换成自己实际分配的局域网网段)

3. 去 控制台 批准路由

出于安全考虑,发布的路由默认是未激活的,别人或者自己的其他设备还用不了。最后一步需要去网页端控制台手动批准: 1772288491726

  1. 打开并登录 Tailscale 管理后台 Machines 页面
  2. 在列表里找到的 NAS 设备,点击它左下方的 Edit route settings点击设备最右侧的三个点 ... 然后选择 Edit route settings 1772288502037
  3. 在弹出的窗口中,找到 "Subnet routes" 这一栏,会看到刚才发布的网段(如 192.168.1.0/24)在那里待同意,将它前面的开关。

设置 Exit Node

Exit Node 能够让把远端设备的所有网络流量,强制代理到里的 NAS 设备上发出。

  • 伪装 IP 与突破地域限制:比如在校外出差,连接上了作为 Exit Node 的 NAS 后,手机的对外公网 IP 就变成了校里的宽带 IP,欸这就能(比划)用IP定位的论文网站比如知网什么的(这东西还是别拿来当梯子用了)
  • 安全上网:在外连接没有密码的免费公共 Wi-Fi 时,打开 Exit Node 就可以加密的所有流量,防止被人抓包窃取信息。可以把里的宽带作为最安全的堡垒机。

注:如果刚才已经开启了子网路由,那么系统底层的 IP转发功能 已经开好了,可以跳过第1步。

1. 开启 IP 转发

与 Subnet Router 的第一步一样,打开 NAS 的终端执行:

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

2. 在 NAS 宣告作为出口节点

在的 NAS 终端执行以下命令,告诉 Tailscale 可以把这台机器作为全局流量出口:

sudo tailscale up --advertise-exit-node

如果想同时宣告Subnet Router 并作为Exit Node,两个参数可以合并在一起执行,例如 sudo tailscale up --advertise-routes=192.168.1.0/24 --advertise-exit-node

3. 去控制台批准出口节点权限

和上面相似,出于安全限制,还需要去网页控制台手动放行:

  1. 登录 Tailscale 管理后台 Machines 页面
  2. 找到的 NAS,点击 Edit route settings
  3. 在弹出的菜单中,找到 "Exit node" 相关的选项,勾选或打开 "Use as exit node"

4. 在客户端上启用 Exit Node

现在 NAS 已经可以准备接管流量了。接下来就是在手机或电脑上按需切换:

  • Windows 客户端:右键点击右下角的 Tailscale 托盘图标 -> 找到 Exit Node 菜单项 -> 在展开的列表里勾选里的 NAS 名字。勾选后的电脑瞬间变回“用宽带体验”。想要关掉的话,在此处重新勾选 None 即可。
  • 安卓/iOS 客户端:打开 App -> 在设备列表的右上部分或左上角菜单里找到 Use exit node... -> 选择里的 NAS -> 瞬间漫游回。不需要时再点进去选回 None