![如何使局域网唤醒功能正常工作?](https://linux22.com/image/519170/%E5%A6%82%E4%BD%95%E4%BD%BF%E5%B1%80%E5%9F%9F%E7%BD%91%E5%94%A4%E9%86%92%E5%8A%9F%E8%83%BD%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我有一台位于路由器后面的 PC,它有一个动态 IP 地址,我想将其配置为局域网唤醒。
我如何将魔术包发送到 PC?我是否配置路由器以将 UDP 端口 6 转发到 PC?我如何从网络上的另一台 PC 发送数据包?网络外的 PC 怎么样?
这可能吗?
更新:这是我的路由器的相关配置屏幕。有希望吗?
答案1
静态 ARP 完全没有必要
您第一部分做对了。要将 WOL 数据包放入网络,请将来自特定端口的数据包转发到本地网络的广播地址 (255.255.255.255) 或您希望启用 WOL 访问的任何子网范围。
数据包的目标 MAC 地址应设置为以太网广播或 FF:FF:FF:FF:FF:FF。数据包的以太网类型应为 0x0842(局域网唤醒)。
那么,被唤醒的电脑的MAC去哪里了?
在魔术包本身中。WOL 包实际上仅用于通过本地网络发送。它们对链路层以上的任何协议都视而不见。为了绕过这个限制,它们向网络上的所有计算机广播(以太网广播而不是 IP 广播),每台计算机都会读取魔术包以查看自己是否是被呼叫的计算机。
魔包的内容包含被唤醒计算机的MAC地址的16个副本。
帧结构如下:
DA -> SA -> Type -> Magic Packet
在哪里:
DA = FF:FF:FF:FF:FF:FF
SA = [whatever the source MAC is]
Type = 0x0842
Magic = [The actual destination MAC repeated 16x]
如果您想测试传输的数据包是否具有正确的格式,请在 Wireshark 中使用以下过滤器:
ether dst FF:FF:FF:FF:FF:FF and ether proto 0x0842
基本上,WOL 应用程序需要能够创建一个欺骗以太网目标地址的数据包。网上有一些工具可以做到这一点,但我不熟悉它们。
注意:我之所以知道这么多,是因为我是 WOL 解析器的作者SharpPcap(C# 中的 pcap 包装器)。如果有足够的需求,我可以扩展我的控制台应用程序以包含数据包发送(它目前只能嗅探)并将其作为 OSS 项目提供。
更新:@Evan Anderson 提出了一个很好的观点,我忘了提及。在 LAN 上广播传入数据包通常不是一个好主意。此解决方案可行,但它只是一种绕过 LAN 唤醒协议限制的黑客手段。
我所概述的技术可以按照 WOL 的设计方式适用于 LAN 上的任何计算机,但如果有人向 WOL 端口发送特制的数据包,则可能会使您的网络被用作攻击 (Smurf/Fraggle/Papasmurf) 放大器。
埃文·安德森 (Evan Anderson) 的方法在技术上更安全,但仅限于单播。
答案2
听起来有些阅读 WOL可能是最先需要阅读的。另外,阅读一些有关以太网、ARP 和 UDP/IP 的内容也是必不可少的。
客户端中的 WOL 行为由“魔术包”触发。魔术包可以封装在任何类型的传输中(UDP over IP、IPX 等)。魔术包字节序列只需位于要唤醒的 NIC 将接收的数据包的有效负载中即可。
在 LAN 上发送 WOL 请求很容易。获取一个实用程序来制作魔术数据包(如麦月对于 Windows) 并开始射击。
从互联网发送 WOL 请求更成问题。将 UDP 端口从互联网转发到 LAN 的做法是正确的,但还存在其他问题。
您在使用来自 Internet 的单播 WOL 请求时遇到了以下问题:您的 WOL 客户端计算机的 MAC 地址不会出现在路由器的 ARP 表中,因为当 WOL 客户端关闭时,这样的 ARP 条目会过期。当您的路由器收到通过端口转发到 WOL 客户端 IP 地址的 IP 数据包时,如果 WOL 客户端关闭并且其 MAC 地址已从 ARP 表中过期,路由器将无法将数据包传送到客户端。您需要一台具有静态 ARP 功能的路由器才能实现此功能。
广播路由的可能性更小。由于您的路由器后面可能没有公共子网,而是使用 NAT 在您的 LAN 上共享单个公共 IP 地址,因此无法将数据包远程寻址到 LAN 子网的子网广播地址,以便路由器(如果它可以转发定向广播)将使用 WOL 数据包生成第 2 层广播,以允许 WOL 客户端“看到”它。
在您的 LAN 上使用 WOL 很容易。但跨 Internet 上使用 WOL 并不那么简单。
答案3
我不会重复为什么您会遇到问题,而只是描述我是如何克服 Evan 已经解释过的这些问题的。
我的防火墙/路由器是基于 Linux 的,这意味着我能够在其上运行命令。要唤醒 LAN 上的机器,我首先通过 SSH 进入防火墙,然后运行 Perl 脚本,该脚本会创建魔术包并将其发送到 LAN。目标的 MAC 地址可以作为命令行参数传递,也可以根据需要进行硬编码。
当然,如果您无法在路由器上执行命令,您将需要寻找其他方法。
答案4
我最近发现,端口转发 UDP 端口x.x.x.255
在一个路由器上有效,但在另一个路由器上无效。
我通过 telnet 在路由器上
arp add x.x.x.y FF:FF:FF:FF:FF:FF
为未使用的内部 IP (广播 MAC)添加了一个静态 ARP 条目,如下x.x.x.y
所述FF:FF:FF:FF:FF:FF
这里并将 WOL UDP 端口转发到该未使用的 IP,这对我来说可以从 Internet 进行 WOL。