WOL远程唤醒技术
WOL简介
WOL(Wake On Lan)局域网唤醒:是一种远程唤醒技术,允许通过网络发送一个特殊的信号来远程唤醒局域网中的计算机。这个信号是通过一个特殊格式的数据包(通常称为“Magic Packet”或“WOL数据包”)发送的,正是由于绝大多数的现代网卡都支持在超低功耗下监听特定的报文,WOL技术才得以应用。
-
WOL数据包是一个广播帧,包含目标计算机的MAC地址。
-
WOL数据包的最简单构成是6个字节的255(即十六进制表示的“FF FF FF FF FF FF”),紧接着是目标计算机的48位MAC地址,重复16次,数据包共计102字节。这个数据包可以包含在任何协议中,最常见的是包含在UDP中。
-
使用这种技术,具备适当硬件支持的计算机就可以在局域网内的另一台计算机上通过软件唤醒。这种软件通常会在局域网内广播一个UDP数据包,端口不限(通常是8、9号端口),数据内容就是具有特定格式的WOL数据包。只有指定的支持WOL的网卡才会处理这个数据包,并唤醒计算机。
使计算机具备远程唤醒的功能
目前大多数的机器都是默认开启了wake on lan,一部分的机器需要在BIOS里开启wake on lan,还有一部分机器不支持wake on lan。
具体的开启步骤如下(以华硕主板为例):
-
首先在启动引导界面按F2或者esc键进入BIOS界面:选择advanced选项
-
在选项中将wake on lan开启之后重启电脑
1.进入系统,按组合键Win+R输入:devmgmt.msc进入设备管理器:
2.选择网络适配器找到对应唤醒网卡双击:
3.点击高级选项,启用唤醒幻数据包:
4.在电源管理选项内,将“允许此设备唤醒计算机”开启:
- 这样就开启了远程唤醒的功能
发送WOL幻数据包远程唤醒计算机
设置好远程唤醒的功能之后,接下来就是如何唤醒计算机了,在WOL介绍里说过WOL数据包的最简格式是由6个字节的255和目标计算机的48位MAC地址,重复16次组成,并且这个数据包可以包含在任何协议中,最常见的是包含在UDP中。
那么接下来我们就通过python编写socket_UDP的脚本来实现对目标计算机进行远程唤醒,实现的代码很简单,首先定义一个组包函数,其次再定义一个发包函数即可实现,简要代码如下:
import socket
import struct
class WOL_SEND():
def __init__(self,wake_ip,wake_mac):
self.wake_ip = wake_ip
self.wake_mac = wake_mac
pass
def create_wol_package(self):
wake_mac_list = self.wake_mac.split(":")
mac = struct.pack("BBBBBB",int(wake_mac_list[0],16),int(wake_mac_list[1],16),int(wake_mac_list[2],16),int(wake_mac_list[3],16),int(wake_mac_list[4],16),int(wake_mac_list[5],16)) # 将mac地址转二进制
broadcast_mac = b"\xff"*6 # 生成6字节的FF
wol = broadcast_mac+mac*16 #将6字节FF与目标mac的16次进行合并得到wol幻数据包
return wol
def send_wol_package(self):
sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sockets.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) #设置广播
sockets.sendto(self.create_wol_package(),(self.wake_ip,9))
def main():
wake_ip =input("请输入唤醒设备的局域网IP地址:")
wake_mac = input("请输入即将发送wol远程唤醒数据包,请输入唤醒设备mac地址:")
ws = WOL_SEND(wake_ip,wake_mac) #创建对象,传入MAC地址与IP地址
ws.send_wol_package()
print(ws.create_wol_package())
print("[+]已发送远程指令")
if __name__ == "__main__":
main()
这里说一下为什么在发包的时候要进行广播:目的就是发送一条唤醒指令给当前局域网的所有主机,在发送的数据中还有目标的ip地址,在局域网的所有主机收到指令后会按照ip地址的对应来丢包,如果是自己的ip则会收包并唤醒计算机,如果不是自己的ip则会丢弃该数据包。
将该脚本放置在Android【termux】或任意局域网机器上运行,指定目标ip以及mac即可唤醒计算机
如果不在局域网内,如何唤醒计算机?
相信大多数人需要唤醒计算机时都不在计算机的局域网内,而可能在餐厅、公司等地方。如果是这样,那么如何远程唤醒计算机呢?
-
这就需要有一台在计算机局域网内的辅助开机设备,这台辅助设备设备时用来发送唤醒指令用的。
-
接下来需要在公网需要有一台主机。假如当前的A人在餐厅,而计算机在家里,这个时候就需要A人将主设备连接至公网主机,以公网主机作为跳板让局域网的辅助设备发送开机指令。