前言#
本科毕业,我把我的台式机从宿舍搬回了家,又是一番舟车劳顿。下学期,我实在不想再把这么个笨重的大家伙搬到我研究生学校去,遂研究有没有远程操作方案。
一直以来,我都在学校使用 ZeroTier 组网 + Remote Desktop 远控 + 向日葵备用 作为远程控制方案:台式主机在宿舍跑着,本人在教学楼使用平板等设备远程操作台式机,体验非常丝滑。但是这一方案没有解决远程开关机的问题,所以当时经常拜托室友帮忙打开电脑。
到家之后,鉴于上述原因,我决定解决远控方案的最后一环:通过网络启动台式机电源。
方案简介#
目前的 Wake-on-LAN (WOL) 技术已经足够成熟,只需要在局域网内有一个能按需向台式机发送特定数据包(魔术包)的设备,就能实现从网络唤醒设备。刷入了 OpenWrt 的路由器完全可以承担此功能。
然而路由器通过宽带拨号连接到公网,外部网络无法直接访问家庭局域网并调用 WOL,因此需要采取内网穿透手段。考虑到安全性和已有经验,最快捷的方法是将 OpenWrt 路由器也加入到 ZeroTier 网络中,实现异地管理路由器。
综上,方案的核心就是拥有一个 OpenWrt 路由器,并在上面配置 WOL 功能以及 ZeroTier。
这样一来,当我需要异地访问台式机时,我可以通过 连接 ZeroTier 网络 → 浏览器进入 OpenWrt 管理界面 → 发送 WoL 魔术包 → RD 远控台式机 一气呵成。
详细实现#
实现步骤分为两个阶段,安装配置ZeroTier以及启用WoL功能。由于非本篇重点,此处不再介绍 ZeroTier 异地组网的实现,仅涉及在 OpenWrt 路由器上安装并使用 ZeroTier。有需要的同学可自行寻找相关教程,也可在评论区留言讨论。
ZeroTier 的配置#
安装并启用 Zerotier#
在登入 OpenWrt 的 SSH 终端后,直接使用 opkg 命令即可安装 ZeroTier。
opkg update
opkg install zerotierbash接下来,需要修改默认配置并启动 ZeroTier。
首先,使用 vi 编辑默认配置文件 /etc/config/zerotier,将第三行的 option enabled 0 改为 option enabled 1。否则在后续启动时将报错。
config zerotier 'global'
# Sets whether ZeroTier is enabled or not
option enabled 0
# Sets the ZeroTier listening port (default 9993; set to 0 for random)
#option port '9993'
# Client secret (leave blank to generate a secret on first run)
option secret ''
# Path of the optional file local.conf (see documentation at
# https://docs.zerotier.com/config#local-configuration-options)
#option local_conf_path '/etc/zerotier.conf'
# Persistent configuration directory (to perform other configurations such
# as controller mode or moons, etc.)
#option config_path '/etc/zerotier'
# Copy the contents of the persistent configuration directory to memory
# instead of linking it, this avoids writing to flash
#option copy_config_path '1'
...plaintext接着,使用命令启动 ZeroTier。首次启动时,程序将生成 secret 并写入配置文件,并在 /var/lib/zerotier 下生成临时配置。
/etc/init.d/zerotier enable
/etc/init.d/zerotier startbash接下来,就可以使用 zerotier-cli join 等命令加入网络了。
持久化配置#
然而,此时 Zerotier 的配置仍然位于临时目录,会在系统重启后消失。因此我们需要启用持久化配置。并且由于我在服务器上部署了私有 Planet,使用自有服务器作为根服务器(详细可参考该篇教程 ↗),需要将配置目录下的 planet 文件替换成自有的。
为达成这一目的,我们需要拷贝一份当前配置到持久化目录:
mkdir -p /etc/zerotier
cp -r /var/lib/zerotier-one/* /etc/zerotier/bash接着,使用 vi 编辑配置文件 /etc/config/zerotier,编辑对应配置块:
config zerotier 'global'
# 此处省略其他配置
option config_path '/etc/zerotier'
# 结束所有修改(包括加入网络),确认配置成功后
# 在配置中取消注释以下内容并重启服务
# 这是为了避免将配置改动反复写入闪存
#option copy_config_path '1'plaintext注:在配置过程中,笔者没有测试持久化目录为空的情况下,程序是否会自动生成一份新的配置,因此采用了更“绕”的“先以默认配置启动→拷贝配置→应用持久化→修改配置”的方式。读者可以自行验证能否直接在上一节的默认配置中加入这两行,从而直接在持久化目录进行修改。
重启Zerotier,确保持久化目录生效。
/etc/init.d/zerotier restartbash使用 scp 命令从本地上传已经准备好的 planet 文件,并再次重启。
scp planet root@192.168.1.1:/etc/zerotier/
/etc/init.d/zerotier restartbash此时,可以使用 zerotier-cli peers 命令检查私有 Planet 是否生效。最后,使用 zerotier-cli join 加入网络。同时,在 ztncui 管理界面通过认证。
完成所有配置后,可以回到配置文件,启用 option copy_config_path 配置。这样后续 ZeroTier 会直接使用 RAM 中的副本运行,减少频繁写入 Flash,延长闪存寿命。
测试连通性并配置防火墙#
完成配置后,在 OpenWrt 上 ping 网络中其他设备,发现可以连通。

然而从其他设备上尝试 ping 路由器,却报错“无法连到端口”。这是因为 OpenWrt 的防火墙默认拦截了来自 ZeroTier 对应接口的数据包。为此,需要在 OpenWrt 管理界面创建新的防火墙规则,放行数据包。
OpenWrt 的 firewall4 默认通过 网络接口(Network Interface) 管理防火墙,而 ZeroTier 创建的虚拟接口默认不会自动成为一个 Interface,因此来自 ZeroTier 的数据包会被视为未知来源而被默认规则拦截。
在上方栏找到“网络”→“防火墙”,在常规设置中单击“添加区域”。防火墙规则如下图所示。

应用防火墙设置后,即可正常通过 Zerotier 网络连接到路由器。
注:也有部分教程推荐在 LuCI 中为 ZeroTier 虚拟设备创建接口并统一管理。笔者尝试后发现可能存在冲突,无法正常连接。故障排除无果后采用此方案。
启用 WoL 功能#
只要能够在外网访问到路由器,剩下的就只是一些 WoL 的简单配置问题了。此处将快速带过需要注意的配置项。
启用硬件与操作系统相应功能#
首先需要修改 BIOS 设置,确保电源管理层面允许网卡唤醒并启动电源。不同厂家设置各不相同,可自行探索。

接着,需要在系统/网卡驱动层面调整设置,确保 WoL 功能开启。在 Windows 的网络适配器选项中,右键选中有线网卡对应的连接,打开“属性”菜单。在弹出的窗口中配置如下图所示的设置项。

在 OpenWrt 上安装 Wake-on-LAN 插件#
进入 OpenWrt 终端后,可直接使用 opkg 安装带图形界面的 WoL 工具。
opkg update
opkg install etherwake luci-app-wolbash安装完成后,可以在路由器管理页看到相应界面。选择或输入台式机的 MAC 地址,即可成功启动计算机。
