[心得] 從外網遠端喚醒電腦,魔法封包轉送
之前還在念碩士的時候,因為有跑機械學習的需要,所以會連回家裡用性能比較好的桌機跑
通常都是在筆電上先用 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://www.ptt.cc/bbs/Python/M.1642740293.A.342.html
推
01/21 13:51,
3年前
, 1F
01/21 13:51, 1F
推
01/21 14:31,
3年前
, 2F
01/21 14:31, 2F
推
01/21 15:25,
3年前
, 3F
01/21 15:25, 3F
洗洗睡嗎XD
推
01/21 20:56,
3年前
, 4F
01/21 20:56, 4F
推
01/23 03:03,
3年前
, 5F
01/23 03:03, 5F
→
01/23 03:03,
3年前
, 6F
01/23 03:03, 6F
之前用 Git 的習慣很差所以堆了一堆無用檔案
結果就是不論這兩個專案,還是其他的都有點肥(Jupyter Notebook 沒清除輸出跟暫存
其中一個專案還堆到 400MB,所以我用 BFG Repo-Cleaner 炸過一次減肥
※ 編輯: takahashikag (122.116.15.4 臺灣), 01/23/2022 19:18:02
Python 近期熱門文章
PTT數位生活區 即時熱門文章