[心得] 从外网远端唤醒电脑,魔法封包转送

楼主: takahashikag (那来自某岛的苏州军部长)   2022-01-21 12:44:43
之前还在念硕士的时候,因为有跑机械学习的需要,所以会连回家里用性能比较好的桌机跑
通常都是在笔电上先用 Jupyter Notebook 跑一个缩尺的雏形确定可以跑起来,或是没有犯下一些基本错误后,就扔回桌机开始用完整尺寸的数据库跑训练
远端软件是 TeamViewer,有设定可以远端开机,在无线路由器也有设定对应的埠号转送
不过常常发生刚关机三十分钟还可以远端开机,后来就睡死叫不醒的情况
后来才知道是因为 DHCP 更新后这台电脑没有连线,即使网络卡是聆听状态也会被路由器从 ARP 快取表里面被踢出去,理所当然的唤醒用的魔法封包就丢进黑洞了
●解决方案.1 用静态 ARP 绑定搭配封包转送
虽然 NETGEAR 的家用规格路由器默认是没有开放静态 ARP 绑定的,但是可以用开发模式把 Telnet 功能打开,然后直接在终端机里面下 ARP 相关的指令
不过每次都要开终端机也是有点麻烦,虽然我试验过 NETGEAR 的路由器可以跑插在随身碟里面的 Shell Script,但我不太会写 Shell,所以就拿 Python 来造轮子了
https://github.com/Suzhou65/Python-ARP-Tools
把这个脚本放在会持需连网、当作家用服务器的树莓派上面,设定需要持续维持在 ARP 快取表上面的装置,还有帐号密码,再把这个脚本写进 Cron 排程里面,之后它就会自动的检查有没有被踢掉,被踢掉就会帮你加回去
不过 NETGEAR 的家用路由器只要重新开机就会把 Telnet 关掉,这时候还要重新去开发模式把它重新打开,虽然是可以再加一个网页解析器之类的自动去开发模式帮你打开它,不过好像又更复杂了
而且 MESH 类型的无线路由器不同装置之间有独立的 ARP 快取表,所以这招也不是万用解法
●解决方案.2 直接在内网用广播的来尬广
前面讲到虽然被踢出 ARP 快取表了,但是网络卡还是在持续聆听有没有它的封包
那就直接在内网广播魔法封包就好不是?实验后还真的是这样
https://github.com/Suzhou65/Python-Wake-on-LAN
于是写出了这个专门转送魔法封包的脚本,用 ROOT 权限开始跑之后它会监听埠号 9 转进来的封包,解码确定是网络卡的 MAC 后就会对内用埠号 7 广播发送魔法封包,并且在 Log 档里面记录下在哪个时间点收到指定网络卡的唤醒事件
至于谁负责这个监听跟转送的工作?当然还是前面的树莓派
有了这个转发方案,就不用在弄静态 ARP 绑定了,只要把外网对内的埠号 9 转发给树莓派,而且目标网络卡有在聆听封包,都可以顺利唤醒
作者: vul81320 (vul81320)   2022-01-21 13:51:00
推分享
作者: cuteSquirrel (松鼠)   2022-01-21 14:31:00
赞y
作者: Woqeker (窝颗ker)   2022-01-21 15:25:00
签名档不sleep一下吗XD
作者: TakiDog (多奇狗)   2022-01-21 20:56:00
推推
作者: art1 (人,原来不是人)   2022-01-23 03:03:00
提交纪录很多内容都是空的,upload pypl needed version 才开始有纪录到修改内容的样子...

Links booklink

Contact Us: admin [ a t ] ucptt.com