本文详解WoL魔术包原理、硬件配置、跨网段唤醒方案,让你随时随地唤醒家中设备。
前言
场景:你在公司,突然需要访问家里NAS上的一个文件。
问题:NAS设置了定时休眠以省电,现在是关机状态。
解决方案:远程唤醒(Wake-on-LAN)
WoL是一项已经存在20多年的技术,但很多人不知道或者配置不正确。今天我们就来彻底搞懂它。
一、WoL原理:魔术包
1.1 什么是魔术包
Wake-on-LAN通过发送一个特殊的网络数据包(Magic Packet)来唤醒计算机。
Magic Packet 结构:
┌────────────────────────────────────────────────────────┐
│ 6字节同步流 │ 目标MAC地址重复16次 │
│ FF FF FF FF │ AA:BB:CC:DD:EE:FF × 16 │
│ FF FF │ │
└────────────────────────────────────────────────────────┘
总大小:6 + 6×16 = 102 字节
1.2 为什么叫"魔术"包
def create_magic_packet(mac_address: str) -> bytes:
"""创建魔术包"""
# 解析MAC地址
mac_bytes = bytes.fromhex(mac_address.replace(':', '').replace('-', ''))
# 同步流:6个0xFF
sync_stream = b'\xff' * 6
# MAC地址重复16次
mac_repeated = mac_bytes * 16
# 组合
magic_packet = sync_stream + mac_repeated
return magic_packet
# 示例
mac = "AA:BB:CC:DD:EE:FF"
packet = create_magic_packet(mac)
print(f"魔术包大小: {
len(packet)} 字节")
print(f"内容: {
packet.hex()}")
输出:
魔术包大小: 102 字节
内容: ffffffffffff aabbccddeeff aabbccddeeff ... (重复16次)
1.3 WoL工作流程
┌─────────────────────────────────────────────────────────┐
│ WoL 工作流程 │
└─────────────────────────────────────────────────────────┘
正常状态:
┌──────────────┐
│ 电脑关机 │
│ ┌──────┐ │
│ │ 网卡 │ ← 保持通电,监听魔术包
│ └──────┘ │
└──────────────┘
唤醒流程:
1. 发送端构造魔术包
┌──────────────────┐
│ FF FF FF FF FF FF│
│ [MAC地址] × 16 │
└────────┬─────────┘
↓ UDP广播
2. 魔术包到达目标网卡
┌──────────────────┐
│ 网卡 │
│ 检测到魔术包 │
│ 验证MAC地址匹配 │
└────────┬─────────┘
↓
3. 网卡触发电源信号
┌──────────────────┐
│ 主板PME │
│ Power Management│
│ Event │
└────────┬─────────┘
↓
4. 电脑启动
┌──────────────────┐
│ 电源启动 │
│ 系统引导 │
└──────────────────┘
二、硬件配置
2.1 网卡设置
Windows:
1. 设备管理器 → 网络适配器 → 右键属性
2. 电源管理 → 勾选"允许此设备唤醒计算机"
3. 高级 → Wake on Magic Packet → Enabled
4. 高级 → Wake on Pattern Match → Disabled (可选)
Linux:
# 查看WoL状态
ethtool eth0 | grep Wake-on
# 启用WoL
ethtool -s eth0 wol g
# 永久启用(Ubuntu/Debian)
# /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
ethernet-wol g
# 或使用 systemd 服务
# /etc/systemd/system/wol.service
[Unit]
Description=Enable Wake-on-LAN
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s eth0 wol g
[Install]
WantedBy=multi-user.target
2.2 BIOS/UEFI设置
需要在BIOS中启用的选项(不同主板名称可能不同):
常见名称:
├── Wake on LAN
├── Wake on PCI/PCIe
├── Power On By PCI-E
├── Resume by LAN
├── Boot on LAN
└── ErP/EuP Ready → Disabled (重要!)
ErP说明:
ErP是欧洲能效标准,启用后会切断待机电源
WoL需要网卡保持通电,所以必须禁用ErP
2.3 路由器设置
某些路由器需要额外配置:
1. 关闭节能模式(可能会断开空闲设备)
2. 保持ARP表项(防止MAC地址过期)
3. 端口转发(用于跨网段唤醒)
# 常用WoL端口
UDP 9 (Discard Protocol)
UDP 7 (Echo Protocol)
三、局域网唤醒实战
3.1 Python实现
import socket
import struct
def wake_on_lan(mac_address: str, broadcast: str = "255.255.255.255", port: int = 9):
"""
发送WoL魔术包
Args:
mac_address: 目标MAC地址 (格式: AA:BB:CC:DD:EE:FF 或 AA-BB-CC-DD-EE-FF)
broadcast: 广播地址
port: 端口号 (通常是7或9)
"""
# 清理MAC地址格式
mac_clean = mac_address.replace(':', '').replace('-', '').upper()
if len(mac_clean) != 12:
raise ValueError(f"无效的MAC地址: {
mac_address}")
# 创建魔术包
mac_bytes = bytes.fromhex(mac_clean)
magic_packet = b'\xff' * 6 + mac_bytes * 16
# 发送UDP广播
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
try:
sock.sendto(magic_pa

最低0.47元/天 解锁文章
7993

被折叠的 条评论
为什么被折叠?



