str*_*bly 5 windows multicast wake-on-lan
我有一台 Windows 10 服务器,它使用 Wake On Lan 运行良好有一段时间了。Realtek 适配器设置为启用魔包唤醒和禁用模式匹配唤醒。同样,Windows 设置为“仅在 Magic Packet 上唤醒”。这通常在我的家庭网络上运行良好:我有几个 WoL 客户端,每个客户端都可以在需要时唤醒服务器,并且服务器在不再需要时会立即休眠。
最近我在家庭路由器上启用了IGMP 代理以支持 IPTV 应用程序。但是,现在,一旦服务器休眠,它就会在几秒钟内再次唤醒,由网络适配器的唤醒信号触发。关闭 IGMP 代理,它停止唤醒。
我相当确信是某种多播数据包触发了唤醒。我已经使用 Wireshark 来嗅探导致唤醒的数据包,但我找不到罪魁祸首:唤醒时没有魔术数据包,但有很多多播数据包。
发生什么了?为什么适配器会唤醒似乎不是魔术的数据包?我该如何解决?
更新:
我已经进行了一个数据包捕获(只有 28 个数据包),它跨越了服务器上从睡眠到唤醒的时间段,因此应该包含有问题的数据包。我注意到没有一个帧包含服务器的 MAC 地址(就像魔术包一样),但大多数是 UDP -> RTTP -> ISO/IEC 13818-1 -> DVB-EIT 数据包,其中包含很多“ FF”填料(就像魔术包一样)。
还有 1 个 ICMP v6 数据包和 2 个 STP 帧。我不认为这些是这样做的,因为我认为我已经看到没有它们的唤醒捕获 - 但我可能是错的。
但是,请注意数据包捕获是通过交换机进行的。所以它会看到任何广播的魔法数据包(就像我故意发送的那样),但它不会捕获直接发送到服务器 MAC 的假设魔法数据包。另一方面,当我在服务器上捕获时(在它唤醒的条件下,但当它唤醒时 - 当然)我看不到任何类似于指向其 MAC 地址的魔术数据包。
NIC 是 Realtek 8168 PCI GbE 适配器,随附在我的 Asus P 8Z77-V LX 主板上,带有来自此处的最新驱动程序。
更新了更精确的症状
因此,IGMP 不是直接原因。我可以在不使用多播的情况下相当可靠地重现该问题。如果我只是将特定的 UDP 数据包(有效负载)作为 UDP 广播重复发送到适配器,我最终可以让它唤醒。通常需要 300 或 400 次发送。该数据包是从多播流的捕获中复制出来的,是其中看到的典型数据包。
这是我用来发送数据包的 Python 3 代码(以及显示为十六进制转储的数据包字节):
import time
from socket import *
cs = socket(AF_INET, SOCK_DGRAM)
hex_dump = '''
0000 01 00 5e 51 82 fb 78 24 af 98 f3 30 08 00 45 88
0010 05 4c 00 00 00 00 3a 11 a8 31 6d 9f f7 fb ea 51
0020 82 fb 16 aa 16 aa 05 38 00 00 80 21 0c a1 f9 47
0030 9b 2e 00 00 00 2d 47 40 12 13 00 4f f0 37 04 6d
0040 fb 01 01 04 6d ff 00 01 4f d0 35 e4 1c 17 30 00
0050 00 30 00 20 1c 4d 1a 65 6e 67 15 52 75 67 62 79
0060 20 54 6f 6e 69 67 68 74 20 4f 6e 20 54 6f 75 72
0070 00 9b fe ae 4d ff ff ff ff ff ff ff ff ff ff ff
0080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00e0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00f0 ff ff 47 1f ff 10 ff ff ff ff ff ff ff ff ff ff
0100 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0110 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0120 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0130 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0140 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0150 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0160 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0170 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0180 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0190 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff 47 40
01b0 12 14 00 4f f0 3b 04 6e fb 00 01 04 6e ff 00 01
01c0 4f e3 83 e4 1c 16 26 00 02 04 00 80 20 4d 1e 65
01d0 6e 67 19 4c 69 76 65 3a 20 44 61 72 6d 73 74 61
01e0 64 74 20 76 20 48 61 6d 62 75 72 67 00 20 6e 4f
01f0 2b ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0200 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0210 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0220 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0230 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0240 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0250 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0260 ff ff ff ff ff ff ff ff ff ff 47 40 12 15 00 4f
0270 f0 41 04 6e fb 01 01 04 6e ff 00 01 4f e3 87 e4
0280 1c 18 30 00 02 00 00 20 26 4d 24 65 6e 67 1f 4c
0290 69 76 65 3a 20 57 65 72 64 65 72 20 42 72 65 6d
02a0 65 6e 20 76 20 57 6f 6c 66 73 62 75 72 67 00 7b
02b0 ba e0 e7 ff ff ff ff ff ff ff ff ff ff ff ff ff
02c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
02d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
02e0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
02f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0300 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0310 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0320 ff ff ff ff ff ff 47 1f ff 10 ff ff ff ff ff ff
0330 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0340 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0350 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0360 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0370 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0380 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0390 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
03a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
03b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
03c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
03d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
03e0 ff ff 47 40 12 16 00 4f f0 2f 04 6f dd 00 01 04
03f0 6f ff 00 01 4f ca b7 e4 1c 17 00 00 00 15 00 80
0400 14 4d 12 65 6e 67 0d 4d 6f 74 6f 47 50 3a 20 49
0410 43 59 4d 49 00 81 93 dc 61 ff ff ff ff ff ff ff
0420 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0430 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0440 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0450 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0460 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0470 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0480 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0490 ff ff ff ff ff ff ff ff ff ff ff ff ff ff 47 40
04a0 12 17 00 4f f0 37 04 6f dd 01 01 04 6f ff 00 01
04b0 4f ca 41 e4 1c 17 15 00 00 15 00 20 1c 4d 1a 65
04c0 6e 67 15 42 54 20 53 70 6f 72 74 20 47 6f 61 6c
04d0 73 20 52 65 6c 6f 61 64 00 9a 07 13 89 ff ff ff
04e0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0500 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0510 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0520 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0530 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0540 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0550 ff ff ff ff ff ff ff ff ff ff
'''
arr = hex_dump.split('\n')
pkt = bytes()
for a in arr:
arr1 = a.split()
hex_str = "".join(arr1[1:])
pkt += bytes.fromhex(hex_str)
cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
for i in range(1000):
print(i)
cs.sendto(pkt[42:], ('192.168.1.255', 5802))
time.sleep(0.01)
Run Code Online (Sandbox Code Playgroud)
在 Microsoft 支持文章“
当您在 Windows 7 或 Windows Vista 中启用 LAN 唤醒功能时,可能会发生不需要的唤醒事件”中可能会找到一些提示。
似乎魔术包并不是启用 LAN 唤醒时正在侦听的唯一消息。
默认情况下,启用 WOL 时,Windows 7 和 Windows Vista 侦听以下数据包:
- 发送至网络适配器 MAC 地址的定向数据包
- 本地计算机名称的 NetBIOS 名称解析广播
- 网络适配器 IPv4 地址的地址解析协议 (ARP) 数据包
- 网络适配器请求节点多播地址的 IPv6 邻居发现数据包
我在两个地方找到了限制 LAN 唤醒事件的参考资料。
在“控制面板”>“网络和 Internet”>“网络连接”中,右键单击您的适配器并选择“属性”,然后单击“配置”。在“高级”选项卡中,有两个属性默认情况下均处于启用状态:魔术数据包唤醒和模式匹配唤醒。禁用第二个可能会有所帮助。
在电源管理选项卡中。确保勾选“ 允许此设备唤醒计算机”和 “仅允许魔术包唤醒计算机”旁边的两个复选框。
关闭本地网络上的 IPv6 也可能会限制意外唤醒事件的数量。