利用 Cloudflare 的 Zero Trust Tunnel 功能实现 NAS 随时随地访问

如果你在家里或者办公室有一个 NAS 设备,你可能会遇到一个问题:只有当你在局域网中的时候,你才能使用它,无法通过公网访问。为了解决这个问题,我研究了一下 cloudflare 的 Zero Trust Tunnel 功能,并把我的使用方法记录下来分享给大家。

我的 NAS

NAS 的全称是 Network Attached Storage,按照大家常见的说法就是个“网盘”,只不过我们通常见到的网盘都是由一些厂商提供的服务,比如百度提供百度网盘,阿里提供阿里网盘。这里所说的 NAS 并不是由某个厂商提供的服务,而是自己买一台 NAS 设备放在家里或者办公室里,只要它接入了网络,咱们就可以把它当“网盘”用。

NAS 其实就是一台电脑,完全可以自己组装。不过大家也都知道,自己组装和买成熟厂家提供的一体化软硬件方案是不一样的,这和自己买配件攒电脑还是买品牌整机是一个道理,多花了钱的毕竟可以让自己更加省心一点。

目前市场上比较主流的 NAS 品牌主要是 群晖威联通,这两个品牌做 NAS 的时间比较长。近几年一些云厂商或者电脑外设厂商也都纷纷开始进入 NAS 产品领域,比如华为、小米、绿联等等。

我自己是在 2020 年的时候购入了一台威联通的 TS-453DMINI 一直使用至今。主要用它来备份手机上的照片以及存储一些电影。由于照片备份是完全自动化的,我目前也很少看电影,因此这台 NAS 的存在感很低。

最近我有一些文档想要备份一下,其中一些存在我的笔记本电脑上,一些存在公司的台式机上,于是我又想起了这台 NAS。

既然 NAS 就像一个“网盘”,那么我只需要将需要备份的文件复制到 NAS 上就能完成备份了。但实际情况是,我遇到了一个问题:我的 NAS 只能在局域网中访问,无法通过公网访问。简单来说,只有当我在家里的时候,我才能使用它,出门时就无法使用了。这种情况有两个原因:

  1. 我使用的移动宽带没有提供公网 IP;
  2. 我的一位同事虽然有公网 IP,但不小心被入侵了,导致 NAS 上的数据被删除了。

对于第一个原因,即使没有公网 IP,我也可以使用威联通自带的 MyQnapCloudLink 和 DDNS 进行外网访问。实际上在刚买 NAS 的时候,我也尝试过这个方法,但访问时不仅速度慢还很不稳定,让我完全无法接受。

后来遇到了第二个原因,才发现威联通国内版的 MyQnapCloudLink 的 SSL 证书需要单独购买,而国际版则可以使用免费的 Let's Encrypt 证书。

当时我并不想为一个不常用的功能耗费过多的成本,于是我关闭了外网访问。

NAS 公网访问方案

那么到底有没有既安全又快速的 NAS 外网访问方法呢?经过我的一番搜寻,找到了答案,这就是 Zero Trust Tunnel。按照官方的说法:

Zero Trust Tunnels 是 Cloudflare 提供的一种安全连接服务,它可以帮助您在没有公网可路由 IP 地址的情况下将您的资源连接到 Cloudflare。使用 Zero Trust Tunnels,您不需要将流量发送到外部 IP 地址,而是在您的基础架构中运行一个轻量级守护进程(cloudflared),该进程仅创建到 Cloudflare 边缘的出站连接。Zero Trust Tunnels 可以安全地将 HTTP Web 服务器、SSH 服务器、远程桌面和其他协议连接到 Cloudflare。这样,您的源服务器就可以通过 Cloudflare 提供流量,而不会受到绕过 Cloudflare 的攻击的威胁。

更加关键的是,cloudflare 提供的免费版本就够咱们用了。既然方案确定了,就开始实操吧。

注册 Cloudflare 账户

cloudflare 的注册很简单,访问 https://dash.cloudflare.com/sign-up 按照要求注册即可

配置网站

如果要使用 cloudflare 的服务,首先需要有一个自己的域名。注册域名的方法在此不再赘述, 你可以选择自己偏好的域名注册服务商,比如 godaddy, namesilo, namecheap, 当然 cloudflare 本身也支持域名注册。

当你有了自己的域名以后,登录进入 cloudflare, 点击左侧菜单中的「网站」,之后再点击右侧的「添加站点」

之后在输入框中输入已经注册好的域名, 点击「添加站点」按钮

滚动到页面最下方,选择免费的站点服务

如果你是在 cloudflare 上注册的域名,则只需要根据提示下一步就可以了。如果是在其他地方注册的域名,cloudflare 会先对域名的配置进行检测,并提供两个域名服务器地址。你需要回到域名服务商的控制台中修改域名服务器的地址

域名服务器配置生效之后,该站点会转为有效状态,此时从「网站」菜单进入站点后就可以开始配置 Zero Trust Tunnel。

配置 Zero Trust Tunnel

进入站点后,点击左侧菜单中的「Access」之后,点击右侧的「启动 Zero Trust」进入 Zero Trust 控制面板

进入 Zero Trust 面板后,展开左侧菜单中的「Access」并点击「Tunnels」,之后点击右侧的「Create a tunnel」来创建一个隧道

输入自己定义的隧道名称,之后点击「Save tunnel」

创建完成后,cloudflare 会提供一个如何安装连接器的命令。

因为我们用的是 NAS,所以优先选择 Docker 安装。先复制下来,之后配置 NAS 时会用到。

配置 NAS

如上文所述,我的 NAS 是威联通的 TS-453DMINI,威联通的 NAS 都搭载了名为 QTS 的操作系统。在 QTS 中可以使用 Container Station 用图形化的方式开启 Docker。我们可以按照拉取 Docker 镜像、运行镜像这样的步骤进行。

首先登录进 QTS,之后打开 Container Station。

之后点击左侧菜单中的「镜像文件」,再点击「提取」。在弹出的对话框中的「镜像文件名称」处填写 cloudflare/cloudflared, 确认「映像版本」为 latest, 之后点击「提取」。

此时系统会在后台拉取镜像,我们需要等待镜像拉取完毕。重新进入「镜像文件」,点击已拉取的镜像右侧 +。

在弹出的对话框中依次操作

  1. 填写「名称」: 起一个自己容易识别的名字
  2. 填写「命令」:配置 tunnel 时保存的那段命令文本,去除最前面的 docker run cloudflare/cloudflared:latest,从 tunnel 开始直至最后的部分。
  3. 填写「进入点」:保持默认即可
  4. 点击创建

之后等待 container 启动,进入「Container」菜单,可以看到状态如何是绿色的,说明该 container 启动成功

隧道配置

我们重新回到 cloudflare 的 Zero Trust 控制面板,进入 Access > Tunnels,点击列表下拉菜单中的 「Configure」进入 Tunnel 配置

切换至「Public hostname」,点击「Add a public hostname」配置一个公网主机名

依次进行如下设置:

  1. 填写二级域名,起一个自己喜欢的就可以,比如: nas
  2. 选择域名,即本文最初所说的站点域名
  3. 选择需要进行隧道连接的协议,这里选 HTTP
  4. 填写需要隧道连接的 URL,这里就是我们局域网访问 NAS 系统的网址,一般是 192.168.x:端口号 的形式
  5. 点击「Save hostname」完成配置

至此,所有的配置工作已全部完成,接下来就是检测结果的时候了。

检测结果

由于我是在家测试,因此我将电脑的 WIFI 连接到了手机热点,以便跳出局域网环境。访问上面隧道配置时填写的二级域名,比如 nas.example.com。熟悉的 NAS 系统登录界面即刻出现了,并且使用的是 https 协议,也就意味着 cloudflare 自动为这个域名颁发了 SSL 证书。

对于威联通来说,还可以在手机 APP 上配置上述的二级域名进行连接,经过我的测试也同样成功了。

目前的配置已经完成了 NAS 系统的安全公网访问,还不能够通过 WebDav 或者 SMB 协议将我们的「网盘」挂载到本地来使用。后续我还会继续尝试,成功后再写文章与大家分享。