Frage

Ich versuche, ein WOL-Paket auf allen Schnittstellen, um das Tor zu erwachen zu senden (die der DHCP-Server, so dass die Maschine keine IP haben noch) nicht.

Und es scheint, dass ich nur Steckdosen binden können IP und Port-Paaren ...

Die Frage ist also: Wie ein einen Socket erstellen (oder etwas anderes), die zu einem NIC gebunden ist, die keine IP hat? (Alle languge ist in Ordnung. C # wird bevorzugt)

@ctacke: Ich weiß, dass WOL von MAC erfolgt Adresse ... Mein Problem ist, dass Windows sendet nur UDP-Broadcasts auf dem NIC, was Windows die primäre NIC (die mit der Standardroute nicht einmal die NIC ist zu der Auffassung, auf meine Vista-Maschine). Und ich kann scheint nicht einen Weg zu finden, eine Buchse an eine Schnittstelle zu binden, die keine IP-Adresse hat. (Wie DHCP-Clients dies tun)

@Arnout: Warum nicht? Die Kunden wissen, die MAC-Adresse des Gateways. Ich möchte nur einen Sende ein WOL-Paket wie ein DHCP-Client zunächst tut ... (DHCP entdecken Pakete von 0.0.0.0 kommen behaupten) Ich habe nichts dagegen, wenn ich das ganze Paket Byte für Byte zu konstruieren haben ...

War es hilfreich?

Lösung

Es scheint, dass ich eine Lösung gefunden zu haben. Man kann winpcap verwenden, um Pakete zu jeder Schnittstelle zu injizieren. Und es ist gut Wrapper für .net: http://www.tamirgal.com /home/dev.aspx?Item=SharpPcap

(I hätte eine Lösung bevorzugt, die keine zusätzlichen Bibliotheken installiert werden muss ...)

UPDATE: Hier ist, was ich kam ein WOL-Paket auf allen Schnittstellen bis zum Senden:

//You need SharpPcap for this to work

private void WakeFunction(string MAC_ADDRESS)
{
    /* Retrieve the device list */
    Tamir.IPLib.PcapDeviceList devices = Tamir.IPLib.SharpPcap.GetAllDevices();

    /*If no device exists, print error */
    if (devices.Count < 1)
    {
        Console.WriteLine("No device found on this machine");
        return;
    }

    foreach (NetworkDevice device in devices)
    {
        //Open the device
        device.PcapOpen();

        //A magic packet is a broadcast frame containing anywhere within its payload: 6 bytes of ones
        //(resulting in hexadecimal FF FF FF FF FF FF), followed by sixteen repetitions 

        byte[] bytes = new byte[120];
        int counter = 0;
        for (int y = 0; y < 6; y++)
            bytes[counter++] = 0xFF;
        //now repeat MAC 16 times
        for (int y = 0; y < 16; y++)
        {
            int i = 0;
            for (int z = 0; z < 6; z++)
            {
                bytes[counter++] =
                    byte.Parse(MAC_ADDRESS.Substring(i, 2),
                    NumberStyles.HexNumber);
                i += 2;
            }
        }

        byte[] etherheader = new byte[54];//If you say so...
        var myPacket = new Tamir.IPLib.Packets.UDPPacket(EthernetFields_Fields.ETH_HEADER_LEN, etherheader);

        //Ethernet
        myPacket.DestinationHwAddress = "FFFFFFFFFFFFF";//it's buggy if you don't have lots of "F"s... (I don't really understand it...)
        try { myPacket.SourceHwAddress = device.MacAddress; }
        catch { myPacket.SourceHwAddress = "0ABCDEF"; }//whatever
        myPacket.EthernetProtocol = EthernetProtocols_Fields.IP;

        //IP
        myPacket.DestinationAddress = "255.255.255.255";
        try { myPacket.SourceAddress = device.IpAddress; }
        catch { myPacket.SourceAddress = "0.0.0.0"; }
        myPacket.IPProtocol = IPProtocols_Fields.UDP;
        myPacket.TimeToLive = 50;
        myPacket.Id = 100;
        myPacket.Version = 4;
        myPacket.IPTotalLength = bytes.Length - EthernetFields_Fields.ETH_HEADER_LEN;           //Set the correct IP length
        myPacket.IPHeaderLength = IPFields_Fields.IP_HEADER_LEN;

        //UDP
        myPacket.SourcePort = 9;                
        myPacket.DestinationPort = 9;           
        myPacket.UDPLength = UDPFields_Fields.UDP_HEADER_LEN;


        myPacket.UDPData = bytes;
        myPacket.ComputeIPChecksum();
        myPacket.ComputeUDPChecksum();

        try
        {
            //Send the packet out the network device
            device.PcapSendPacket(myPacket);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

        device.PcapClose();
    }
}

Andere Tipps

WOL wird durch MAC, nicht IP. Hier ist ein Beispiel .

WOL ist ein sehr flexibles Protokoll, das in mehr verschiedenen Arten implementiert werden kann.

Die häufigsten sind:

  • Senden eines WOL als Payload eines Ethernet-Pakets.
  • ein WOL als Nutzlast einer UDP-Paket gesendet wird (für über das Netz-Routing).

Sobald es auf dem lokalen Netz landet es geht an alle Hosts im Netzwerk der Broadcast-MAC-Adresse.

Für ein Ethernet-Paket ist die Struktur:

  • Ziel-MAC: FF: FF: FF: FF: FF: FF (Broadcast)
  • A Magic Packet Payload

Für ein UDP-Paket ist die Struktur:

  • Ziel-MAC: FF: FF: FF: FF: FF: FF (Broadcast)
  • UDP-Port: 9
  • A Magic Packet Payload

Der Magic Payload besteht aus:

  • The Synchronization Stream: FFFFFFFFFFFF (das ist 6 Paare oder 6 Bytes FF)
  • 16 Kopien der MAC des Computers Sie WOL sind Signalisierung
  • Ein optionales Passwort von 0, 4 oder 6 Bytes.

Um WOL-Pakete aus dem Internet (über eine Firewall / Router) zu erhalten:

  • Konfigurieren Sie Router-Port 9 IP 255.255.255.255 (Broadcast IP)
  • weiterleiten
  • Stellen Sie die Ziel-IP: die externe IP des Routers

Hinweis: Dies kann nur mit dem UDP Beispiel erreicht werden, da Ethernet-Pakete, die die IP-Schicht, die für das Paket fehlen über das Internet geroutet werden. IE, Ethernet-Pakete sind die lokale Netzwerk-only-Option. Das Problem mit WOL-Pakete über UDP zu senden ist die Sicherheit, weil Sie den Router einstellen müssen IP-Rundfunk (255.255.255.255) zu ermöglichen. Aktivieren der Rundfunk-over-IP ist in der Regel eine schlechte Idee, weil das zusätzliche Risiko von internen Angriff innerhalb des Netzwerks (Ping Überschwemmungen, Cache-Spoofing, etc ...) betrachtet.

Für weitere Informationen über das Protokoll mit einer Abtasterfassung finden Sie unter dieser Seite .

Wenn Sie ein schnelles und unsauberes Kommandozeilen-Tool, die WOL-Pakete erzeugt (und du bist auf einem Debian laufen, Linux Mint oder Ubuntu) Sie können ein Tool installieren, der bereits dies tut.

Installieren Sie einfach über die Befehlszeile mit:

sudo apt-get install wakeonlan

Update:

Hier ist ein funktionierendes Beispiel, das ein WakeOnLan Paket mit der aktuellen Version von SharpPcap erzeugt.

using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using PacketDotNet;
using SharpPcap;

namespace SharpPcap.Test.Example9
{
    public class DumpTCP
    {
        public static void Main(string[] args)
        {
            // Print SharpPcap version
            string ver = SharpPcap.Version.VersionString;
            Console.WriteLine("SharpPcap {0}, Example9.SendPacket.cs\n", ver);

            // Retrieve the device list
            var devices = CaptureDeviceList.Instance;

            // If no devices were found print an error
            if(devices.Count < 1)
            {
                Console.WriteLine("No devices were found on this machine");
                return;
            }

            Console.WriteLine("The following devices are available on this machine:");
            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();

            int i = 0;

            // Print out the available devices
            foreach(var dev in devices)
            {
                Console.WriteLine("{0}) {1}",i,dev.Description);
                i++;
            }

            Console.WriteLine();
            Console.Write("-- Please choose a device to send a packet on: ");
            i = int.Parse( Console.ReadLine() );

            var device = devices[i];

            Console.Write("What MAC address are you sending the WOL packet to: ");
            string response = Console.ReadLine().ToLower().Replace(":", "-");

            //Open the device
            device.Open();

            EthernetPacket ethernet = new EthernetPacket(PhysicalAddress.Parse(
                "ff-ff-ff-ff-ff-ff"), PhysicalAddress.Parse("ff-ff-ff-ff-ff-ff"),
                EthernetPacketType.WakeOnLan);
            ethernet.PayloadPacket = new WakeOnLanPacket(
                PhysicalAddress.Parse(response));
            byte[] bytes = ethernet.BytesHighPerformance.Bytes;

            try
            {
                //Send the packet out the network device
                device.SendPacket(bytes);
                Console.WriteLine("-- Packet sent successfuly.");
            }
            catch(Exception e)
            {
                Console.WriteLine("-- "+ e.Message );
            }

            //Close the pcap device
            device.Close();
            Console.WriteLine("-- Device closed.");
            Console.Write("Hit 'Enter' to exit...");
            Console.ReadLine();
        }
    }
}

. Hinweis: Dies ist eine voll funktionsfähige Wake-On-Lan-Paket sendet Konsolenanwendung auf dem EXAMPLE09 gebaut, die in der SharpPcap Quelle gefunden werden können

Die Bibliotheken in diesem Beispiel verwendet werden, die in dem .NET-Framework können nicht gefunden werden, sind:

using PacketDotNet;

Diese Bibliothek (DLL) ist mit SharpPcap verpackt. Es ist verantwortlich für die gesamte Paket Konstruktion und Parsen innerhalb SharpPcap. Dies ist, wo die WakeOnLan Klasse befindet.

Hinweis: Das Paket Bau / Parsing-Code wurde ursprünglich innerhalb SharpPcap.dll gebündelt. Es wurde auf seine eigene lib migriert, da SharpPcap gemeint ist ein Wrapper für winpcap sein. Viele seiner Nutzer beschäftigen sich mit Protokollen und / oder dem Umgang mit rohem Vernetzung Pakete entwerfen.

using SharpPcap;

SharpPcap enthält alle die winpcap (Fenster) / libpcap (* nix) Wrapper-Code. Es ist erforderlich, um die Schnittstelle und sendet die aktuellen Pakete über den Draht zu wählen.

.NET arbeitet als virtuelle Maschine (CLR), so dass es abstrahiert viel von der zugrunde liegenden realen Maschine. Zum Beispiel bietet es nur Schnittstellen für TCP und UDP-Netzwerke, die viel höher im Netzwerk-Protokollstapel ist das, was Sie diskutieren. Sie könnten in der Lage, eine Drittanbieter-Komponente zu finden, die den Zugang zu einer niedrigen Level-Schnittstelle bietet, aber ich würde nicht auf sie zählt (ich habe in der Vergangenheit für .NET und Java sieht).

Für den Zugang zu diesen niedrig im Netzwerk-Protokollstapel, wahrscheinlich müssen Sie in C zu den entsprechenden OS Systemaufrufe codieren. Sie können dies am einfachsten in Python finden, und Sie können diese Funktionalität bereits in Python oder Bibliotheken von Drittanbietern implementiert finden. Zum Beispiel schlagen vor, wobei ich einen Blick auf die Twisted-Networking-Bibliotheken. Das war einer der Gründe, dass ich für einen großen Teil meiner Arbeit Python umgeschaltet wird.

Die besten Wünsche.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top