自建Nas内网穿透——ZeroTier/FRP
六月份入手了一台群晖Nas。由于群晖自带的内网穿透不太好用(连接不稳定,无法访问套件),所以准备自己搭内网穿透,尝试了几种方法,简单记录一下。
ZeroTier
ZeroTier是一款强大的P2P VPN工具,它可以让你搭建虚拟局域网(异地组网)。其优点之一是设备之间是点对点直连的,经过中转服务器握手后,设备间进行P2P传输,既保证了速度,又提升了安全性。在设备间跳数较小的情况下是个不错的选择。
创建私人网络
首先在ZeroTier控制台注册一个账号,点击Create Network创建网络。
记住这里的NETWORK ID,它是你的私人网络在互联网中的标识
PC操作
在官网下载一个ZeroTier客户端并启动(傻瓜式安装,这里不再赘述)
打开客户端后在Window右下角的后台程序中应该能看到ZeroTier已经启动了,点击Join New Network,输入上一步的NETWORK ID
之后需要在控制台中进行验证。上述步骤完成后控制台的Members中应该会出现一个新设备,可以比对上一步的My Address和Member中的Address来判断是否是目标设备(Address就是ZeroTier给每台设备分配的唯一标识号)
左侧勾选,点击Authorize即可完成认证。这样目标设备就正式加入了虚拟局域网。同一虚拟局域网的设备使用分配的Managed IP是可以ping通的
网络ID+控制台验证,这让ZeroTier的安全性达到了一个比较可靠的程度。
Nas操作
博主使用的群晖Nas,社区套件提供了比较快捷的安装方式,其他Nas品牌可以尝试通过docker安装ZeroTier,流程应该是大差不差的。(套件使用的是矿神源,安装方式请自行查询)
由于ZeroTier需要以root权限运行,所以需要先下载一个权限管理器
之后安装ZeroTier套件,安装时会让你输入Network ID,同理填入你的私人网路ID即可。
之后在控制台进行认证即可,操作同PC。
现在就可以直接使用ZeroTier分配的虚拟局域网IP访问你的Nas啦,由于原理就是虚拟局域网,所以所有操作都与在本地局域网内相同。
Moon服务器
由于不同设备间握手还需要经过中转服务器(即官方说的Planet服务器),所以在连接安全性与稳定性上还可提升,方法就是自建一个中转服务器,即官方说的Moon服务器。理论上是挺好的,但我自建下来没有提升,反而导致我设备间连不通了,于是放弃了该方法。
FRP
上面提到ZeroTier的稳定性受中转服务器、设备间跳数等因素影响,其实连接不是很稳定(在我校园网的环境下时常连不通,或传输速率慢)。于是准备寻找替代方法,最后选择了较为成熟的FRP
FRP本质上是一种反向代理操作,所以需要一台公网可访问的服务器作为代理服务器。
FRP的搭建分为FRPS(FRP Server)和FRPC(FRP Client)两部分。说白了就是将FRP的服务端与客户端程序分配部署到服务器与设备上,然后分别填写配置文件。
- 操作参考了以下博客:https://gitee.com/spoto/natserver
- frp官方文档:https://gofrp.org/zh-cn/
服务端部署(FRPS)
服务端就是你用来做反向代理的服务器。
创建配置文件
1 | # 创建存放目录 |
frps.toml配置文件内容参考(虽然是toml,但为了兼容性仍然使用ini文件的格式):
1 | [common] |
- bind_port:监听端口,frp通过该端口提供反向代理服务,推荐修改为一个小众端口
- dashboard_port:面板端口,用于frp流量监控,保持默认即可
- token:身份验证,frp客户端配置文件中填入相同token才能获取frps服务,能一定程度提升安全性
docker安装frps
1 | #服务器镜像:snowdreamtech/frps |
这样frps就配置完成了
Nas部署(frpc)
创建配置文件
在docker文件夹下创建frp文件夹,并在目录下新建一个frpc.toml文件
frpc.toml配置文件内容参考:
1 | [common] |
- [common]
- frpc通用配置,按注释中配置即可
- [dsm]
- [dsm]:服务名,名字可以随意取,但不能重复
- local_port:Nas上需要内网穿透的服务端口,这里希望内网穿透登录界面,所以绑定了登录端口(登录端口可以在
控制面板→系统→登录门户→网页服务
中设置,推荐使用HTTPS) - remote_port:服务器上的绑定Nas服务的端口,设置好后访问
服务器IP:remote_port
就等于访问Nas的localhost:local_port
安装frpc
Nas上通过Container Manager安装
在镜像仓库中搜索snowdreamtech/frps
,在映像中点击运行,下面是配置界面:
配置完成后容器就运行起来了,配置文件错误或服务器设置错误的话应该运行两下就会弹窗告诉你容器运行失败,这时可以通过容器运行日志来进行修复:
常见的坑有端口没对应好、服务器防火墙没放行端口等。
现在,你已经可以通过服务器IP:remote_port
在异地访问登录你的Nas啦!
服务器反向代理绑定子域名
通过IP+端口的访问感觉还是不够优雅,能不能通过域名访问Nas呢?当然是可以的!这里通过服务器上Nginx的反向代理实现这一功能。
为了操作方便,所以操作使用宝塔面板完成,面板的安装请自行搜索
创建站点
首先创建一个站点,域名里填上你想要使用的子域名。由于该域名仅用作反代,PHP版本选择纯静态
Nginx反向代理
在宝塔面板中打开刚刚创建站点的设置界面,反向代理界面中点击添加反向代理,配置见下图:
域名解析
博主域名使用Cloudflare托管,所以域名解析操作以Cloudflare为基准
打开根域名的DNS界面,创建一条A记录,将子域名解析到服务器IP上,可以打开Cloudflare代理。
申请证书
到这一步其实你已经可以通过子域名访问Nas了,但是由于缺少证书,大部分浏览器应该都会提示不安全,甚至直接拒绝访问,所以我们还需要申请一个证书,同样在宝塔面板中进行
在站点设置界面的SSL→加密
中点击申请即可完成自签证书的申请。自签申请的证书有效期为90天,记得定时续签
至此,就可以通过域名直接访问处于内网中的Nas了
在服务器的Frp监控面板上也能看到流量正常在走
Webdav配置
Nas的主要目的是存储,那么如何方便地访问Nas的硬盘呢?
ZeroTier由于原理是异地组网,所以连上后可以直接在网络设备中搜索到Nas,通过smb协议访问到Nas的硬盘。
而Frp原理是反代,该怎么访问到Nas的硬盘呢?这里提供一下我的方案,可能还有更好的,仅供参考
Nas安装Webdav服务器
在Nas套件中心搜索Webdav,下载Webdav服务器
打开后记下Webdav在本地的端口,同样推荐使用HTTPS
添加Frpc配置
在Nas的frpc.toml配置文件中添加一下内容:
1 | [webdav] |
之后重启一下容器配置就生效了
PC上下载Webdav客户端
在需要访问Nas硬盘的PC上下载一个Webdav客户端,博主选择的是RaiDrive,一个开源免费的Webdav客户端,缺点是偶尔会跳弹窗广告,问题不大。
打开RaiDrive,右上角点添加
,服务类型→Nas
中选择WebDAV,地址中域名填写你的服务器IP,端口填写上面绑定的服务器remote_port。账户密码填写你Nas用户的账号和密码。最后点击连接,就完成配置了
之后你就可以像本地磁盘一样访问Nas的硬盘了
最后一点乌云
通过子域名或IP+端口访问Nas都是通过HTTPS协议的,所以打开Nas上的HTTPS网页都是没问题的(如Photos等群晖官方应用都是支持HTTPS的)
但Nas上多数应用都是不支持HTTPS的,如常用的jellyfin、Nastool,访问这些应用时无法自动由HTTPS切换到HTTP,所以无法打开。
找到的一个解决方案是在Nas上再嵌套一层反向代理,将HTTPS协议下的端口访问转发给HTTP协议的访问。但实际实现却是404。等到之后找到解决方法再来更新吧!