كيفية إرسال WOL الحزمة(أو أي شيء) من خلال الصناعات التي لا يوجد عنوان IP ؟

StackOverflow https://stackoverflow.com/questions/445411

سؤال

أحاول إرسال WOL الحزمة على كل الواجهات من أجل أن يستيقظ العبارة(وهو DHCP server, لذلك الجهاز لن يكون لها IP حتى الآن).

ويبدو أن أستطيع فقط ربط مآخذ توصيل IP و port أزواج...

لذا فإن السؤال هو:كيف يمكن إنشاء مأخذ(أو شيء آخر) منضم إلى NIC لا IP ؟ (أي لغة هو موافق.c# هي مفضلة)

@ctacke:وأنا أعلم أن WOL يتم عن طريق عنوان MAC...مشكلتي هي أن ويندوز فقط يرسل UDP تبث على NIC ما Windows تعتبره الأولية NIC (والتي ليست حتى NIC مع المسار الافتراضي على آلة فيستا).وأنا لا يمكن أن يبدو للعثور على طريقة ربط مأخذ إلى واجهة التي لا يوجد عنوان IP.(مثل عملاء DHCP فعل هذا)

@Arnout:لماذا لا ؟ العملاء تعرف عنوان MAC من العبارة.أنا فقط أريد إرسال WOL حزم مثل DHCP العميل في البداية...(DHCP اكتشاف الحزم المطالبة تأتي من 0.0.0.0) أنا لا أمانع إذا كان علي أن بناء الحزمة كله تارك بايت...

هل كانت مفيدة؟

المحلول

يبدو أنني قد وجدت حلا.يمكن للمرء أن استخدام winpcap لحقن الحزم إلى أي واجهة.وهناك المجمع .صافي: http://www.tamirgal.com/home/dev.aspx?Item=SharpPcap

(كنت قد يفضل الحل الذي لا يتطلب أي إضافية المكتبات أن تكون مثبتة...)

تحديث: هنا هو ما جاء عن إرسال WOL حزمة على كافة الواجهات:

//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();
    }
}

نصائح أخرى

ويتم WOL من MAC، وليس IP. هنا مثال .

WOL مرنة جدا البروتوكول التي يمكن تنفيذها في عدة طرق مختلفة.

الأكثر شيوعا هي:

  • إرسال WOL كما حمولة ethernet الحزمة.
  • إرسال WOL كما حمولة حزمة UDP (التوجيه عبر الشبكة).

بمجرد أن يهبط على الشبكة المحلية انه يمر على جميع المضيفين على الشبكة باستخدام البث عنوان MAC.

بالنسبة Ethernet حزم هيكل هو:

  • الوجهة ماك:FF:FF:FF:FF:FF:FF (بث)
  • علبة سحرية الحمولة

عن حزمة UDP هيكل هو:

  • الوجهة ماك:FF:FF:FF:FF:FF:FF (بث)
  • منفذ UDP:9
  • علبة سحرية الحمولة

السحر حمولة تتكون من:

  • تزامن تيار:FFFFFFFFFFFF (6 أزواج أو 6 بايت من FF)
  • 16 نسخة من ماك الكمبيوتر كنت يشير إلى WOL
  • اختياري المرور من 0 ، 4 أو 6 بايت.

لتلقي WOL الحزم من الانترنت (من خلال جدار حماية/راوتر):

  • تكوين جهاز التوجيه ميناء 9 إلى الأمام إلى IP 255.255.255.255 (بث IP)
  • تعيين IP الوجهة:الخارجية IP من جهاز التوجيه

ملاحظة:هذا لا يمكن أن يتحقق إلا باستخدام UDP سبيل المثال لأن الحزم إيثرنت عدم طبقة IP اللازمة حزم أن يتم توجيهها من خلال شبكة الإنترنت.أي إيثرنت الحزم المحلية-الشبكة-الخيار الوحيد.المشكلة مع إرسال WOL حزم UDP هو الأمن لأن لديك تعيين جهاز التوجيه لتمكين IP البث (255.255.255.255).تمكين البث عبر بروتوكول الإنترنت عادة ما تعتبر فكرة سيئة بسبب وأضاف المخاطر الداخلية الهجوم داخل الشبكة (بينغ الفيضانات ذاكرة التخزين المؤقت خداع ، الخ...).

لمزيد من المعلومات حول البروتوكول بما في ذلك عينة التقاط ترى هذا الموقع.

إذا كنت تريد سريعة وقذرة أداة سطر الأوامر الذي يولد WOL الحزم (و أنت تعمل على ديبيان لينكس منت أو أوبنتو) يمكنك تثبيت أداة بالفعل هذا.

فقط تثبيت باستخدام سطر الأوامر:

sudo apt-get install wakeonlan

تحديث:

وهنا على سبيل المثال العمل الذي يولد WakeOnLan الحزمة باستخدام الإصدار الحالي من SharpPcap.

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();
        }
    }
}

ملاحظة:هذا هو وظيفية بالكامل Wake-On-Lan حزم ارسال "تطبيق وحدة تحكم" بنيت على Example09 التي يمكن العثور عليها في SharpPcap المصدر.

المكتبات المستخدمة في هذا المثال لا يمكن العثور عليها في .صافي الإطار هي:

using PacketDotNet;

هذه المكتبة (.dll) تأتي مغلفة مع SharpPcap.وهي مسؤولة عن كل من حزم البناء و الاعراب في SharpPcap.هذا هو المكان WakeOnLan الدرجة يقيم.

ملاحظة:الحزمة البناء/تحليل رمز في الأصل المجمعة ضمن SharpPcap.dll.كان هاجر إلى lib لأن SharpPcap من المفترض أن يكون المجمع winpcap.العديد من المستخدمين على التعامل مع تصميم بروتوكولات و/أو معالجة الخام الشبكات الحزم.

using SharpPcap;

SharpPcap يحتوي على جميع winpcap(windows)/يببكاب(*nix) التفاف التعليمات البرمجية.إنه في حاجة إلى تحديد واجهة إرسال الفعلية الحزم عبر الأسلاك.

و. NET تعمل بوصفها الجهاز الظاهري (وCLR)، لذلك تجرد بعيدا بكثير من الجهاز الحقيقي الأساسية. على سبيل المثال، انها لا تقدم سوى واجهات لTCP و UDP الشبكات، وهو أعلى بكثير في المكدس بروتوكول الشبكة أن ما نناقشه. كنت قد تكون قادرة على العثور على عنصر الجهات الأخرى التي توفر الوصول إلى واجهة المستوى الأدنى، ولكن أود أن لا أعول على ذلك (لقد بحثت في الماضي ل. NET و Java).

لالوصول إلى ذلك انخفاض في مكدس البروتوكول شبكة، وربما كنت سوف تحتاج إلى رمز في C لدعوات نظام OS ذات الصلة. قد تجد هذا أسهل في بيثون، وكنت قد تجد هذه الوظيفة نفذت بالفعل في مكتبات بايثون أو طرف ثالث. على سبيل المثال، أقترح أن نلقي نظرة على المكتبات الشبكات ملتوية. وهذا واحد من الأسباب التي تحولت إلى بيثون لجزء كبير من عملي.

وأطيب التمنيات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top