AI 创作声明:本文由作者基于亲身搭建与联调经验撰写大纲与事实核对,正文由 AI 辅助起草并经作者审阅修改。方案实现、代码与验证均为作者本人完成。

家里搭了 NAS 之后,最省心的用法往往是:平时关机或睡眠,要用的时候再远程开机。

备份、下载、相册同步这些服务,不需要 24 小时挂着;电费、噪音、硬盘寿命倒是实打实的。问题在于:关机之后,常见的 QuickConnect、花生壳、Cloudflare Tunnel 统统帮不上忙——机器都没起来,隧道和内网穿透也跟着睡了。

少数派上那篇 《家里搭建了 NAS 需要远程访问?这几个步骤很重要》 把「有公网 IP → DDNS → 端口转发」讲得很清楚。那是机器已经开机之后,怎么从外面连进去。

本文解决的是更前面一步:机器还关着,怎么安全地把它叫醒——而且尽量不依赖公网 IP、不做端口转发、也不把 NAS 直接暴露到公网。

完整代码开源在 nas-wake-cloudflare。


为什么不能只靠「远程访问」那一套

传统远程开机,常见思路是:

  1. 家里有公网 IP(或至少能端口转发)
  2. 路由器做端口映射,外网打进来某个端口
  3. 在局域网里发 Wake-on-LAN(魔术包)把 NAS 叫醒

这条路在国内经常卡在第一步。移动宽带大量是内网;即便电信、联通给了公网 IP,也往往是动态的,还要再叠 DDNS。更麻烦的是:只要往外开端口,攻击面就跟着扩大——开机这种事,本身不该依赖「谁都能打到你家路由器」。

现成方案也不少:插 PCI-E / USB 的物联网开机卡,用厂商 App 远程点开机;或者给 NAS 配智能插座,靠「来电自启」间接唤醒——都能用,各有账户绑定、功耗和可控粒度上的取舍。手上正好有一块 ESP8266 NodeMCU,本着生命不息、折腾不止的原则,就自己做了这一套。

我想要的体验很简单:

人在外面,手机打开一个网页,输入密码,按一下「开机」。几秒到十几秒后,家里的 NAS 开始启动。家里路由器不用为这件事做任何端口转发。

要实现它,关键只有一句话:

外网只负责「登记一下想开机」;真正发魔术包的动作,必须发生在家里局域网里。


方案长什么样

整套东西只有三块:

手机浏览器
    │ HTTPS 打开开机页、输入密码
    ▼
Cloudflare Worker(网页 + 接口 + 状态)
    ▲
    │ 家里的 ESP8266 每隔几秒来问一次
    │
ESP8266(常开、功耗很低)
    │ 看到「待开机」
    │ 向局域网广播发 Wake-on-LAN 魔术包
    ▼
NAS 网卡被叫醒 → 开机

分工很干净:

角色做什么不做什么
Cloudflare Worker提供密码页、校验密码、记住「有没有待执行的开机指令」碰不到你的局域网,也发不出魔术包
ESP8266轮询云端、在局域网发魔术包、回报「已经发出去了」不暴露端口,不跑复杂服务
NAS打开网络唤醒,关机后网口待机供电保持关机时不必联网、不必开隧道

网页密码和设备令牌是两把钥匙:浏览器只能用开机密码;ESP 只能用设备令牌。猜错密码不会改状态;没有令牌也轮询不到真指令。

待开机默认只保留约 2 分钟。超时就标成「未送达」,避免一条过期指令在板子恢复后突然补发。

费用方面:Worker 停在免费额度完全够用;ESP8266 用手机充电器供电,一天几毛钱电费都算夸张。


开始之前:先确认 NAS 真的能被叫醒

这一步跟云无关,却最容易被跳过。

  1. 在 NAS / 主板 BIOS 里打开 Wake-on-LAN / 网络唤醒。
  2. 关掉会切断网卡待机供电的节电选项(很多主板上叫 ErP、深度休眠一类)。
  3. 关机或睡眠后,看一眼网口:待机灯还应亮着。灯都灭了,魔术包到了也没用。
  4. 记下 NAS 有线网卡的 MAC 地址,以及它所在网段的广播地址(例如 192.168.10.0/24 的广播是 192.168.10.255)。

ESP8266 必须和 NAS 在同一二层网络。路由器不能开 AP 隔离 / 客户端隔离,否则无线侧发出的广播到不了有线网卡,唤醒会失败。


第一步:部署 Cloudflare 开机页

仓库里的 worker/ 就是云端部分。准备:

  • Node.js 20+
  • 一个 Cloudflare 账号(免费计划即可)
  • 一个挂在同一账号下的自定义域名(推荐)。部分网络对 workers.dev 的 DNS 不友好,自定义域名更稳
cd worker
npm install
npx wrangler login

设置两把密钥(只存在 Cloudflare,不要写进仓库):

# 生成一长串随机令牌给以后的 ESP 用
openssl rand -base64 24

npx wrangler secret put WAKE_PASSWORD   # 你在网页上输入的开机密码
npx wrangler secret put DEVICE_TOKEN    # 上面生成的那串,给 ESP8266

然后部署:

npx wrangler deploy

把自定义域名指到这个 Worker(仓库的 wrangler.jsonc 里可以写好路由)。部署后用手机流量打开页面试一下:

  • 密码框为空时,「开机」不能按
  • 密码错误时提示错误,状态不变
  • 密码正确后显示「待开机」
  • 两分钟内没有设备回报,变为「未送达」

此时家里还没有板子,页面卡在「待开机」再过期是正常的——说明云端状态机已经通了。

更细的接口说明见仓库里的 worker/部署.md。


第二步:烧录家里的 ESP8266

板子职责极窄:连家里 Wi-Fi → 每隔约 8 秒问云端要不要开机 → 需要就发魔术包 → 回报已消费。
 


准备一块 NodeMCU / 同类 ESP8266,以及 Arduino IDE(或 PlatformIO)。从示例复制本地密钥文件:

# Arduino 工程
# 编辑 esp8266/NasWake/secrets.h

# 或 
cd esp8266
cp include/secrets.h.example include/secrets.h

填三项:家里 Wi-Fi 名、Wi-Fi 密码、和 Cloudflare 里相同的 DEVICE_TOKEN。MAC 和广播地址写在固件源码里,不会出现在开机网页上——网页上也不该出现你家内网拓扑。

烧录成功后接上串口监视器(115200),正常时应看到类似:

WiFi 已连接
时间已同步
poll 空闲
poll 空闲
...

偶发一次 HTTPS 失败(例如 poll HTTP -1)后自动恢复,在 ESP8266 上并不少见;固件里对 TLS 做了重试。若长期证书校验失败,先确认 NTP 时间同步,再按仓库说明更新信任锚。

板载 USB 坏掉、只能用 Arduino Uno 当转接烧录的情况,仓库里有单独一篇踩坑记录:esp8266/用Arduino烧录.md。USB 正常的板子直接烧即可。

日常供电:拔掉电脑,插个 5V USB 充电器就行。两轮轮询之间不要深睡——每次重新握手 HTTPS,很容易拖过下一轮间隔。


第三步:联调一次真正的远程开机

顺序建议这样:

  1. 确认 ESP 已在串口里稳定 poll 空闲
  2. 把 NAS 关机或睡眠,确认网口待机灯仍亮
  3. 手机关掉 Wi-Fi,只用蜂窝数据打开开机页(避免你其实还连着家里局域网,测了个寂寞)
  4. 输入密码,按开机
  5. 页面应很快变为「待开机」;一轮轮询内,串口出现「要开机 → 魔术包已发出 → 已回报消费」;页面变为「指令已消费」
  6. 看 NAS 是否开始启动

「指令已消费」只表示魔术包已经发出,不保证系统已经进桌面。若要以后做「真的起来了没有」的探测,那是另一件事;开机指令本身应保持简单、可重试、幂等——重复发魔术包通常是无害的。


和「公网 IP + 端口转发」比,它好在哪

对照那篇远程访问教程,可以这样理解两者的关系:

 公网 IP + DDNS + 端口转发本文:Worker + ESP8266
解决的问题开机后怎么连进家里服务关机时怎么安全叫醒
要不要公网 IP通常要不要
要不要端口转发要不要
NAS 是否暴露公网端口暴露面更大关机时几乎无暴露;开机后仍可按你原来的方式访问
额外硬件一般不需要一块常开的 ESP8266
适合谁已有公网、愿意维护端口映射内网宽带、或只想要一个「远程开机按钮」

两者并不互斥。很多人的最终形态是:

  • 平时关机,靠这套方案远程唤醒
  • 开机之后,再用 Tailscale、WireGuard、Cloudflare Tunnel 或自家 DDNS 去访问文件和服务

Tunnel 很香,但记住它的前提:出口设备必须醒着。NAS 自己当隧道出口时,关机等于隧道一起消失——所以仍然需要局域网里有一台「永远醒着的小东西」来发魔术包。ESP8266 刚好胜任这个角色。


小结

远程访问 NAS,和远程唤醒 NAS,是两件不同的事。

前者依赖机器已经在线;后者需要在局域网里有一个常开的「信使」。用 Cloudflare Worker 当外网按钮和状态机,用一块 ESP8266 当信使发 Wake-on-LAN,可以在没有公网 IP、不开放端口的前提下,用手机流量完成一次干净的远程开机。

物料清单很短:一个 Cloudflare 账号、一个域名、一块 ESP8266、以及一台已经打开网络唤醒的 NAS。

代码与部署说明:github.com/Leshao-Zhang/nas-wake-cloudflare

如果你已经按那篇少数派文章配好了 DDNS 和端口转发,不妨把 NAS 改成「用时再开」——电费和硬盘都会谢谢你。