Skip to content

方便、安全远程访问 fnOS - Tailscale

fnOS 官方自带远程访问,应对基本的小流量需求应该没啥问题,但如果是需要高带宽的场景,使用人数过多的话,官方提供的中转服务可能也撑不住,所以推荐使用 ipv6 来远程访问。除了 ipv6 之外,也有很多其它的选择,比如 Zerotier,Tailscale,星空组网等等,都很不错,可以作为替代方案。本篇将介绍如何使用 Tailscale 远程访问 fnOS。

提示

Tailscale,Zerotier,星空组网的组网逻辑都类似,都是首先尝试是否能够 P2P 直连(打洞)成功,如果无法直连,就会走中转服务器。

获取 Auth key

注册登录 Tailscale,依次点击 Machines -> Add device -> Linux Server -> Generate install script 获取 Auth key

复制截图中 --auth-key= 后面的 Auth key 字符串备用。

fnOS 安装 Tailscale

在 fnOS 中,可以用 Compose 安装 Tailscale。首先 使用 SSH 登录 fnOS,使用下面的命令建立所需文件夹:

sh
mkdir -p /vol1/1000/docker/tailscale/var/lib
mkdir -p /vol1/1000/docker/tailscale/dev/net

在 Docker 中新增 Compose 项目:

名称填写 tailscale,路径选择 /vol1/1000/docker/tailscale,来源选择 创建 docker-compose.yml,内容如下:

yml
version: '3.7'
services:
    tailscale:
        container_name: tailscale
        volumes:
            - /vol1/1000/docker/tailscale/var/lib:/var/lib
            - /vol1/1000/docker/tailscale/dev/net/tun:/dev/net/tun
        network_mode: host
        restart: unless-stopped
        environment:
            - TS_AUTHKEY=    #填上一步生成的 Auth key
            - TS_EXTRA_ARGS=--advertise-exit-node
            - TS_ROUTES=192.168.xx.0/24   #把xx替换成自己网关的网段
            - TS_HOSTNAME=xx    #把xx替换成自己喜欢的名字,比如 fnOS
            - TS_STATE_DIR=./state/
        image: tailscale/tailscale
  • TS_AUTHKEY:填写上一步生成的 Auth key
  • TS_ROUTES:填写 fnOS 所在的网段,比如 fnOS IP 为 192.168.2.22,TS_ROUTES 就填 192.168.2.0/24
  • TS_HOSTNAME:填写自己喜欢的名字,比如 fnOS。

勾选 创建项目后立即启动,确认没问题,点击 完成tailscale 很快就能启动。

授权设置

登录到 tailscale 网站 后台,可以看到 fnOS 这台设备已经连上了,可以看到 Subnets 旁边有叹号提示:

点击设备名称进入设备详情页批准(Approval):

勾选网段,点击 Save

注意

这里还有个 Exit node 的选项,可以到文章末尾看看介绍,如果有需要可以勾选。

手机 App

Tailscale App 比较简单,使用同样的账号登录 App,需要远程访问 NAS 的时候,打开 App 里的开关就能连上了。

连上之后,依然使用 fnOS 的 局域网 IP 来访问 fnOS,不需要考虑端口映射问题,相比使用公网 IP,不要暴露任何端口到公网,更加安全。

测速

手机远程连上之后,可以访问 NAS 上的测速工具测试网络连接速度。

延迟(473ms)比较高,速度也很慢。

使用中继

Tailscale 官方的服务器使用的人比较多,国内连接速度比较慢,所以如果无法直连的话,可以尝试使用自建中继。自建教程可以 参考这里

建好之后,在 Tailscale 后台的 Access controls 中,"ssh" 前面添加下面的内容(需要按提示修改相关信息):

"derpMap": {
		// OmitDefaultRegions 用来忽略官方的中继节点
		"OmitDefaultRegions": true,
		"Regions": {
			// 这里的 901 从 900 开始随便取数字
			"901": {
				// RegionID 和上面的相等
				"RegionID": 901,
				// RegionCode,RegionName 自己取个易于自己名字
				"RegionCode": "1",
				"RegionName": "RegionName",
				"Nodes": [
					{
						// Name 保持 1不动
						"Name": "1",
						// 这个也和 RegionID 一样
						"RegionID": 901,
						// 中继服务器域名
						"HostName": "xxx.xxx.com",
						// 端口号,如果上方derp安装一致则无需改动
						"DERPPort": 443,
						"STUNPort": 3478,
					},
				],
			},
		},
	},

添加好之后点击 Save

如果想要确认 fnOS 是否连上了中继服务器,在 fnOS 中,进入 tailscale 容器的终端:

输入命令:

sh
tailscale netcheck

就能看到结果,如图中继延迟只有 44.6ms

此时在手机上再次测速,速度会好很多:

网络出口节点 Exit node

Tailscale 还有个很厉害的功能,那就是可以指定一个设备作为 Exit node。意思就是把其它设备的网络流量转发到这个设备,然后由这个设备作为整个虚拟局域网的网络出口。

举个例子:将 fnOS 设置为 Exit node,并且在手机端也开启 fnOS 作为 Exit node,手机的访问请求,会先转发到家里的 fnOS 设备,然后通过家里的宽带网络来上网。