为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题写在前面:我非专业人士,对编程、计算机理论仅有皮毛认识,没有系统的学习,经常知其然不知其所以然,所以我说的话可能一些在大佬看来很睿智,请见谅。
一、遇到的问题最近我在*家庭组网,更换了主路由,遇到了个烦心的问题——我平时为了能在外网串流我的PC中的游戏(用的Moonlight),需要用到WoL功能,解决办法是在路由器中使用 ARP 绑定功能,将 IP 与 网卡的 MAC 地址进行绑定(UP 这里使用的是 Pandava,ARP 绑定功能在“内网 LAN -> DHCP 服务器 -> 静态 IP 设置”中):
在路由器的端口转发中也要设置好相应的规则:
解决了 ARP 的问题后,那么在这一章,UP 要补充的是关于外网唤醒的一些信息补充。
(一)唤醒魔包(Magic psacket)与端口转发需要了解的是,唤醒魔包是通过 OSI 网络模型中的“数据链路层”(二层)传播的,因此无关 IP、无关传输协议(TCP、UDP),网卡只要识别到特定广播帧就可以唤醒电脑。
但是由于路由器是工作在网络层(第三层),想要通过外网唤醒电脑,那么就要在路由器的端口转发中,向外网暴露相应的端口来接收唤醒魔包,并指定所要唤醒电脑的 IP 地址。
以 Up 来说,通过暴露到外网的 19999 端口来接收唤醒数据包,并转发到对应的 IP 地址:
在这个场景下,不需要强调传输协议和内网端口。我们前面讲过,唤醒魔包工作在第二层,无关 IP、无关传输协议,因此只要告诉路由器要转发到的 IP 地址,那么在 ARP 绑定的作用下,路由器就知道 IP 地址背后网卡的 MAC 地址,因此网卡就能够接收到数据包并唤醒电脑。因此,不管上面我们用什么端口号(在不影响其他端口的情况下)或者协议( TCP 或者 UDP ),都不影响我们唤醒电脑。
但是,如果你在开机的情况下,想要在 Windows 中(或其他系统)测试外网唤醒,那么这种时候你就需要在路由器的端口转发规则中指定对应的端口号和协议,以便让路由器把数据包转发到 Windows 系统上。那么在这种情形下,网络唤醒则采用 UDP 协议传输。
(二)外网唤醒的最佳实践:通过内网唤醒我们前面知道,如果要实现外网唤醒,需要通过 ARP 绑定来让路由器知道网卡的 MAC 地址,这种情况就需要把 IP 地址固定下来。但如果说你不知道电脑的 IP 地址,只知道网卡的 MAC 地址,那么这种时就没办法来使用 ARP 绑定。
在这种情况下,我们就可以利用内网的相关特性来实现网络唤醒。
首先我们要理解,“唤醒魔包(Magic Packet)”是一种广播帧,而路由器是无法转发广播帧的,这也就是为什么我们需要使用路由器的 ARP 绑定功能,来让路由器把外网传过来的唤醒魔包精确地转发到对应电脑的网卡上。
但是在内网下,则可以在子网内广播唤醒魔包,让内网下所有电脑的网卡都接收到数据包,当对应的网卡发现唤醒魔包内的 MAC 地址与自己 MAC 地址对应上时就会唤醒电脑,而发起唤醒数据包的一方就不需要知道想要唤醒的那一台电脑的 IP 地址。
举个例子,Up 的 NAS 虚拟机上安装了一个 Debian 系统,通过“wakeonlan”命令即可以广播唤醒魔包: