IGMP e Wake On Lan

5

Eu tenho um servidor Windows 10 que funciona bem há algum tempo usando o Wake On Lan. O adaptador Realtek é configurado com Wake On Magic Packet habilitado e Wake On Pattern Match desabilitado. Da mesma forma, o Windows está definido para "Acordar apenas no Magic Packet". Isso normalmente funciona bem em minha rede doméstica: eu tenho alguns clientes WoL que podem ativar o servidor quando precisam, e o servidor está configurado para adormecer imediatamente quando não for mais necessário.

Recentemente, ativei proxy IGMP no roteador doméstico para suportar um aplicativo de IPTV. No entanto, agora, assim que o servidor dorme, ele desperta novamente dentro de alguns segundos, acionado por um sinal de ativação do adaptador de rede. Desativar o IGMP Proxy e ele pára de acordar.

Estou bastante confiante de que é algum tipo de pacote multicast que está acionando o velório. Eu usei o Wireshark para cheirar os pacotes que causam o velório, mas não consigo encontrar o culpado: não há pacotes mágicos no momento do velório, mas muitos multicast.

Então, o que está acontecendo? Por que o adaptador está despertando em pacotes que não parecem ser mágicos? E como posso consertar isso?

Atualização:

Eu tomei uma captura de pacote (apenas 28 pacotes) que abrange o período de suspensão para ativar no servidor e, portanto, deve conter o pacote ofensivo. Observo que nenhum dos frames contém o endereço MAC do servidor (como faria um pacote mágico), mas a maioria deles é UDP - > RTTP - > ISO / IEC 13818-1 - > Pacotes DVB-EIT que contêm muito enchimento "FF" (como faria um pacote mágico).

Há também 1 pacote ICMP v6 e 2 quadros STP. Eu não acho que eles estão fazendo isso, porque eu acho que eu vi o wake captures sem eles - mas eu posso estar errado.

No entanto, observe que a captura de pacotes foi feita por meio de um switch. Então, ele veria qualquer pacote mágico que fosse transmitido (como os que eu envio deliberadamente são), mas não capturaria um pacote mágico hipotético enviado diretamente para o MAC do servidor. Por outro lado, quando eu capturar no servidor (sob as condições em que ele acorda, mas quando está acordado - é claro) eu não vejo nada parecido com um pacote mágico dirigido ao seu endereço MAC.

A NIC é um adaptador Realtek 8168 PCI GbE como fornecido na placa-mãe Asus P 8Z77-V LX com os drivers mais recentes de aqui .

ATUALIZADO COM SINTOMAS MAIS PRECISOS

Portanto, o IGMP não foi a causa direta. Eu posso reproduzir o problema de forma bastante confiável sem usar Multicast. Se eu simplesmente enviar um determinado pacote UDP (payload) repetidamente para o adaptador como uma transmissão UDP, posso eventualmente ativá-lo. Normalmente, são necessários 300 ou 400 envios. O pacote foi copiado de uma captura do fluxo de multicast e é típico do tipo de pacote visto nele.

Este é o código do Python 3 que eu usei para enviar o pacote (e os bytes do pacote mostrado como um hex dump):

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)
    
por strubbly 27.09.2018 / 22:18