Wake on LAN em diferentes sub-redes

2

Eu tenho 3 blocos IP e 3 switches Cisco. Cada comutador tem seu próprio bloco de IP - 10.45.100.0/24, 10.45.101.0/24 e 10.45.102.0/24

Eu tenho um PC no bloco 10.45.100.0/24. Eu posso acordar computadores inteiros (com endereço IP, endereço Mac, sub-rede, porta) neste bloco de IP de C #.

Mas quando tento ativar outra máquina de um bloco de IPs diferente, isso não funciona.

Este é um problema de rede ou problema de código? Como posso resolver isso?

    
por Ibrahim AKGUN 28.06.2011 / 22:59

7 respostas

6

Este é um problema fundamental: WOL só funciona dentro de uma sub-rede, porque um pacote mágico WOL não é é um pacote IP válido e, portanto, não é roteado além da LAN local.

A entrada da Wikipedia descreve uma solução para este problema (transmissões direcionadas à sub-rede), mas eu nunca vi isso em ação. Outra maneira de contornar o problema pode ser criar um agente proxy WOL que encaminha pacotes WOL para outras sub-redes (ou seja, como um pacote UDP).

    
por 28.06.2011 / 23:08
2

Se você tiver três sub-redes diferentes, essas sub-redes não poderão se comunicar sem um roteador.

Isso é 100% deliberado e por design.

Seu Gateway Padrão da máquina que você está tentando fazer com a WOL deve explicitamente saber como chegar a essas outras sub-redes, ou então envia seu pacote para a internet, onde ele ser imediatamente descartado pelo seu ISP.

Você tem duas opções:

  1. Configurar o roteamento adequado entre as sub-redes
  2. Reduza sua máscara de sub-rede para algo como 255.255.0.0 (/ 16) para que todas as máquinas estejam na mesma sub-rede. Eu não recomendo isso, pois tenho certeza de que há uma razão pela qual suas máquinas são separadas por sub-rede uma da outra.
por 29.06.2011 / 07:09
1

Uma solução possível: Adicione uma segunda (até uma terceira) placa NIC ao seu PC de controle, depois configure com os outros endereços IP para conectar diretamente com os outros roteadores. Os pacotes mágicos passarão a NIC associada ao IP de destino no comando WOL (IP, MAC, sub-rede, porta).

    
por 03.06.2015 / 19:25
1

Os pacotes mágicos WOL são sub-redes apenas como você percebeu. Você pode usar o Unicast ou Broadcast Directed Broadcast dependendo do que você pode habilitar na sua configuração de rede / roteador:

link

As desvantagens disso são que as transmissões direcionadas geralmente não são suportadas por padrão devido a preocupações com segurança e desempenho. Embora o Unicast seja comumente dependente da memória da tabela de endereços MAC mantida nas configurações do roteador que são eliminadas, geralmente em cerca de quatro horas.

    
por 01.03.2017 / 20:55
0

Eu tenho uma solução, mas funciona para endereços IP fixos. Eu não sei, mas pode ser possível alterar um código para corrigir isso para endereços dinâmicos.

Tudo o que você precisa - enviar um pacote mágico para o endereço fixo do seu computador. Eu criei um pequeno utilitário.

Minha sub-rede é 172.17.111.0/24, os pacotes são enviados de 172.17.105.0/24

class Program
{
    static readonly Tuple<string, byte[]>[] Addr = {
        new Tuple<string, byte[]>("**-**-30-9D-98-61", new byte[] { 172, 17, 111, 91 }),
        new Tuple<string, byte[]>("**-**-D9-7B-9D-E9", new byte[] { 172, 17, 111, 70 }),
    };

    static void Main(string[] args)
    {
        var id = args.Length > 0 ? int.Parse(args[0]) : 0;

        WolClass client = new WolClass();
        client.Connect(new IPAddress(Addr[id].Item2),  0x9); 
        client.SetClientToBrodcastMode();
        //set sending bites
        int counter = 0;
        //buffer to be send
        byte[] bytes = new byte[1024];   
        //first 6 bytes should be 0xFF
        for (int y = 0; y < 6; y++)
            bytes[counter++] = 0xFF;
        //now repeate MAC 16 times
        for (int y = 0; y < 16; y++)
        {
            int i = 0;
            for (int z = 0; z < 6; z++)
            {
                bytes[counter++] = byte.Parse(Addr[id].Item1.Substring(i, 2), 
                                              NumberStyles.HexNumber);
                i += 3;
            }
        }

        //now send wake up packet
        client.Send(bytes, 1024);
    }
}

public class WolClass : UdpClient
{
    //this is needed to send broadcast packet
    public void SetClientToBrodcastMode()
    {
        if (this.Active)
            this.Client.SetSocketOption(SocketOptionLevel.Socket,
                SocketOptionName.Broadcast, 0);
    }
}
    
por 04.07.2018 / 13:27
0

No Linux, eu uso wol (v0.7.1) para enviar pacotes mágicos WOL para um endereço de transmissão específico:

wol -v --host=192.168.2.255 --port=9 a5:bd:dc:fe:38:8c
Waking up a5:bd:dc:fe:38:8c with 192.168.2.255:9...

Meu servidor tem uma interface separada na sub-rede 192.168.1.0 para sua conexão pública à Internet, e meus nós wake-on-LAN estão em uma sub-rede privada 192.168.2.0.

No Windows, usei WakeMeOnLan (v1.83) para realizar a mesma coisa. Ele também suporta um endereço de broadcast personalizado. Versões de até 1.68 tinham um recurso Usar endereço de broadcast de acordo com o endereço IP , que pode ter sido removido de versões posteriores.

    
por 18.10.2018 / 19:20
-1

É provavelmente um problema de rede. Você está enviando uma mensagem de difusão que provavelmente está bloqueada em seu firewall / roteador, porque você raramente permite que o tráfego de transmissão cruze as redes.

Eu suponho que você pode acordar computadores em seu IP individual? Se você não puder fazer isso, eu diria que seus blocos de firewall são ativados no tráfego de lan completamente.

    
por 28.06.2011 / 23:03