作者takahashikag (抽卡当然是为了性癖而抽)
看板Python
标题[心得] 从外网远端唤醒电脑,魔法封包转送
时间Fri Jan 21 12:44:43 2022
之前还在念硕士的时候,因为有跑机械学习的需要,所以会连回家里用性能比较好的桌机跑
通常都是在笔电上先用 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 转发给树莓派,而且目标网路卡有在聆听封包,都可以顺利唤醒
--
while True:
if girlfriend is None:
continue
else:
break
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.124.231.115 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1642740293.A.342.html
1F:推 vul81320: 推分享 01/21 13:51
2F:推 cuteSquirrel: 赞y 01/21 14:31
3F:推 Woqeker: 签名档不sleep一下吗XD 01/21 15:25
洗洗睡吗XD
4F:推 TakiDog: 推推 01/21 20:56
5F:推 art1: 提交纪录很多内容都是空的,upload pypl needed version 才 01/23 03:03
6F:→ art1: 开始有纪录到修改内容的样子... 01/23 03:03
之前用 Git 的习惯很差所以堆了一堆无用档案
结果就是不论这两个专案,还是其他的都有点肥(Jupyter Notebook 没清除输出跟暂存
其中一个专案还堆到 400MB,所以我用 BFG Repo-Cleaner 炸过一次减肥
※ 编辑: takahashikag (122.116.15.4 台湾), 01/23/2022 19:18:02