2019-12-07

如何讓 TeamViewer 的網路喚醒在網際網路上執行

最近因為在跑機械學習,所以常常把 JupyterLab 的程式腳本放在同步資料夾(例如 Dropbox),遠端連線回家中性能較高的電腦運算得出結果

在遠端連線上,因為外出用的電腦是 MacBook Pro,所以遠端連線軟體我就選擇 TeamViewer 了

相信我,微軟雖然有針對 macOS 跟 Linux 推出跨平台的 Microsoft Remote Desktop 讓你能夠在非 Windows NT 架構的作業系統上執行遠端連線、存取遠端的 Windows 主機,但是那個穩定度真的很糟糕

而 TeamViewer 在遠端管理上,有支援網路喚醒這個功能,用硬體的角度來看,就是所謂的「Wake-on-LAN」

Wake-on-LAN (WoL) is an Ethernet or token ring computer networking standard that allows a computer to be turned on or awakened by a network message.

The message is usually sent to the target computer by a program executed on a device connected to the same local area network, such as a smartphone. It is also possible to initiate the message from another network by using subnet directed broadcasts or a WOL gateway service. Equivalent terms include wake on WAN, remote wake-up, power on by LAN, power up by LAN, resume by LAN, resume on LAN and wake up on LAN.


其實不需要用到 TeamViewer,只要任何能送出魔術封包的程式碼、工具程式,加上支援網路喚醒的網路卡,你的電腦都可以透過網路進行基於 WoL 的遠端開機

網路喚醒通常是用在伺服器或是機房等地方,因為你不可能一台一台伺服器過去開機,但其實絕大部分的主機板,乃至於 NAS 都支援網路喚醒

主機板內建的網路晶片或是 PCIe 的網路卡通常都支援 WoL,如果是早期的 PCI 網路卡則需要接上所謂的 Physical Wake-on-LAN Connector,通常是一條三絞傳輸線的額外連接線,在關機時也能提供 PCI 網路卡待機電源跟送出喚醒訊號給主機板

而近代的主機板,只要在內建的網路卡中看到類似「 WOL by PME, PXE」的說明,並且在主機板的 BIOS/UEFI 中開啟對應的選項,這時你的主機就已經在硬體上完成遠端開機的準備

在作業系統中,則要在網路卡的硬體選項中,勾選「允許這個裝置喚醒電腦」跟「Wake on Magic Package」這個選項,並在 TeamViewer 的設定選項中,允許遠端喚醒,並輸入電腦的網址跟埠號,這時你的主機就已經在軟體上完成遠端開機的準備

一切就緒了嗎?我可以出門在外喚醒我家的電腦了嗎?

不,災難才剛開始而已



為了完善這個網路開機,前前後後折騰了快一個禮拜

在區域網路(LAN)中網路喚醒可以運作的十分正常,畢竟它就叫做 Wake-on-LAN (WoL) 啊!

只要網路卡還有供電(關機時 RJ45 接頭的燈號繼續閃爍,說明網路卡還是有持續在監聽網路上的封包),以及發出指令的路由器或電腦在同一個區域網路上,通常都能夠順利開機

但當你要從遠端開機,例如出門在外時,常常發生剛關機時可以成功喚醒,過了大概幾個小時就失敗的情況

這牽涉到一個專有名詞

ARP Binding

許多路由器會內建靜態 DHCP(Static DHCP),也就是當你的電腦連上這個路由器所管理的區域網路時,它會自動分配到一個固定的內部網路位址(即俗稱的 IP )上,這在管理設備上是很方便的,因為你不需要給每次開機都要猜你要連線的設備分配到哪一個內部網路上

而在從區網以外下達的網路喚醒,也就是「Wake-on-WAN」時,你不只需要將那台電腦設定一個基於靜態 DHCP 發放的內部網路位址,你也要設定傳輸埠轉送( Port Forwarding ),將用於傳送網路喚醒訊號的埠號 9 指定給那一台電腦,這樣外網進來的喚醒訊號『理論上』才會轉送到內網那台指定電腦

至於為何說『理論上』,是因為即使是靜態 DHCP,當你太久沒有連線時(這裡指關機),ARP 會將你從快取表上剔除,這時外面進來的喚醒訊號雖然知道要透過路由器轉送到指定的內部網路位址,但這時的網路卡是處在待機等待喚醒的情況,只會監聽有沒有指定它、或包含它的喚醒訊號,是沒有在連線清單上的,並沒有透過靜態 DHCP 拿到內部網路位址,ARP 快取表上也沒有它

於是含有喚醒訊號的封包就迷路了

所謂的 ARP 就是位址解析協定( Address Resolution Protocol ),用於在將網路位址跟網路卡的 MAC 位址進行定位(綁定)

由於效能上的要求,ARP 會將太久沒有上線的網路卡從快取表上剔除,這可以加速快取表的存取,但對於我們需要喚醒,但因為睡太久已經失去靜態 DHCP 分配的內部網路位址、又從 ARP 快取表上消失的指定電腦而言,問題就來了

而這也是為何我們需要進行 ARP 綁定(ARP Binding),就是將特定網卡與特定的網路位址進行定位(綁定),這樣即使那張網卡沒有分配到網路位址,路由器也知道這個喚醒訊號是給哪一張網路卡的

然而 ARP 綁定或類似的靜態 ARP(Static ARP Table )並不是每一台消費級的路由器會支援的功能,以華碩(ASUS)來說,當年的 RT-N10 擁有 ARP 綁定的功能,但之後某些冠以 AC 系列名稱開頭的機型似乎就沒有這個功能,而在美國網件(NETGEAR)來說,R7000 或是這個等級以上的機器『理論上』具有 ARP 綁定的功能,或是說網件的產品某種程度上都可以用除錯功能去設定靜態 ARP



只要在路由器的管理網址後面加入 debug.htm,就可以進入開發用介面

將 Enable Telnet 勾選後,就可以從 Telnet 中下指定進行特定網卡的 ARP 綁定

用完記得去把 Enable Telnet 關掉

只要在 ARP 快取表中看到類似上面的內容,就是進行靜態 ARP 設定的網路卡跟對應的網路位址,即使網路卡是處於待機監聽的況狀,網路喚醒的封包也可以準確送到它那裡

然而,因為這個功能在各家路由器與其內建韌體的闡述跟運作都不同,因此也會有不同的情況發生

有些是支援 ARP 綁定(ARP Binding),這時那些有在 ARP 快取表上的裝置可以取得指定內部網路位址,即使下線,而其他外來裝置,即使不在 ARP 快取表上,也可以透過 ARP 請求登記在 ARP 快取表上,進而分配到內部網路位址而連上網路

而有些是只支援靜態 ARP,只有登記在 ARP 快取表上的裝置可以取得指定內部網路位址,其他外來裝置發起的 ARP 請求通常會被丟棄,也就是無法連線

而 NETGEAR 的產品只要是沒有支援 ARP 綁定的機型,在重新開機或是更新過 DHCP 設定表之類的操作後,ARP 快取表就會自動重新整理,之前下達的靜態 ARP 設定也會跑掉

而當原廠韌體無法解決你的需求時,最簡單的答案,就是刷機

由於 NETGEAR R6400V2 有版本差異,在 Telnet 中查詢版本最保險的

我的是常規的 U12H332T20_NETGEAR



其實 DD-WRT 在 Administration 這個分頁內就有支援透過路由器進行網路喚醒

不過我們要的是網路遠端喚醒,所以先到 NAT/QoS 那邊進行傳輸埠轉送( Port Forwarding )設定

其實 DD-WRT 在 WebUI 中預設是沒有提供 ARP 綁定的,但它可以用下指令的方式下達,而且在 Administration 這個分頁下的細選項就有 Commands 讓你可以執行 Telnet/SSH 等終端機環境下的指令

此外,你也可以將指令存成開機執行,這樣每次開機時就會自動執行,我就將靜態 ARP 設定指令放在開機執行



在 Commands 中執行 arp 就可以看到 DD-WRT 的 ARP 快取表

而關於 TeamViewer 在遠端喚醒的技術說明,可以參考官方的技術文件

而 DD-WRT 在官方的技術維基百科也有專頁講述網路喚醒的設定跟原理,也講述了其實你可以透過 Telnet/SSH 從外網連上路由器的終端機介面,然後直接下達網路喚醒的指令

其實 TeamViewer 也在官方文件中說了,『透過同一區域網路上一台已經開機並綁定你帳號的電腦,可以喚醒另一台在同一區域網路上已關機電腦』,但這個大前提是你有一台已經開機而且登入 TeamViewer 的電腦在線上,很顯然的這個情境不適用於大部分情況,所以我建議大家還是乖乖設定靜態 ARP 跟傳輸埠轉送

此外,或許有人會好奇為什麼 PlayStation 4 可以達成遠端網路喚醒,即使它沒有設定過靜態 ARP 之類的設定,那是因為 PlayStation 4 在待機的情況下網路卡其實沒有關機而是有持續在連線,以確保網路卡的 TCP/UDP 連線不會過期,而不會被當作斷線而從 ARP 快取表剔除

沒有留言:

張貼留言