FRP+WoL实现远程开机+远程桌面
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等远控软件 两个方案都可以考虑
开整
其实很简单,拓扑图如下:
配置的话大概分这么几个部分:
网络唤醒(WoL) frp及路由器 远程控制软件
一. 网络唤醒(WoL)
1.1 WoL原理
WoL原理很简单,就是在PC关机或者睡眠之后让网卡和主板的部分功能继续工作。在网卡接收到特定的数据包(Magic Packet)的时候,激活PC。
这个特定的数据包叫做魔术包(Magic Packet),可以是广播帧。
也可以封装在UDP报文中(或者IPX数据包中,然而IPX早就凉了),通过UDP端口7或者端口9进行发送。
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之类的名字,反正大同小异。 找到类似的选项,打开它。
「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了.
安装很简单,常规的windows应用程序的安装方式,一路下一步. 注册之后,将被控端绑定到账号上,可以实时的看到被控端在线情况,这样就不需要去记访问ID和code了.
关于teamviewer就不多做介绍了,一个大名鼎鼎的远控软件,相信很多人都用过.
好,至此,所有的配置完成.
参考资料:
2.What Is Wake-on-LAN, and How Do I Enable It?
本文使用 mdnice 排版
FRP+WoL实现远程开机+远程桌面的更多相关文章
- linux 通过wol远程开机【转】
转自:http://yangbajing.blog.chinaunix.net/uid-10480699-id-5179860.html 今天发现个可以对linux服务器进行远程开机的软件-wakeo ...
- C#实现局域网内远程开机
1.远程开机原理 远程开机Wake on LAN(WOL),俗称远程唤醒,远程唤醒的实现主要是向目标主机发送特殊格式的数据包,是AMD公司制作的MagicPacket这套软件以生成网络唤醒所需要的特殊 ...
- Python 远程开机
用 Python 关机你肯定听过或者实践过,那么用 Python 开机呢?这是一个神奇的方法,教你如何用 Python 来开机. 本文目标 远程开机原理 Python 远程开机代码实现 Python ...
- java代码实现网络远程开机
http://my.oschina.net/kingfire/blog/156764 概述 远程开机(Wake onLAN)是指通过网络实现对服务器或者pc启动运行,现在很多网卡都支持的这个功能. 其 ...
- C#实现远程开机(局域网测试通过)
首先介绍相关知识. UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联 ...
- linux远程开机
它需要wakeonlan这个软件, 从何处得到它? 它的官方站是:http://sourceforge.net/projects/wake-on-lan/ 如果使用rpm包可以 ...
- windows下使用vnc viewer远程连接Linux桌面(转)
在windows下使用vnc viewer远程连接Linux桌面,主要配置步骤: Linux: 1.rpm -qa vnc //查看是否安装vnc服务,如果没有安装,可以使用yum,或者rpm进行安装 ...
- Linux远程连接Windows桌面
Ubuntu对初始用户的界面友好是有目共睹的:Fedora一向以创新.傲慢的姿态示人.其实,对于两者,我虽然更倾向于选择Fedora,但不可避免地会两者比较,发现Ubuntu更加人性化,这点是经过很多 ...
- java实现远程开机
import java.io.IOException; import java.net.*;public class 远程开机 { public static void main(String[] a ...
随机推荐
- Spring Boot笔记(六) springboot 集成 timer 定时任务
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.创建具体要执行的任务类: package com.example.poiutis.timer; im ...
- OkHttp,一次无奈的使用
一次使用OKHTTP的心痛历程 最近由于一些不得已的原因,接触到了OKHttp,说起来也挺Dan疼的,之前同事将生产附件上传地址配置成了测试地址,还好数量不多,没有造成太大的影响,况且的是这位同事又离 ...
- Java实现 洛谷 采药
题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:" ...
- Java实现 LeetCode 97 交错字符串
97. 交错字符串 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入: s1 = "aabcc", s2 = " ...
- Java实现 LeetCode 91 解码方法
91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...
- java实现第四届蓝桥杯快速排序
快速排序 题目描述 快速排序算法是典型的分治思想的运用.它使用某个key把全部元素分成两组,其中一组的元素不大于另一组.然后对这两组再次进行递归排序. 以下代码实现了快速排序.请仔细阅读代码,填写缺少 ...
- java实现第七届蓝桥杯反幻方
反幻方 题目描述 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方.每行每列以及对角线上的数字相加都相等. 下面考虑一个相反的问题. 可不可以用 1~9 的数字填入九宫格. ...
- 用js实现简单的抛物线运动
前言 老早就看过一些购物车的抛物线效果,也想自己凑热闹动手来实现一遍. 然后(lll¬ω¬) 书到用时方恨少,发现高中学到物理啊.数学啊,都忘光了,抛物线公式都忘了0 0. 顺手百度一波,从百度可知: ...
- 第一个SpringMVC程序 (注解版)
1.新建一个web项目 2.导入相关jar包 3.编写web.xml , 注册DispatcherServlet <?xml version="1.0" encoding=& ...
- 撒花,推荐一下我怒肝的 GitHub
缘起 之前一直有很多小伙伴们找我,让我聊一聊如何学习 Java ,我都直接回复了一个思维导图,后来想一想觉得回答不是很认真,我的初衷是想让小伙伴们根据思维导图中的知识点,采取各个击破 的原则,哪里不会 ...