远程挂载家里的群晖NAS
在家里电脑上使用SMB挂载家里的群晖NAS特别方便,访问NAS里面的数据就像访问本地电脑的硬盘一样。但不在家的时候,访问家里的NAS就成了难题。
群晖自带的Quick Connect确实可以远程访问家里NAS的文件,甚至还可以通过手机访问。但一来只能使用网页登录,跟直接像本地硬盘一样的访问方式相比体验差了十万八千里。二来速度巨慢无比,一秒几十KB的速度让人抓狂。先不说打开一个文件,光登录就要等将近一分钟,在家里已经是千兆带宽的情况下,实在不能忍。三来网页使用的方式也无法让我远程通过Everything之类的工具快速搜索家里NAS上的文件,对于希望随时能够拿到家里的文件的我来说如鲠在喉。
经过接近两年的断断续续的折腾,终于摸索出来了一套通过FRP快速挂载远程NAS的方案。不敢独享,故分享之。
实现效果
像上图一样,远程也可以挂载家里的群晖NAS上的硬盘。需要注意的是,远程挂载的磁盘显示的总容量是假的。我家里怎么可能有EB级别的磁盘(1EB=1000PB=1,000,000TB=1,000,000,000GB)。
准备清单
要能搭建好这样的一套服务,需要准备:
- 在家里的一台NAS是必不可少的
- 一个具备公网IP的服务器,我在这里使用的是阿里云99计划购买的99元一年(3M带宽/2核/2GB内存)的服务器,性价比很高
搭建过程
1. 搭建FRP服务,使得家里的NAS也能被外网访问
因为家里的宽带使用的是动态IP,因此需要使用内网穿透的方案,保证家里的NAS也能被远程访问到。我这里使用的是FRP,其基本原理如下图所示。我们需要部署一台FRP服务器(frps),当我们访问frps的某个端口时,FRP服务会将我们的请求重定向到内网客户端(frpc)。因为frps具备固定的公网IP,因此我们具备了经过frps代理访问内网服务的能力。
frps的安装方式可以参考网络上的其他文章,这里不再赘述。需要提醒的是最好给服务器上的FRPS建立一个开机自动启动的service,这样的话可以保证即便服务器重启了,重启后我们仍然能够访问到内网的服务。
frps端的配置非常简单,只需要配置好bind_port以及bind_addr即可。如果对安全性有要求,可以配置一下token。token不配置也没关系。另外不要忘了把云服务器上防火墙相关的端口打开。
接下来的重头戏就是frpc的配置。由于我同时需要3种方式访问家里的NAS(ssh访问、网页访问、挂载访问),因此使用FRP在frpc端开了5个端口(ssh访问的10022端口、网页http访问的5000端口、网页https访问的5001端口、挂载访问的webdav 5005端口、挂载访问的webdav5006端口)。
先配置好common字段,将frps的IP地址以及刚才在frps上配置的bind_port 配置到frpc的server_port属性上。然后分别配置ssh访问、网页访问以及webdav访问的参数。local_port指的是本地的端口。比如在NAS上开的ssh访问端口是10022,那么local_port就填10022。remote_port指的是frps端的端口。
以下图ssh字段的配置为例,当我访问服务器IP地址的2222端口时,frps会将我的请求重定向到家里NAS(frpc端)的10022端口。当然了remote_port对应的frps服务端有自己的域名,也可以指定custom_domains参数而不指定remote_port参数。
frps以及frpc的ini文件配置好后,重新启动服务器端的frps以及本地端的frpc程序,应该已经能够实现通过ssh、网页或者webdav访问家里NAS的功能了。
2. 远程挂载家里NAS
FRP服务搭建好后,我使用了接近一年时间,但总是没找到FRP映射SMB协议的好方法。主要是因为网络服务商对于公网的SMB端口是封锁的,想了很多办法都没有突破。所以后来直接改成webdav的访问方式,实现了远程挂载。
远程挂载webdav需要使用软件RaiDrive。
点击RaiDrive右上角的添加,进入RaiDrive的配置页面。其实在配置页面只需要填写5个参数即可完成配置(如下图):服务器IP地址或域名、端口号、共享文件夹名、账户名、密码。
需要注意的是,共享文件夹名请不要使用homes下面的账户名。例如,张三在homes下新建了一个账户”张三“,那么共享文件夹直接使用home即可,不要填写”张三“。因为只要使用账户”张三“去登录,home路径就会自动变为”张三“文件夹路径。
配置完成之后,点击“连接”,就完成了远程挂载。
远程挂载之后,也可以使用Everything之类的工具对远程NAS进行索引。添加挂载盘的方式是在索引设置的“文件夹”页面,添加对应的文件夹路径。远程索引毕竟速度受限制,为了避免频繁索引影响Everything性能,这里把它设置成了“不自动扫描”。