网络千万条,安全第一条——使用Lucky轻松实现反向代理+Https外网访问家庭NAS
对NAS用户来说,内网访问是基础功能,而能够玩转公网(外网)访问,才能使NAS真正成为个人专属家庭服务器。所以今天这篇文章,就跟大家聊聊如何实现安全,快速,便捷的家庭NAS公网访问。
想从外网(公网)访问家中的NAS,首先最好还是拥有公网IPv4。如果运营商实在不给公网IPv4的话,可以考虑IPv6,我之前已经做过详细教程,需要的小伙伴可以参考:
至于网上的各种内网穿透方案,我个人非常不推荐。因为部署复杂,稳定性差,很多时候还需要在访问端安装客户端软件,很不方便,纯属没办法的办法。所以这篇教程是基于有公网IP的情况下进行的。
不安全的外网访问方式——正向代理+HTTP
很多新手NAS玩家在获得公网IP之后,会使用http+正向代理,也就是在路由器中直接将NAS某项服务的内网端口映射到外网,然后通过"http://ip地址或域名+外网端口号"访问,就像下面这样:
比如我想从公司(外网)访问家里NAS中的Home Assistant,只要输入http://域名:18123即可。虽然看起来貌似设置很简单,但是这种方式存在几个非常严重的问题,在当下糟糕的网络安全环境中,基本等同于裸奔,十分危险:
Http协议使用明文传输,完全没有保密性可言
浏览器会报危险页面,比如Chrome会将所有HTTP协议网站自动标识为不安全网站
无法验证身份,对服务器端(也就是NAS)缺乏保护
NAS中每一个服务都需要单独端口号,数量多了以后根本记不住,并且被扫描的概率太大
安全的外网访问方式——反向代理+HTTPS
而反向代理+Https则完全规避了以上所有缺点。既能保护NAS主机,又可以通过Https建立安全的加密访问通道。对于一般用户来说,没必要了解正反代理之间差异的技术性问题,只要知道反代+Https是目前相对比较安全的公网访问方案就可以了(网络安全没有绝对)。
我把两种方案的区别做成表格放在下面:
传统的反代+Https方案部署需要用到DDNS-GO和NPM(Nginx Proxy Manager),稍微有点复杂,所以很多新入坑NAS的小伙伴也就放弃了,宁可冒险使用HTTP裸奔。但今天,袋鼠叔叔给大家带来一款非常出色的国产开源软件Lucky,能够将整个部署过程完全傻瓜化,即便是小白也能跟着轻松完成。在此也特意感谢Lucky的作者GDY大神。
这款软件支持包括Windows、Linux、Openwrt甚至小米路由器内安装。今天的教程将在Docker中部署,仍然使用绿联DX4600举例,其他品牌NAS部署方法基本一致。整个流程分为5步,分别是购买域名,安装Lucky,设置DDNS,设置SSL证书和设置HTTPS反向代理。接下来就正式开始~~
Step 1、域名购买
想通过外网访问,首先当然需要一个域名,可以在服务商处购买,这里我以阿里云为例,其他如腾讯云,华为云等域名购买和设置方法大同小异。成功购买域名并通过实名认证后,列表中就会出现域名,点击后面的“解析”。
在解析设置页面中,点击“添加记录”,记录类型选择A,主机记录填入@,解析请求来源默认,记录值填写当前家里的公网IP地址,TTL默认10分钟即可。
如果不知道家里公网IP地址,可以直接打开百度并搜索IP两个字母获取。
接下来再重复一次上面的操作,只不过这次在主机记录中填入*(第一次是@),其他选项均保持不变。这样,我们就有了两条域名解析记录。第一条是专门解析主域名的,第二条则是解析二级域名的,以*来代替所有前缀。看到状态为“启用”就说明配置正确。
接着点击右上角的头像,并在弹出菜单中点击Access Key管理。
创建AccessKey,一定要把自己的AccessKey复制到电脑的文档中保管,因为只能获取一次,后面不会再次提供。到这里为止,域名的部分就都搞好了,非常简单。
Step 2、在Docker中安装Lucky
转到NAS端,在镜像管理中搜索gdy666/lucky并下载:
下载完成后在本地镜像中找到,创建容器:
取一个自己喜欢的名字,然后点击下一步:
重启策略选择“容器退出时总是重启容器”,然后不要点击下一步,而是转到上方的网络选项卡。
由于需要将Lucky作为反代服务器使用,因此网络模式必须选择host,不能使用常用的Bridge!
转到储存空间选项卡,将Lucky安装位置设置在Docker/goodluck,装载路径中填写/goodluck,并给予完全的读写权限:
端口设置保持默认的16601即可,其他选项也保持默认。直接点击下一步并启动运行:
打开电脑浏览器,在地址栏中输入IP+16601,进入Lucky管理后台:
缺省用户名和密码均为666,填入后登录,并点击左侧的“设置”选项卡,重新设置一套新的管理账号和密码,确保安全:
Step 3、设置DDNS(动态域名解析)
接下来在左侧找到“动态域名”选项卡,并点击“添加DDNS任务”。
DDNS任务名称随便填自己喜欢的,操作模式选择“简易模式”,DNS服务商选择自己域名的服务商(我这里是阿里云),并将前面保存下来的AccessKey ID和 Secret填入,然后按照自己家的公网IP类型选择v4或v6,获取方式选择通过接口获取,最后域名列表填写两行,第一行是主域名,第二行是*.主域名,代表二级域名。其他全部默认,完毕后点击添加:
稍等片刻,看到同步结果为“域名IP和公网IP一致”,就说明DDNS设置成功了。多说一句,这里设置的DDNS其实和使用其他单独的DDNS应用(比如DDNS-GO)效果是一样的。
Step 4、申请SSL证书
接下来我们需要为自己的域名申请SSL证书。转到“安全管理”选项卡,并点击“添加证书”。
备注随便填,添加方式选择ACME,证书颁发机构选择Let's Encrypt,DNS服务商选择自己的服务商。
和刚才一样,填入AccessKey的ID,Secret,主域名和二级域名。电子邮箱可以使用系统提供的临时邮箱,或者自己的邮箱都可以。算法选择默认的RSA2048。
如果你的公网IP是IPv4,就开启DNS查询强制IPv4,同时启用DNS查询仅使用TCP通道。其他所有选项全部保持默认,并点击添加完成。
证书申请需要稍等一段时间,大概几分钟。成功后就会出现ACME信息,颁发时间和道到期时间。每张免费SSL证书的有效期为三个月,但Lucky在证书到期日会自动续签,不需要人工干预。
Step 5、设置反向代理及HTTPS访问
转到Web服务菜单,点击“添加Web规则”。
Web服务规则名称随便填,规则开关开启,操作模式选简易模式,监听类型按照你的公网IP类型选择。监听端口这里给出的默认是16666,如果不喜欢,可以自己随便改,只要和局域网中其他服务端口不冲突就行,防火墙自动放行开启。特别注意,这里一定要开启TLS,否则无法使用HTTPS。
接下来先不要着急添加规则,而是点击“添加Web服务子规则”。实际上,这个所谓的“子规则”,就是你从外网访问的某项服务,比如Home Assistant,或者NAS管理页面。名称还是随便写,规则开关开启。Web服务类型选择“反向代理”。
前端域名/地址需要填写你想要从外网访问该服务的二级域名,比如我这个子规则是分配给NAS管理页面的,那我就写nas.xxx.xx或者ugreen.xxx.xx,前缀可以按照自己的喜好编写。
而后端地址则需要写你访问该服务的内网IP+端口号,前面不要忘记加http://,其他选项全部保持默认。
这里有一个需要注意的地方就是BasicAuth认证,也就是基础加密功能。在开启之后,从外网访问时,需要先输入账号和密码,等于是多加了一道保险。对于本身就有密码登录界面的服务来说,是否开启可以根据个人需求。但对于本身没有密码登录界面的服务,比如YACD小猫咪,开启BasicAuth认证还是有必要的。
如果还有其他服务需要外网访问的话,那么还是按照上面的方法,添加新的Web服务子规则,需要多少服务,开几条子规则即可,但是注意二级域名前缀不要冲突。比如我这里就开启了5条:
全部设置好以后,我们还需要把反向代理的端口通过路由器映射出去,才能够正常从外网访问。和正向代理不同,现在我们只需要映射一个反代端口就可以,不用把每个服务单独的内网端口再映射出去,注意内网端口和外网端口号要保持一致。
端口放出去之后,如果所有设置都正常,就已经可以从外网访问了。比如我现在输入https://nas.xxx.xx:8888,就可以访问到NAS的设置页面。而且可以看到,域名的前面是有一把锁的,也就是说已经开启了SSL安全访问。
不过这里还有个小问题,就是在输入网址的时候,还是需要带上Https://,否则在某些浏览器中会自动被识别为http,造成无法访问。为了解决这个问题,我们需要在仅输入域名时让浏览器也能够自动跳转到https。
回到Lucky,在Web服务中添加一条全新的Web服务规则(注意不是子规则)。名称随便,操作模式选定制模式,监听端口和前面的反代端口保持一致,TLS一定要禁用!然后点击“默认子规则”
打开默认子规则界面后,Web服务类型选择重定向,然后在默认目标地址中输入:
https://{host}:{port}
并打开万事大吉开关(自动添加请求头),其他所有选项全部保持默认,添加完成。
这样一来,在外网访问时我们只需要输入xxx.xx.xxx:端口号,浏览器就会自动跳转到https协议,非常方便。
到此为止,我们就可以从外网使用反向代理+HTTPS方式访问家里的NAS服务器了,这已经是目前最完美的方式。不过有些小伙伴可能还会问,为什么不把最后的反代端口号也去掉,直接输入二级域名访问,岂不是更加优雅?
实际上,HTTPS协议默认的端口为443。当我们输入https://xxx.xx.xx时,就等同于访问https://xxx.xx.xx:443,只不过由于通用标准的缘故,443端口在输入时可以省略。
遗憾的是,目前绝大多数家庭宽带80和443端口都是被运营商封闭的,因此只能退而求其次,选择其他端口使用。如果你家宽带是万里挑一的幸运儿,没有被封闭443端口,那么就可以使用443端口作反代,并直接使用域名访问。
443端口是否开放,可以通过站长之家查询,输入域名或者IP和端口号即可:
https://tool.chinaz.com/port
比如我这里443端口就是关闭状态:
今天的教程就到这里,只要按照以上步骤正确操作,就可以从外网轻松,愉快,安全,优雅的访问家中NAS任意服务,绝对是NAS进阶玩家必备。
我是袋鼠叔叔,一个拥有100+智能设备的全屋智能家居博主。关注我,了解更多关于智能家居/家电的那些事儿。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
ZG9920
对于没有v6的 办公机 采用的Lucky的STUN穿透,但是有个问题 内网穿透基本 2 3天就要换一次地址 目前是通过webhook通知到微信 但是效率差而且繁琐,有没有办法吧穿透的地址绑定到域名上,或者只需要穿透一个地址 在里面可以访问其他的路径也可以。
校验提示文案
seabreath
校验提示文案
byiceb
校验提示文案
一隻單身狗Jackie264
校验提示文案
Janchy
校验提示文案
zza1201357
校验提示文案
小生生花火
校验提示文案
SH3R1OCK
校验提示文案
jacob4012
校验提示文案
井之水
校验提示文案
宇宙大波
校验提示文案
samisme
校验提示文案
gy408
校验提示文案
Arbre
校验提示文案
葬剑三千
校验提示文案
嘟嘟坚果墙
校验提示文案
值友8025358676
想问一下,如您所说,用http方式明文在互联网上跑,进入页面的用户名密码别人能看得到是这个意思吗?感谢。
校验提示文案
张大妈老公公
外网地址:去看看:8888
内网地址:去看看:8085
校验提示文案
值友5958343614
校验提示文案
Dinky
开启BasicAuth之后,登录的时候重复让输入账号密码,
哪位大神指点一下啊
校验提示文案
BG7WXB
校验提示文案
hotoliao
校验提示文案
值友9126602747
校验提示文案
seabreath
校验提示文案
ZG9920
对于没有v6的 办公机 采用的Lucky的STUN穿透,但是有个问题 内网穿透基本 2 3天就要换一次地址 目前是通过webhook通知到微信 但是效率差而且繁琐,有没有办法吧穿透的地址绑定到域名上,或者只需要穿透一个地址 在里面可以访问其他的路径也可以。
校验提示文案
cheersw
校验提示文案
viatka
校验提示文案
值友8358706668
校验提示文案
值友7855192197
校验提示文案
值友7266990111
校验提示文案
值友1569468050
校验提示文案
把一切都放丅
校验提示文案
老科looker
校验提示文案
芒果胖胖
校验提示文案
值友3511469795
1.我DDNS解析的是阿里云买的域名,可以使用腾讯云申请SSL吗?
2.单独申请阿里的AAAAA.BBB域名证书以及*.AAAAA.BBB的证书都可以申请成功,但是按照您的方式同时申请AAAAA.BBB以及*.AAAAA.BBB证书时会出错,请问这是为什么?敬请解答,非常感谢
校验提示文案
值友7202507141
校验提示文案
Virusr
校验提示文案
Rhonin
路由器设置的端口转发是4234,目标地址是路由器ip的4234
校验提示文案
值友5815805898
校验提示文案
menbe
校验提示文案