[心得] 從外網遠端喚醒電腦,魔法封包轉送

作者: 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