WOL - это очень гибкий протокол, который может быть реализован несколькими различными способами.
Наиболее распространенными являются:
- Отправка WOL в качестве полезной нагрузки пакета Ethernet.
- Отправка WOL в качестве полезной нагрузки пакета UDP (для маршрутизации по сети).
Как только он попадает в локальную сеть, он передается всем хостам в сети, используя широковещательный MAC-адрес.
Для пакета Ethernet структура:
- MAC-адрес получателя: FF: FF: FF: FF: FF: FF (широковещательная передача)
- Полезная нагрузка пакета магии
Для пакета UDP структура:
- MAC-адрес получателя: FF: FF: FF: FF: FF: FF (Broadcast)
- UDP-порт: 9
- Полезная нагрузка пакета магии
Магическая полезная нагрузка состоит из:
- Поток синхронизации: FFFFFFFFFFFF (это 6 пар или 6 байтов FF)
- 16 копий MAC-адреса компьютера, на который вы посылаете WOL
- Необязательный пароль 0, 4 или 6 байтов.
Для получения пакетов WOL из Интернета (через брандмауэр / маршрутизатор):
- Настройка порта 9 маршрутизатора для переадресации на IP 255.255.255.255 (Broadcast IP)
- Установка IP-адреса получателя: внешний IP-адрес маршрутизатора
Примечание. Этого можно достичь только на примере UDP, поскольку в пакетах Ethernet отсутствует уровень IP, необходимый для маршрутизации пакета через Интернет. IE, Ethernet-пакеты доступны только для локальной сети. Проблема с отправкой пакетов WOL через UDP связана с безопасностью, поскольку необходимо настроить маршрутизатор для включения IP-вещания (255.255.255.255). Включение широковещательной передачи по IP обычно считается плохой идеей из-за дополнительного риска внутренней атаки в сети (переполнение Ping, подмена кэша и т. Д.).
Подробнее о протоколе, включая пример захвата, см. этот сайт .
Если вам нужен быстрый и грязный инструмент командной строки, который генерирует пакеты WOL (и вы работаете в Debian, Linux Linux или Ubuntu), вы можете установить инструмент, который уже делает это.
Просто установите с помощью командной строки:
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.
Библиотеки, используемые в этом примере, которые не могут быть найдены в .NET Framework:
using PacketDotNet;
Эта библиотека (.dll) поставляется в комплекте с SharpPcap. Он отвечает за всю конструкцию пакета и его разбор в SharpPcap. Здесь находится класс WakeOnLan.
Примечание. Код создания / синтаксического анализа пакета изначально был включен в SharpPcap.dll. Он был перенесен в свою собственную библиотеку, потому что SharpPcap предназначен для работы с winpcap. Многие из его пользователей занимаются разработкой протоколов и / или обработкой необработанных сетевых пакетов.
using SharpPcap;
SharpPcap содержит весь код оболочки winpcap (windows) / libpcap (* nix). Нужно выбрать интерфейс и отправить фактические пакеты по сети.