WOL — очень гибкий протокол, который можно реализовать несколькими способами.
Самые распространенные:
- Отправка WOL в качестве полезной нагрузки пакета Ethernet.
- Отправка WOL в качестве полезной нагрузки UDP-пакета (для маршрутизации по сети).
Как только он попадает в локальную сеть, он передается всем хостам в сети, используя широковещательный MAC-адрес.
Для пакета Ethernet структура следующая:
- MAC-адрес назначения: FF:FF:FF:FF:FF:FF (широковещательный)
- Волшебная полезная нагрузка пакета
Для UDP-пакета структура следующая:
- MAC-адрес назначения: FF:FF:FF:FF:FF:FF (широковещательный)
- UDP-порт: 9
- Волшебная полезная нагрузка пакета
Magic Payload состоит из:
- Поток синхронизации: FFFFFFFFFFFF (это 6 пар или 6 байтов FF)
- 16 копий MAC-адреса компьютера, который вы передаете WOL
- Необязательная парольная фраза длиной 0, 4 или 6 байт.
Чтобы получать пакеты WOL из Интернета (через брандмауэр/маршрутизатор):
- Настройте порт 9 маршрутизатора для переадресации на IP-адрес 255.255.255.255 (широковещательный IP-адрес).
- Установите IP-адрес назначения: внешний IP-адрес маршрутизатора.
Примечание. Этого можно добиться только с помощью примера UDP, поскольку в пакетах Ethernet отсутствует уровень IP, необходимый для маршрутизации пакета через Интернет. IE, пакеты Ethernet предназначены только для локальной сети. Проблема с отправкой пакетов WOL через UDP связана с безопасностью, поскольку вам необходимо настроить маршрутизатор для включения IP-вещания (255.255.255.255). Включение широковещательной передачи по IP обычно считается плохой идеей из-за дополнительного риска внутренней атаки в сети (заполнение ping-запросов, спуфинг кеша и т. д.).
Для получения дополнительной информации о протоколе, включая образец захвата, посетите этот сайт.
Если вам нужен быстрый инструмент командной строки, который генерирует пакеты WOL (и вы используете Debian, Linux Mint или 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). Это необходимо для выбора интерфейса и отправки фактических пакетов по сети.
person
Evan Plaice
schedule
10.11.2010