为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

2021-06-29 20:47:20 23点赞 96收藏 25评论

写在前面:我非专业人士,对编程、计算机理论仅有皮毛认识,没有系统的学习,经常知其然不知其所以然,所以我说的话可能一些在大佬看来很睿智,请见谅。

一、遇到的问题

最近我在重组家庭组网,更换了主路由,遇到了个烦心的问题——我平时为了能在外网串流我的PC中的游戏(用的Moonlight),需要用到WoL功能远程唤醒家里的PC,而且是在广域网(外网)使用WoL。这就需要路由器支持ARP绑定(PC的WoL相关的设置和路由器端口映射也得做好)。而我的刷了OpenWrt的软路由,它的ARP绑定却不好使。明明系统设置是有这个设置,但是就是不生效,具体表现为——

OpenWrt的“IP/MAC绑定”中已设置了绑定,但用ip neigh命令查看arp表的时候,发现条目状态为REACHABLE而并非PERMANENT,该主机关闭后,本条arp信息即失效,未形成永久绑定关系。

这会导致通过端口映射发送来的远程唤醒包无法抵达IP/MAC绑定的主机,主机无法通过外网端口映射唤醒。

具体见下图(上面这段话和下面这图都是我引用后文提到的Fyred大佬的):

为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

正常来说外网一点这里就开机了正常来说外网一点这里就开机了

二、着手解决

百度查阅很久后并没有找到特别好的办法,甚至相关的讨论都没几个,但是还是找到了一些说法。

总结一下就是要手动敲代码来绑定,但貌似是因为OpenWrt的arp命令不完整,使用arp -a、arp -s 和arp -d等等的arp命令全是只能浏览不能修改arp信息,所以要用以下代码(IP和MAC请替换成自己的):

ip neigh add "IP" lladdr "MAC" nud permanent dev br-lan

这条命令中的nud permanent代表把IP和MAC地址永久绑定的,除非你手动删除这个条目, 或者系统重启。

使用这代码后,再输入以下代码:

ip neigh show

相关的条目应该就显示 PERMANENT了。

再输入以下代码确认:

cat /proc/net/arp

显示 Flags 为 6即表示成功绑定了。

以为这就万事大吉了吗?并不是为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题 当我输入以上代码的时候,会显示File exist错误,这表示arp表里已经有对应的ip/MAC的动态绑定条目了!这是一个莫名其妙的情况,它的绑定状态明明是默认的REACHABLE,咋就被谁绑定了?

搞不懂,但既然如此,我们不能用ip neigh add代码了(add表示增加绑定关系),改为用:

ip neigh chg "IP" lladdr "MAC" nud permanent dev br-lan

chg也可以改成change、replace。代表把IP/MAC的绑定关系改为“PERMANENT”。这样的话应该就成功了.....吧?为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

然而现实再一次击打我这个菜鸟为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题 明明已经绑定为PERMANENT的IP,过了一会之后再查询居然变成了REACHABLE!?为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题 时间不确定多久,但是REACHABLE条目是动态绑定的,关机后REACHABLE必然会老化成FAILED,然后从路由表上消失,广域网WoL也当然失效。

这实在已经超出我这菜鸟的水平范围之外了,只能寄托于百度。没想到最后真的搜到github上有人提出了一条Issue,题主Fyred看来比较懂行的,他描述遇到的问题就是跟我的一模一样,但是他表达得很清晰、很到位,还表达了自己的一些猜想,大家可以去看看

这条issue虽然最后大家也没讨论出个合理的解决办法,但是我很感谢他,它让我看清楚了并不是我的设置有问题,而看来是OpenWrt本身的问题,有可能是部分内核版本才会有问题(我是4.19)。他提到了OpenWrt的IP/MAC绑定功能是通过arpbind启动脚本来实现的,而这脚本的代码是写的"ip neigh add",在这个莫名的环境下绑定失败了;然后他还提出了一个重要的猜想——“路由器启动后还有什么程序在改动ARP表”,据我观察正是这个程序一直在运作,这也导致用add命令的时候提示“File exist”,也导致明明绑定成PERMANENT了还会被变回REACHABLE。

搞清楚了不是我的问题,但是这让我更蛋疼,因为我折腾家庭组网已经弄吐了(这是另外一个故事了),不想再尝试换OpenWrt内核,不换内核的话我又不懂代码,无从入手。

三、最终解决方案

最后是一位很耐心教学的大佬点拨了我一个治标不治本但是很实际有效的办法——既然是是因为IP/MAC条目被未知的程序持续改写成REACHABLE进而导致关机后在路由表中只能维持一段时间,那么我弄个一直执行的脚本,持续地主动改写这条目为PERMANENT不就可以了吗?为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

OpenWrt中正好有“计划任务”这个功能,可以免去手动敲crontab命令。在里面新增一行代码:

*/5 * * * * ip neigh chg "IP" lladdr "MAC" nud permanent dev br-lan

为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

前面的“5”代表每5分钟就执行一次,这个时间可以自己观察多久路由表被改写然后自定义。

但是以上代码只能在PC已经启动(即路由表中有PC的IP)的时候才可以生效,不然就会显示No such file or directory——没有IP当然改不了。那么可以把代码增加一部分:

*/5 * * * * ip neigh add "IP" lladdr "MAC" nud permanent dev br-lan || ip neigh chg "IP" lladdr "MAC" nud permanent dev br-lan

计划任务会先执行前半段代码,在关机、路由表中没有记录的时候用add命令就能新增PERMANENT的记录。如果已经有了记录,那前一段代码执行会失败,则自动执行后一段chg代码。这样不就万无一失了嘛

四、最终成果

最后实践,即使关机很久,路由表中依然有PC的IP和MAC条目,广域网WoL也终于正常了!

为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

感谢我在百度上看到的一切朋友的宝贵经验,感谢给我最终解决方案的大佬。我想着也许还有人跟我一样的需求、跟我一样碰壁,特意整理了这篇经验帖,希望能帮助到你们。大神们觉得有更好更容易的办法也请不要嘲讽我....

我这文章除了希望帮到其他人之外,也是抛砖引玉,如果有大神了解真正的问题症结所在,希望不吝赐教!为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题

展开 收起

Xiaomi 小米 BE6500 Pro 双频6500M 家用千兆Mesh无线路由器 Wi-Fi 7

Xiaomi 小米 BE6500 Pro 双频6500M 家用千兆Mesh无线路由器 Wi-Fi 7

549元起

ASUS 华硕 RT-BE88U 双频7200M 家用Mesh无线路由器 Wi-Fi 7 黑色 单个装

ASUS 华硕 RT-BE88U 双频7200M 家用Mesh无线路由器 Wi-Fi 7 黑色 单个装

1849元起

ZTE 中兴 AX3000 巡天版 双频3000M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 白色

ZTE 中兴 AX3000 巡天版 双频3000M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 白色

149元起

ASUS 华硕 TUF小旋风Pro BE6500 家用无线千兆路由器 WiFi7

ASUS 华硕 TUF小旋风Pro BE6500 家用无线千兆路由器 WiFi7

779元起

ASUS 华硕 TUF GAMING 小旋风 BE3600 双频3600M 家用千兆Mesh路由器 Wi-Fi 7 黑色 单个装

ASUS 华硕 TUF GAMING 小旋风 BE3600 双频3600M 家用千兆Mesh路由器 Wi-Fi 7 黑色 单个装

449元起

京东云 BE6500 千兆无线路由器 WiFi7

京东云 BE6500 千兆无线路由器 WiFi7

499元起

ZTE 中兴 巡天 BE5100 千兆双频无线家用路由器 WiFi7

ZTE 中兴 巡天 BE5100 千兆双频无线家用路由器 WiFi7

199元起

ZTE 中兴 问天BE7200Pro+ 双频7200M 家用千兆Mesh无线路由器 WiFi 7 黑色

ZTE 中兴 问天BE7200Pro+ 双频7200M 家用千兆Mesh无线路由器 WiFi 7 黑色

548.5元起

ASUS 华硕 RT-BE86U 双频6800M 家用万兆Mesh路由器 Wi-Fi 7 黑色 单个装

ASUS 华硕 RT-BE86U 双频6800M 家用万兆Mesh路由器 Wi-Fi 7 黑色 单个装

1749元起

Xiaomi 小米 AX3000T 双频3000M 家用千兆Mesh路由器 Wi-Fi 6 白色 单个装

Xiaomi 小米 AX3000T 双频3000M 家用千兆Mesh路由器 Wi-Fi 6 白色 单个装

138元起

Xiaomi 小米 BE3600 2.5G版 3600M 双频千兆家用无线路由器 Wi-Fi 7 白色

Xiaomi 小米 BE3600 2.5G版 3600M 双频千兆家用无线路由器 Wi-Fi 7 白色

189元起

ASUS 华硕 ROG 八爪鱼7 三频13000M 家用万兆Mesh无线路由器 Wi-Fi 6 黑色 单个装

ASUS 华硕 ROG 八爪鱼7 三频13000M 家用万兆Mesh无线路由器 Wi-Fi 6 黑色 单个装

4999元起

Xiaomi 小米 RN02 BE6500 家用千兆无线路由器 Wi-Fi 7 黑色 单个装

Xiaomi 小米 RN02 BE6500 家用千兆无线路由器 Wi-Fi 7 黑色 单个装

449元起

锐捷天蝎BE68ultra 千兆路由器wifi7 电竞路由 无线 穿墙王 6800M 8颗FEM+4个2.5G口 支持iPhone16Pro

锐捷天蝎BE68ultra 千兆路由器wifi7 电竞路由 无线 穿墙王 6800M 8颗FEM+4个2.5G口 支持iPhone16Pro

暂无报价

HUAWEI 华为 BE3 Pro 双频3600M 千兆家用路由器 Wi-Fi 7 黑色

HUAWEI 华为 BE3 Pro 双频3600M 千兆家用路由器 Wi-Fi 7 黑色

216.35元起

京东云 雅典娜 三频6600M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 黑色

京东云 雅典娜 三频6600M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 黑色

519元起
25评论

  • 精彩
  • 最新
  • 现在有软件可以解决这个问题了,ImmortalWrt固件的仓库里这个软件luci-i18n-arpbind-zh-cn,挺好用的

    校验提示文案

    提交
  • 我的问题是,ARP绑定就需要所有设备都绑,家里那么多设备没法弄……梅林的

    校验提示文案

    提交
    你有这么多设备要远程唤醒吗?我这就为了唤醒我的台式机,就家里一台

    校验提示文案

    提交
    不是这个意思,是梅林要么不绑定,要绑就要所有设备都绑

    校验提示文案

    提交
    还有4条回复
    收起所有回复
  • 这个手机唤醒的app叫什么名字?

    校验提示文案

    提交
    是moonlight,N卡串流的软件

    校验提示文案

    提交
    收起所有回复
  • 在计划任务里加了那串代码,但是关机稍微久一点就还是不能唤醒了...

    校验提示文案

    提交
    那你不能唤醒的时候,路由表上是没了它的条目吗?

    校验提示文案

    提交
    感谢回复!这个确实没有关注到。。我再确认下路由表

    校验提示文案

    提交
    收起所有回复
  • 不好用,每次这个计划任务执行的时候就会断网,不知道为啥

    校验提示文案

    提交
    我这边倒是不会断网。反正归根结底还是这些openwrt包本身的问题吧。

    校验提示文案

    提交
    收起所有回复
  • 必须跟楼主@永恒星空 握个手,我跟你遇到的问题一模一样,而且查证步骤也是一模一样,最后解决方案也是一模一样。 [高兴]
    给楼主推荐我的写法,用replace:
    * * * * * ip neigh replace 10.10.10.200 lladdr BB:BB:BB:BB:BB:BB nud permanent dev br-lan

    校验提示文案

    提交
    5.15内核也有这个问题 看来定时任务是唯一解了

    校验提示文案

    提交
    ImmortalWrt固件有软件解决arp绑定的问题了,软件名luci-i18n-arpbind-zh-cn

    校验提示文案

    提交
    收起所有回复
  • 实在是感谢,原来正确的答案在这里,一直无法解决好moonlinght远程串流中的远程唤醒问题,明明已在软路由中已经设置了arp绑定,还是在外网只能成功唤醒一次,一旦关机就无法唤醒了,找了很久才终于找到原因并解决了,太感谢了。

    校验提示文案

    提交
  • 我的也不能唤醒 还以为是主板的问题

    校验提示文案

    提交
  • 这个远程唤醒的app叫什么名字?

    校验提示文案

    提交
  • 我的解决办法是通过home assistant.....

    校验提示文案

    提交
  • 其实openwrt会自动分配内网域名,你访问DESKTOP-DSQ7N8E.lan就行了

    校验提示文案

    提交
  • 感谢楼主~~~解决我的问题。

    校验提示文案

    提交
  • 需要外网IPv6 WOL怎么办?

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
96
扫一下,分享更方便,购买更轻松