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