
Lucky:家用软硬路由公网利器
一. 前言
对于 NAS 用户来说,内网访问是基础功能,而且能够玩转公网(外网)访问,才能使 NAS 真正成为个人专属家庭服务器。所以今天来聊聊如何实现 安全、快速、便捷 的家庭 NAS 公网访问。
想从外网(公网)访问家中的 NAS,首先最好还是拥有公网 IPv4。如果运营商实在不给公网 IPv4 的话,可以考虑 IPv6。
至于网上的各种内网穿透方案,我个人非常不推荐。因为部署复杂,稳定性差,很多时候还需要在访问端安装客户端软件,很不方便,纯属没办法的办法。所以这篇教程是基于有公网 IP 的情况下进行的。
1. 不安全的外网访问方式 —— 正向代理 + HTTP
很多新手 NAS 玩家在获得公网 IP 之后,会使用 http + 正向代理
,也就是在路由器中直接将 NAS 某项服务的内网端口映射到外网,然后通过 http://ip地址或域名:外网端口号
访问,就像下面这样:
比如我想从公司(外网)访问家里 NAS 中的 Home Assistant,只要输入 http://域名:18123
即可。虽然看起来貌似设置很简单,但是这种方式存在几个非常严重的问题,在当下糟糕的网络安全环境中,基本等同于裸奔,十分危险:
Http 协议使用明文传输,完全没有保密性可言
浏览器会报危险页面,比如 Chrome 会将所有 HTTP 协议网站自动标识为不安全网站
无法验证身份,对服务器端(也就是 NAS)缺乏保护
NAS 中每一个服务都需要单独端口号,数量多了以后根本记不住,并且被扫描的概率太大
2. 安全的外网访问方式 —— 反向代理 + HTTPS
而 反向代理 + Https
则完全规避了以上所有缺点。既能保护 NAS 主机,又可以通过 Https 建立安全的加密访问通道。对于一般用户来说,没必要了解正反代理之间差异的技术性问题,只要知道 反代 + Https
是目前相对比较安全的公网访问方案就可以了(网络安全没有绝对)。
传统的 反代 + Https
方案部署需要用到 DDNS-GO 和 NPM(Nginx Proxy Manager),稍微有点复杂,所以很多新入坑 NAS 的小伙伴也就放弃了,宁可冒险使用 HTTP 裸奔。但今天,袋鼠叔叔给大家带来一款非常出色的国产开源软件 Lucky,能够将整个部署过程完全傻瓜化,即便是小白也能跟着轻松完成。在此也特意感谢 Lucky 的作者 GDY 大神。
这款软件支持包括 Windows、Linux、Openwrt 甚至小米路由器内安装。今天的教程将在 Docker 中部署,使用极空间举例,其他品牌 NAS 部署方法基本一致。
二. 介绍
目前已经实现/集成的主要功能模块有
端口转发
动态域名(DDNS)
Web 服务
Stun 内网穿透
网络唤醒
计划任务
ACME 自动证书
网络存储
三. 效果预览
四. 相关地址
- GitHub : [https://github.com/gdy666/lucky](https://github.com/gdy666/lucky)
- Docker Hub: [https://hub.docker.com/r/gdy666/lucky](https://hub.docker.com/r/gdy666/lucky)
- 文档:
五. 部署教程
1. Docker CLI:
docker run -d --name lucky \
--restart always `# 重启策略` \
--network host \
--cpus "0.25" `# 限制 CPU 资源` \
--memory "128M" `# 限制内存资源` \
-v $(pwd)/lucky:/goodluck `# 映射 lucky 配置路径` \
gdy666/lucky:latest `# 拉取最新镜像`
2. Docker Compose:
version: '3'
services:
lucky:
image: gdy666/lucky:latest # 拉取最新镜像
container_name: lucky # 容器名称
restart: always # 重启策略
network_mode: host
deploy:
resources:
limits:
cpus: '0.25'
memory: 128M
volumes:
- ./lucky:/goodluck # 映射 lucky 配置路径
默认用户:
用户名:666
密码:666
3. 域名购买
想通过外网访问,首先当然需要一个域名,可以在服务商处购买,这里我以阿里云为例,其他如腾讯云,华为云等域名购买和设置方法大同小异。成功购买域名并通过实名认证后,列表中就会出现域名,点击后面的“解析”。
在解析设置页面中,点击 “添加记录”,记录类型选择 A,主机记录填入 @,解析请求来源默认,记录值填写当前家里的公网 IP 地址,TTL 默认 10 分钟即可。
接着点击右上角的头像,并在弹出菜单中点击 Access Key 管理。
创建 AccessKey,一定要把自己的 AccessKey 复制到电脑的文档中保管,因为只能获取一次,后面不会再次提供。到这里为止,域名的部分就都搞好了,非常简单。
六. 使用教程
1. 网页管理
浏览器打开 NASIP:16601
,就能进入 Lucky 管理后台界面
默认用户名和密码均为 666,填入后登录,并点击左侧的 “设置” 选项卡,重新设置一套新的管理账号和密码,确保安全:
2. 设置 DDNS(动态域名解析)
接下来在左侧找到 “动态域名” 选项卡,并点击 “添加 DDNS 任务”。
DDNS 任务名称随便填自己喜欢的,操作模式选择“简易模式”,DNS 服务商选择自己域名的服务商(我这里是阿里云),并将前面保存下来的 AccessKey ID 和 Secret 填入,然后按照自己家的公网 IP 类型选择 v4 或 v6,获取方式选择通过接口获取,最后域名列表填写两行,第一行是 主域名
,第二行是 *.主域名
,代表二级域名。其他全部默认,完毕后点击添加:
稍等片刻,看到同步结果为 “域名 IP 和 公网 IP 一致”,就说明 DDNS 设置成功了。多说一句,这里设置的 DDNS 其实和使用其他单独的 DDNS 应用(比如 DDNS-GO)效果是一样的。
3. 申请 SSL 证书
接下来我们需要为自己的域名申请 SSL 证书。转到 “安全管理” 选项卡,并点击 “添加证书”。
备注随便填,添加方式选择 ACME,证书颁发机构选择 Let's Encrypt
,DNS 服务商选择自己的服务商。
证书申请需要稍等一段时间,大概几分钟。成功后就会出现 ACME 信息,颁发时间和道到期时间。每张免费 SSL 证书的有效期为三个月,但 Lucky 在证书到期日会自动续签,不需要人工干预。
4. 设置方向代理及 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 服务子规则,需要多少服务,开几条子规则即可,但是注意二级域名前缀不要冲突。
下面这步只有 ipv4 才需要
全部设置好以后,我们还需要把反向代理的端口通过路由器映射出去,才能够正常从外网访问。和正向代理不同,现在我们只需要映射一个反代端口就可以,不用把每个服务单独的内网端口再映射出去,注意内网端口和外网端口号要保持一致。
如果所有设置都正常,就已经可以从外网访问了。比如我现在输入 https://nas.xxx.xx:16666 就可以访问到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 和端口号即可:
今天的教程就到这里,只要按照以上步骤正确操作,就可以从外网轻松,愉快,安全,优雅的访问家中 NAS 任意服务,绝对是NAS进阶玩家必备。
七. 常见问题及注意点
1. 端口转发
IPV4 记得做这步
全部设置好以后,我们还需要把反向代理的端口通过路由器映射出去,才能够正常从外网访问。和正向代理不同,现在我们只需要映射一个反代端口就可以,不用把每个服务单独的内网端口再映射出去,注意内网端口和外网端口号要保持一致。
简单来说,你家的网络从哪里管理拨号的,就从哪里的工具进行端口转发。
比如,目前笔者使用 iKuai 进行管理拨号的,所以我则是:
iKuai → 网络设置 → 端口映射