如何在不启用 IP 定向广播的情况下通过以太网广播 WOL
How to broadcast WOL over ethernet without enabling IP directed broadcast
我正在用 C# 构建 Wake On Lan 程序,我发现了很多 WOL 代码,但到目前为止我发现的任何代码都不起作用。我相信这是因为我无法启用 IP 定向广播(客户的安全策略不会启用此功能以防止 DOS 攻击)。
我正在寻找一种通过以太网将魔法数据包直接发送到请求的 mac 地址的方法 - 现在它似乎正在通过 UDP 发送到 255.255 .255.255
(我不明白的是为什么它需要发送到 255.255.255.255 而不是 mac 本身)
这是我目前拥有的代码(不记得是在哪里找到的)。
public static bool WakeOnLan(string MacAddress)
{
try
{
MacAddress = MacAddress.Replace("-", "");
MacAddress = MacAddress.Replace(":", "");
if (MacAddress.Length != 12)
{
return false;
}
byte[] mac = new byte[6];
for (int k = 0; k < 6; k++)
{
mac[k] = Byte.Parse(MacAddress.Substring(k * 2, 2), System.Globalization.NumberStyles.HexNumber);
}
// WOL packet is sent over UDP 255.255.255.0:40000.
System.Net.Sockets.UdpClient client = new System.Net.Sockets.UdpClient();
client.Connect(System.Net.IPAddress.Broadcast, 4000);
byte[] packet = new byte[17 * 6];
for (int i = 0; i < 6; i++)
packet[i] = 0xFF;
for (int i = 1; i <= 16; i++)
for (int j = 0; j < 6; j++)
packet[i * 6 + j] = mac[j];
client.Send(packet, packet.Length);
return true;
}
catch
{
return false;
}
}
如有任何帮助,我们将不胜感激。
谢谢
WoL 帧被发送到广播 MAC 地址,ffff:ffff:ffff
。为此,您必须将 IP 数据包发送到网络或有限广播地址。广播不通过路由器,因为这是一个 巨大的 安全漏洞。
必须从不同网络发送 WoL 的实现通过在 LAN 上放置 WoL 服务器来执行此操作,并将命令发送到 WoL 服务器,然后 WoL 服务器将在 LAN 上发送 WoL 帧。
编辑:
如果您尝试在同一 LAN 上对源和目标执行 WoL,您可以使用 LAN 或有限广播,因为帧不会尝试通过路由器。
你真的不应该使用UDP。这可以通过以太网框架来完成。只需将帧发送到 ffff:ffff:ffff
。仅需要 IP 地址才能将数据包从一个网络发送到另一个网络。 LAN 上的数据在第 2 层传送,例如以太网,帧。
您可以只使用 0x0842
的 EtherType,然后在帧有效载荷中,放入 0xffffffffffff
,紧接着是目标 MAC 地址的 16 次重复。这就是 "Magic Packet" 所需的全部内容,因为它实际上是一个帧,而不是一个数据包。
我正在用 C# 构建 Wake On Lan 程序,我发现了很多 WOL 代码,但到目前为止我发现的任何代码都不起作用。我相信这是因为我无法启用 IP 定向广播(客户的安全策略不会启用此功能以防止 DOS 攻击)。
我正在寻找一种通过以太网将魔法数据包直接发送到请求的 mac 地址的方法 - 现在它似乎正在通过 UDP 发送到 255.255 .255.255
(我不明白的是为什么它需要发送到 255.255.255.255 而不是 mac 本身)
这是我目前拥有的代码(不记得是在哪里找到的)。
public static bool WakeOnLan(string MacAddress)
{
try
{
MacAddress = MacAddress.Replace("-", "");
MacAddress = MacAddress.Replace(":", "");
if (MacAddress.Length != 12)
{
return false;
}
byte[] mac = new byte[6];
for (int k = 0; k < 6; k++)
{
mac[k] = Byte.Parse(MacAddress.Substring(k * 2, 2), System.Globalization.NumberStyles.HexNumber);
}
// WOL packet is sent over UDP 255.255.255.0:40000.
System.Net.Sockets.UdpClient client = new System.Net.Sockets.UdpClient();
client.Connect(System.Net.IPAddress.Broadcast, 4000);
byte[] packet = new byte[17 * 6];
for (int i = 0; i < 6; i++)
packet[i] = 0xFF;
for (int i = 1; i <= 16; i++)
for (int j = 0; j < 6; j++)
packet[i * 6 + j] = mac[j];
client.Send(packet, packet.Length);
return true;
}
catch
{
return false;
}
}
如有任何帮助,我们将不胜感激。
谢谢
WoL 帧被发送到广播 MAC 地址,ffff:ffff:ffff
。为此,您必须将 IP 数据包发送到网络或有限广播地址。广播不通过路由器,因为这是一个 巨大的 安全漏洞。
必须从不同网络发送 WoL 的实现通过在 LAN 上放置 WoL 服务器来执行此操作,并将命令发送到 WoL 服务器,然后 WoL 服务器将在 LAN 上发送 WoL 帧。
编辑:
如果您尝试在同一 LAN 上对源和目标执行 WoL,您可以使用 LAN 或有限广播,因为帧不会尝试通过路由器。
你真的不应该使用UDP。这可以通过以太网框架来完成。只需将帧发送到 ffff:ffff:ffff
。仅需要 IP 地址才能将数据包从一个网络发送到另一个网络。 LAN 上的数据在第 2 层传送,例如以太网,帧。
您可以只使用 0x0842
的 EtherType,然后在帧有效载荷中,放入 0xffffffffffff
,紧接着是目标 MAC 地址的 16 次重复。这就是 "Magic Packet" 所需的全部内容,因为它实际上是一个帧,而不是一个数据包。