FRP+WoL实现远程开机+远程桌面
故事背景
这是一个很复杂而且很久远的故事,如果要讲的话,这个故事可以追溯到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--不现实
- 方案二:教会我家猫开电脑,并且训练它听到特定手机铃声后按下开机键--扯淡一样的想法
- 方案三:小米wifi插座+上电既开机设置--小米wifi插座京东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主页
使用相对还是比较简单的,如果没有自己的VPS,可以使用这个公益性质的frp代理服务:外网门
外网门目前国内的服务器基本都停掉了,海外的几个机房勉强可用. 使用时,请先做安全性评估.
到这里为止,已经可以在外网正常的唤醒我的笔记本了.
但是!!!
操作起来相对还是有点复杂的,要唤醒我的笔记本,首先需要登录到树莓派,然后再敲唤醒的命令,而且mac地址那么长,谁记得住....
作为一个懒癌晚期患者,一直遵循着自然界动物的所有行为偏向于能量消耗最低的方式这一法则. 所以我要做的是,一键唤醒.
这里借助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就不多做介绍了,一个大名鼎鼎的远控软件,相信很多人都用过.
好,至此,所有的配置完成.
参考资料:
2.What Is Wake-on-LAN, and How Do I Enable It?
本文使用 mdnice 排版
来源:oschina
链接:https://my.oschina.net/u/4343506/blog/4329281