故事背景
这是一个很复杂而且很久远的故事, 如果要讲的话, 这个故事可以追溯到 1981 年(「都是废话, 没有干货, 如果不感兴趣请从第二章开始」), 简单来说:
1981 年 RFC791 定义了 IPv4 地址, 自此拉开了 TCP/IP 一统天下的序幕
1991 年, 我出生了
2011,IANA 宣布 IPv4 地址正式佣金
不知道的某个时间节点, 三大运营商开始使用多级 NAT 技术解决家庭宽带 IPv4 地址紧张问题, 同时带来了内网无法无法访问的问题
2020 年 2 月, 新冠疫情来袭, 在家办公, 大量办公资料及开发环境留存在家里的电脑上
2020 年 5 月, 复工, 懒得整理个人的电脑文件更懒得背着自己的电脑上班
2020 年 6 月初, 有远程连接家里个人电脑取文件等需求
2020 年 6 月 17 日上午 10 点 07 分 00 秒, 在寻找各种远程方案, 发现向日葵开机棒可以满足我的需求
2020 年 6 月 17 日上午 10 点 07 分 01 秒, 意识到自己很穷, 没钱买开机棒
同日晚上 6 点 30 分, 决定采用 0 成本方案解决远程开机和远程控制的需求
故事背景就是这样的, 简单来说, 因为我自己的电脑上环境比较完善, 而且由于公司网络各种限制, 导致包括 GitHub 在内的很多网站访问不稳定, 所以有了远程控制的需求. 但是如果家里电脑一直开机的话, 作为一个 N 年前的伊拉克战损版 thinkpad, 我倒不担心耗电问题, 我担心的是长期开机它会不会着火...
所以, 我的需求和几种方案大概就汇总如下:
可以远程开关机
方案一: 在家里留一个人, 需要的时候打电话给 ta-- 不现实
方案二: 教会我家猫开电脑, 并且训练它听到特定手机铃声后按下开机键 -- 扯淡一样的想法
方案三: 小米 Wi-Fi 插座 + 上电既开机设置 -- 小米 Wi-Fi 插座京东 618 价格 39 元, 太贵了, 买不起
方案四: 使用上古技术 - 网卡唤醒计算机 - 需要一个网线直连路由器, 网线是当年在工程现场顺的, 不需要任何成本
公网可访问
方案一: 换专线业务, 并要求公网 IP-- 太贵, 性价比不高
方案二: 工信部投诉, 强烈要求运营商分配公网 IP-- 胜率不大, 而且有可能被当地客响中心揍
方案三: SSH 反向代理或者 frp 代理 + 白嫖的谷歌云 -- 存在被当做异常流量被封 VPS 的可能, 但是 0 成本
稳定流畅的远程桌面
方案一: 端口转发 + Windows 自带的远程桌面
方案二: teamviewer 等远控软件
两个方案都可以考虑
开整
其实很简单, 拓扑图如下:
frp 拓扑
配置的话大概分这么几个部分:
网络唤醒(WoL)
frp 及路由器
远程控制软件
一. 网络唤醒(WoL)
1.1 WoL 原理
WoL 原理很简单, 就是在 PC 关机或者睡眠之后让网卡和主板的部分功能继续工作. 在网卡接收到特定的数据包 (Magic Packet) 的时候, 激活 PC.
这个特定的数据包叫做魔术包(Magic Packet), 可以是广播帧.
封装在以太网中
也可以封装在 UDP 报文中(或者 IPX 数据包中, 然而 IPX 早就凉了), 通过 UDP 端口 7 或者端口 9 进行发送.
封装在 UDP 中
WoL 的消息格式也很简单, 先是 6 个字节的全 1(连续 6 个 FF), 然后是被唤醒主机的 Mac 地址, 最后可以带上 4 字节或者 6 字节的密码.
消息格式
WoL 需要主板和操作系统支持该功能才可以.
这里仅以 Windows 为例, 查阅了微软的文档, win10 为了提高系统启动速度, 默认情况下开启了所谓的快速启动. win10 的快速启动是介于关机 (S5 或者 G3) 和休眠 (S4) 的一种折中方案. 休眠的时候, 内存的所有数据都会被写到硬盘的文件里, 再次启动时, 仅需要加载该文件即可, 启动速度快, 但是占用磁盘空间较大. win10 的快速启动, 在关机的时候, 所有的用户进程都会被结束, 但是系统的内核和一部分驱动会保留下来并写入到磁盘, 再次启动的时候会先加载休眠文件, 之后再启动用户进程. 给用户的直接感受就是系统启动速度变快了.
但是根据微软的官方文档描述, 对于关机状态 (S5) 和快速启动状态下的唤醒, Windows 未能提供官方支持. 不过幸运的是, 现在的主板一般都支持了这个功能.
WOL is supported from sleep (S3) or hibernate (S4). It is not supported from fast startup or soft off (S5) shutdown states. NICs are not armed for wake in these states because users do not expect their systems to wake up on their own.
1.2 配置
WoL 的配置很简单, 大概分三步:
BIOS 中开启 WoL 功能
Windows 开启 magicPacket 唤醒
允许网卡网卡唤醒
树莓派配置
「BIOS 配置」
在 BIOS 中找一下相关的配置, 有可能叫 WoL, 有可能叫 wake via PCIE/PCI 之类的名字, 反正大同小异. 找到类似的选项, 打开它.
BIOS 配置
「Windows 配置」
win+x-->设备管理器 -->网络适配器 -->有线网卡 -->右键属性
有线网卡
在网卡的高级选项卡下, 找到魔术包唤醒, 并启用. 如果这里看不到的话, 请更新网卡驱动.
网卡配置
之后在电源管理中, 勾选允许此设备唤醒计算机
网卡电源管理
至此, WoL 配置完成.
配置完成后, 最明显的现象是, 在关机状态下可以看到, 计算机的网卡工作指示灯依旧是亮着的. 说明网卡在监听相关魔术包.
「树莓派配置」
唤醒设备可以选择支持网络唤醒的路由器, 树莓派, 以及另外一台终端等. 目前 openwrt 上有类似的插件可以使用. 但是我那台垃圾堆里淘换来的斐讯 K3 上刷的 openwrt 有点问题, 网络唤醒的插件并不好使. 所以, 我选择使用树莓派.
我的树莓派上跑的是 CentOS, 配置也很简单. 用于唤醒的工具 ether-wake 集成在了 ethtool 中. 所以:
yum -y install ethtool
安装完之后, 可以直接使用 ether-wake -i eth0 11:22:33:44:55 进行唤醒.
其中 eth0 是树莓派的有线网卡, 后面的 Mac 地址是被唤醒主机的 Mac 地址
配置完成后可以测试一下, wireshark 可以正常抓到魔术包.
发送成功
至此, 局域网内的配置完成.
二. 内网穿透
到上面为止, 我已经可以在内网顺利的唤醒我的笔记本. 下面要解决的是内网穿透问题. 也就是怎么在公网上访问树莓派.
关于内网穿透有很多的解决办法, 这里列出几个:
SSH 反向代理
frp
nps
...
这里选择 frp, 关于原理和配置这里不再赘述, 详情请查看 frp 的 GitHub 主页 https://github.com/fatedier/frp
使用相对还是比较简单的, 如果没有自己的 VPS, 可以使用这个公益性质的 frp 代理服务: 外网门 https://www.waiwang.men/
外网门目前国内的服务器基本都停掉了, 海外的几个机房勉强可用. 使用时, 请先做安全性评估.
到这里为止, 已经可以在外网正常的唤醒我的笔记本了.
但是!!!
操作起来相对还是有点复杂的, 要唤醒我的笔记本, 首先需要登录到树莓派, 然后再敲唤醒的命令, 而且 Mac 地址那么长, 谁记得住....
作为一个懒癌晚期患者, 一直遵循着自然界动物的所有行为偏向于能量消耗最低的方式这一法则. 所以我要做的是, 一键唤醒.
这里借助 https://pypi.org/project/paramiko/ 这个包, 做一个自动登录树莓派并发送命令的 python 脚本, 代码参考 python3+paramiko 实现 SSH 客户端 - 博客园 这篇文章
到这里为止, 基本实现了我的需求, 我只需要运行该 python 脚本就可以直接唤醒我的笔记本.
最后一步就是远控了.
三. 远程控制
既然在第二步我们已经做到了内网穿透, 远程控制也可以借助 frp 转发 3389 端口, 直接使用远程桌面. 但是为了更加方便, 我选择使用 teamviewer 作为主要方案, 远程桌面作为备用方案. 原因很简单, teamviewer 可以实现更方便的文件传输和带宽压缩, 也可以支持 VPN, 相比远程桌面更加方便.
teamviewer 下载地址: https://www.teamviewer.cn/cn/download/windows/
被控端我选择的是 teamviewer host, teamviewer host 可以支持无人值守访问, 相比 teamviewer 更方便.
teamviewer host
控制端就直接使用的是 teamviewer 了.
安装很简单, 常规的 Windows 应用程序的安装方式, 一路下一步. 注册之后, 将被控端绑定到账号上, 可以实时的看到被控端在线情况, 这样就不需要去记访问 ID 和 code 了.
关于 teamviewer 就不多做介绍了, 一个大名鼎鼎的远控软件, 相信很多人都用过.
好, 至此, 所有的配置完成.
参考资料:
- System Power States
- What Is Wake-on-LAN, and How Do I Enable It?
本文使用 https://mdnice.com/ 排版
来源: https://www.cnblogs.com/thecatcher/p/13210748.html