我正在尝试通过互联网启用 WOL。我创建了 Discord Bot,每当我向 discord 发送特殊命令时,它都会使用 python 库https://pypi.org/project/wakeonlan/发送一个魔法数据包。
当我在我的局域网内的台式计算机上托管机器人并向 Discord 发送一个特殊命令时,该机器人将向我的公共 ip(使用主机名)发送一个魔法数据包。我正在使用 ddns no-ip 来解析我的 ip。我的调制解调器路由器开箱即用仅支持 no-ip。这工作得很好,我的第二台电脑启动了(稍后当我说“第二台电脑”时,我总是指我试图唤醒的电脑)。
现在,如果我停止在台式机上托管我的 discord 机器人并将其托管在 Azure 中,它并不总是有效。有时它确实如此,据我所知,这是由于我的路由器缓存 ARP 条目一段时间所致。但有趣的是,即使它可以短暂工作,如果我有任何其他计算机通过网络电缆连接到我的路由器而不是我试图启动的电脑,它也永远不会工作。一段时间后,它无论如何都会完全停止工作。
所以我有一个来自我的 ISP 的调制解调器,它有一个内置路由器(我猜是交换机,因为它有四个端口)。不幸的是我找不到它的模型。就像我说的,它支持 ddns (no-ip)。它支持 ip 保留,因此我可以将预定义的 IP 地址分配给某些 mac 地址。通过这种方式,我定义了我试图唤醒的 PC 始终获得相同的 IP 地址。然后我在该路由器中创建了端口转发规则,说任何进入端口 7(我也尝试过端口 9)的传入 UDP 数据包(我的机器人正在发送的魔术数据包)都被转发到我连接到我的第二台电脑的那个 IP 地址MAC地址。
在这一点上,我还想说,显然我的路由器不支持转发到广播 IP 地址。
我做了一些研究,我发现我所做的可能还不够。人们说我应该能够手动将条目添加到 ARP 映射表,不幸的是我当前的路由器/交换机不能这样做。
所以,我去买了一个二手的 TP-LINK TL-SG2008 智能交换机,它支持静态 ARP 映射和其他我不知道但可能很方便的有趣东西。
现在,我不再将我的第二台电脑直接连接到我的调制解调器/路由器,而是将我的新交换机连接到我的调制解调器/路由器。TL-SG2008 交换机从 DHCP 获取 IP 地址(我已经再次配置为始终相同)并且我能够使用其 IP 地址和 Web 浏览器登录管理门户。
我在那里定义了静态 ARP 映射条目,说我的第二台电脑 MAC 地址映射到这个特定的 IP。请记住,这是我已经在我的路由器 ip 保留列表中定义的 IP,因此其他设备将永远无法获得它。
现在我终于将我的第二台电脑连接到我的新交换机,在 Azure 中托管了 discord 机器人,向 discord 发送了一个命令,但什么也没有。
然后我在本地托管了 bot,向 Discord 发送了一个命令,它开始工作了。
然后我将另一台电脑连接到我的调制解调器/路由器,在本地托管机器人,向 Discord 发送命令,但它无法正常工作。然而,这是目前最小的问题,我现在可以忽略它,但我只是想指出它,因为它可能会提供一些想法。
在这一点上,我迷路了,不知道这应该如何工作,对于给定的设备,我什至能够实现这一目标吗?
令我非常困扰的是,它在一段时间内从互联网上运行得如此清楚,至少在理论上是可能的。
任何帮助将不胜感激,我很乐意根据需要分享更多信息。
为了将数据包发送到以太网网络上的 IP 地址,路由器必须知道相应的以太网地址(MAC 地址)以将数据包定向到。如果系统休眠的时间太长以至于路由器的 ARP 缓存条目过期,并且如果没有对新的 ARP 查询的响应,则路由器不会将数据包转发到任何地方。(我认为,转发到“广播”MAC 作为最后的手段在 IPv4 规范中是明确禁止的。)
因此,您很可能需要将数据包转发到可以执行此操作的其他设备(主机或路由器,但不是交换机)。您可以使用您的其他台式机,或者类似 1W“raspberry pi”类型的计算机——只要它连接到同一个子网,它就应该可以工作。
唤醒数据包不一定要直接发送到你的 MAC,它也可以广播到整个网络,只要它以某种方式到达计算机的以太网接口(“被唤醒的 MAC”嵌入在数据包的payload),但大多数路由器确实不支持指定广播 IP 地址;它们都基于相同的 Linux iptables,但不支持它。我没有测试多播地址(如“所有节点”224.0.0.1)是否有效,但我怀疑它们不会。
(具体的 UDP 端口也无关紧要。端口 9 被官方指定为“丢弃”端口,因此原则上它是最合适的,但以太网卡实际上并不关心。)
您可以尝试WoL 的唤醒模式功能(例如,如果您在 Windows 上禁用“只允许管理站唤醒这台计算机”),因为它可能允许ARP 请求本身唤醒计算机,但这可能导致系统唤醒过于频繁。(我还听说过一些 NIC 具有“ARP 卸载”功能,即使系统处于休眠状态,NIC 本身也会回复 ARP 请求,但我不记得在实践中见过这种情况。)
有问题的 ARP 表属于设备的“路由器”部分。虽然所有路由器(和主机)都有一个 ARP 表,但典型的家庭“无线路由器”很少支持添加静态条目。
一个开关根本没有用。如果路由器不知道正确的 MAC 地址,它不会询问交换机;它根本无法发送数据包。
交换机中的 ARP 映射有不同的目的——它是一个过滤器,旨在防止主机 A 错误地声明主机 B 的 IP 地址(即它不填充 ARP 缓存,恰恰相反:它阻止不需要的 ARP响应) .