IGMP和Wake On Lan


5

我有一台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地址的东西。

网卡是与最新的驱动程序我的华硕P 8Z77-V LX主板上提供一个Realtek的8168 PCI千兆以太网适配器这里

更新更精确的症状更新

因此,IGMP不是直接原因。我可以在不使用Multicast的情况下相当可靠地重现问题。如果我只是将一个特定的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)

1
您使用的NIC和驱动程序是什么?
阿尔滨

我已经加入了NIC信息的问题
strubbly

Answers:


1

Microsoft支持文章中可能会找到一些提示
在Windows 7或Windows Vista中启用Wake On LAN功能时可能会发生不需要的唤醒事件

看起来魔术包并不是启用Wake On Lan时唯一正在收听的消息。

默认情况下,启用WOL时,Windows 7和Windows Vista会侦听以下数据包:

  • 定向数据包到网络适配器的MAC地址
  • 为本地计算机名称广播的NetBIOS名称解析
  • 用于网络适配器的IPv4地址的地址解析协议(ARP)数据包
  • 用于网络适配器的请求节点多播地址的IPv6邻居发现数据包

有两个地方我发现了限制Wake On Lan事件的参考。

在“ 控制面板”>“网络和Internet”>“网络连接”中,右键单击适配器并选择“ 属性”,然后单击“ 配置”。在高级选项卡中有一些都默认启用两个属性:魔包唤醒唤醒模式匹配。禁用第二个可能会有所帮助。

在此输入图像描述

在“ 电源管理”选项卡中。确保勾选允许此设备唤醒计算机仅允许魔术包唤醒计算机旁边的两个复选框 。

图片

关闭本地网络上的IPv6也可能会限制意外唤醒事件的数量。


我肯定已经按照你的建议设置了这两个设置页面。
令人震惊的是

在本地网络上关闭IPv6并不确定你的意思。它在路由器上关闭但有些设备仍在使用它。
令人震惊的是

如果它在路由器上关闭,那么它将不会传递任何IPv6消息,所以没关系。我必须承认,我很惊讶您的计算机仍然被其他消息唤醒,即使您的设置应该禁用它。您的计算机,主板和网络适配器有哪些型号?
harrymc

我也很惊讶:-) PC是华硕P8Z77-V LX,它有一个Realtek GbE芯片。最新的Windows 10.
令人震惊的是

1
怎么powercfg –lastwake说?尝试在计算机空闲时运行powercfg -energy并发布结果。
harrymc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.