很多人和我一樣有很多臺(tái)電腦,公司一個(gè),家里一個(gè),還有筆記本一臺(tái)。你可能也有過(guò)這樣的經(jīng)歷:在公司想訪問(wèn)家里的電腦里的文件,卻想起了家里電腦沒(méi)有開(kāi)機(jī);冬天在暖和的被窩里打開(kāi)筆記本看片,卻想起片源還在關(guān)掉的臺(tái)式機(jī)里面,在痛苦的思考了半晌后決定放棄。如果能遠(yuǎn)程開(kāi)機(jī)就好了!也許你想問(wèn)為什么不一直開(kāi)著機(jī)器呢?如果你能忍受環(huán)保主義者的口水和拿著電費(fèi)賬單老婆的怒火,那我不得不承認(rèn)你是個(gè)堅(jiān)強(qiáng)的人。
其實(shí)遠(yuǎn)程開(kāi)機(jī)已經(jīng)存在很多年了。從Intel和IBM在1997年公布標(biāo)準(zhǔn)以來(lái),現(xiàn)在幾乎所有的主板都支持網(wǎng)絡(luò)開(kāi)機(jī)。經(jīng)過(guò)合適的設(shè)置,我們可以在局域網(wǎng)或者廣域網(wǎng)上開(kāi)啟另一臺(tái)電腦,甚至用手機(jī)開(kāi)啟電腦!但這條路上充滿荊棘,我們一起來(lái)看看它的原理和都有哪些陷阱。
網(wǎng)絡(luò)開(kāi)機(jī)叫做Wake-on-LAN,縮寫是WoL。過(guò)程很簡(jiǎn)單,即通過(guò)發(fā)送一組特殊格式的網(wǎng)絡(luò)封包(Magic Packet)給某個(gè)MAC地址的電腦,讓該電腦從睡眠模式甚至是關(guān)機(jī)模式蘇醒,即從ACPI的Sx(S3,S4,S5)模式返回S0運(yùn)行模式。Sx的定義見(jiàn)(一起學(xué)習(xí)電腦如何睡眠S3)
1. 固件
固件需要保證網(wǎng)絡(luò)設(shè)備和網(wǎng)口(Phy)的電源在Sx的情況下保持供電,以用來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)中的Magic Packet。這通常都是通過(guò)寫一組主板芯片組的寄存器來(lái)實(shí)現(xiàn)的。
2. Magic Packet
這組特殊封包看起來(lái)是這樣:
它通常被發(fā)送的該機(jī)器的UDP端口7和9。如果網(wǎng)卡在Sx的狀態(tài)收到了這組封包,它就知道有人要開(kāi)機(jī),它會(huì)通過(guò)PME#或者其他方式喚醒電腦。
原理看起來(lái)相當(dāng)簡(jiǎn)單,但具體操作起來(lái)卻充滿陷阱。
1. 硬件
如果你是在十年內(nèi)買的電腦或者主板,而且使用板載網(wǎng)卡連接網(wǎng)絡(luò),那么恭喜你,你的硬件已經(jīng)合格!相信沒(méi)有人還在用十年前的電腦,但確實(shí)有些人在用PCI/PCIe擴(kuò)展的網(wǎng)卡,這些網(wǎng)卡要支持WoL,有個(gè)三個(gè)針腳的連線需要連接主板,如下圖:
需要連接主板的:
2. 固件設(shè)置
市面上幾乎所有UEFI固件都支持WoL,但坑爹的是幾乎所有的WoL缺省都是關(guān)閉的,而且如何打開(kāi)千差萬(wàn)別!下面有幾個(gè)例子:
竅門就是尋找Wake up、NIC、PME、PCI等等。
3. 操作系統(tǒng)
我們同樣需要在操作系統(tǒng)里面開(kāi)啟WoL。打開(kāi)設(shè)備管理器,找到你的網(wǎng)卡,右鍵點(diǎn)擊并選擇屬性:
在電源管理里面有關(guān)于它的設(shè)置:
這是第二個(gè)坑。不同網(wǎng)卡的設(shè)置位置和說(shuō)明完全不同,有些網(wǎng)卡還需要在高級(jí)設(shè)置里面打開(kāi)Wake on Magic Packet:
而有些不用,如我這個(gè)Intel網(wǎng)卡就不需要。
4. WoL軟件
喚醒軟件有不少,大部分都是免費(fèi)的,這里推薦兩個(gè):
Depicus:有圖形接口和命令行接口的軟件,下載地址(http://www.depicus.com/wake-on-lan/welcome.aspx)。
Wake On Lan:豐富的圖像接口。
下載地址(https://sourceforge.net/projects/aquilawol/)
大家也可以在app store或者google market上搜到很多WoL的應(yīng)用。
5. 廣域網(wǎng)設(shè)置
如果你的目標(biāo)電腦躲在家里的路由器后面,那么這又是一個(gè)大坑。基本來(lái)說(shuō)有兩個(gè)步驟;
A . 你需要知道你家的IP地址。而大家知道ADSL每次撥號(hào)后IP都會(huì)重新分配,這就需要一個(gè)中介將一個(gè)名字轉(zhuǎn)換成你的動(dòng)態(tài)IP。大家可以搜索花生殼等工具,而現(xiàn)在有很多只能路由器是支持花生殼的。轉(zhuǎn)換成功以后你就可以只要用名字來(lái)訪問(wèn)了。
B. 你需要設(shè)置路由器的端口地址轉(zhuǎn)發(fā)DMZ。這樣你訪問(wèn)路由器的廣域網(wǎng)IP才會(huì)給你轉(zhuǎn)發(fā)成內(nèi)網(wǎng)IP。每個(gè)路由器設(shè)置界面千差萬(wàn)別。請(qǐng)大家根據(jù)自己的路由器型號(hào)自行Google.
6. 其他
你終于可以遠(yuǎn)程開(kāi)機(jī)了,但開(kāi)機(jī)后又能干什么呢?最好和遠(yuǎn)程桌面一起使用。這里推薦Teamviewer。
電腦上各種“遠(yuǎn)程桌面控制”軟件大家應(yīng)該都不陌生了,偶爾可能都會(huì)用一用。但是,它們都有一個(gè)共同的“缺陷”,就是不能遠(yuǎn)程開(kāi)機(jī)!將其和WoL結(jié)合起來(lái)終于形成了完整的閉環(huán)。但其中WoL不太廣為人知的原因可能和設(shè)置中有太多環(huán)節(jié)和太多陷阱有關(guān),也許市場(chǎng)期待某個(gè)“一鍵開(kāi)啟WoL”類軟件的出現(xiàn)(市面上有個(gè)“向日葵開(kāi)機(jī)棒”小設(shè)備,不過(guò)不太好用)。
故事背景
這是一個(gè)很復(fù)雜而且很久遠(yuǎn)的故事,如果要講的話,這個(gè)故事可以追溯到1981年(「都是廢話,沒(méi)有干貨,如果不感興趣請(qǐng)從第二章開(kāi)始」),簡(jiǎn)單來(lái)說(shuō):
故事背景就是這樣的,簡(jiǎn)單來(lái)說(shuō),因?yàn)槲易约旱碾娔X上環(huán)境比較完善,而且由于公司網(wǎng)絡(luò)各種限制,導(dǎo)致包括github在內(nèi)的很多網(wǎng)站訪問(wèn)不穩(wěn)定,所以有了遠(yuǎn)程控制的需求。但是如果家里電腦一直開(kāi)機(jī)的話,作為一個(gè)N年前的伊拉克戰(zhàn)損版thinkpad,我倒不擔(dān)心耗電問(wèn)題,我擔(dān)心的是長(zhǎng)期開(kāi)機(jī)它會(huì)不會(huì)著火。。。
所以,我的需求和幾種方案大概就匯總?cè)缦拢?/p>
其實(shí)很簡(jiǎn)單,拓?fù)鋱D如下:
frp拓?fù)?/p>
配置的話大概分這么幾個(gè)部分:
WoL原理很簡(jiǎn)單,就是在PC關(guān)機(jī)或者睡眠之后讓網(wǎng)卡和主板的部分功能繼續(xù)工作。在網(wǎng)卡接收到特定的數(shù)據(jù)包(Magic Packet)的時(shí)候,激活PC。
這個(gè)特定的數(shù)據(jù)包叫做魔術(shù)包(Magic Packet),可以是廣播幀。
封裝在以太網(wǎng)中
也可以封裝在UDP報(bào)文中(或者IPX數(shù)據(jù)包中,然而IPX早就涼了),通過(guò)UDP端口7或者端口9進(jìn)行發(fā)送。
封裝在UDP中
WoL的消息格式也很簡(jiǎn)單,先是6個(gè)字節(jié)的全1(連續(xù)6個(gè)FF),然后是被喚醒主機(jī)的MAC地址,最后可以帶上4字節(jié)或者6字節(jié)的密碼。
消息格式
WoL需要主板和操作系統(tǒng)支持該功能才可以。
這里僅以windows為例,查閱了微軟的文檔,win10為了提高系統(tǒng)啟動(dòng)速度,默認(rèn)情況下開(kāi)啟了所謂的快速啟動(dòng)。win10的快速啟動(dòng)是介于關(guān)機(jī)(S5或者G3)和休眠(S4)的一種折中方案。 休眠的時(shí)候,內(nèi)存的所有數(shù)據(jù)都會(huì)被寫到硬盤的文件里,再次啟動(dòng)時(shí),僅需要加載該文件即可,啟動(dòng)速度快,但是占用磁盤空間較大。 win10的快速啟動(dòng),在關(guān)機(jī)的時(shí)候,所有的用戶進(jìn)程都會(huì)被結(jié)束,但是系統(tǒng)的內(nèi)核和一部分驅(qū)動(dòng)會(huì)保留下來(lái)并寫入到磁盤,再次啟動(dòng)的時(shí)候會(huì)先加載休眠文件,之后再啟動(dòng)用戶進(jìn)程。給用戶的直接感受就是系統(tǒng)啟動(dòng)速度變快了。
但是根據(jù)微軟的官方文檔描述,對(duì)于關(guān)機(jī)狀態(tài)(S5)和快速啟動(dòng)狀態(tài)下的喚醒,windows未能提供官方支持。不過(guò)幸運(yùn)的是,現(xiàn)在的主板一般都支持了這個(gè)功能。
?
WOL is supported from sleep (S3) or hibernate (S4). It is not supported from fast startup or soft off (S5) shutdown states. NICs are not armed for wake in these states because users do not expect their systems to wake up on their own.
?
WoL的配置很簡(jiǎn)單,大概分三步:
「BIOS配置」
在BIOS中找一下相關(guān)的配置,有可能叫WoL,有可能叫wake via PCIE/PCI之類的名字,反正大同小異。 找到類似的選項(xiàng),打開(kāi)它。
BIOS配置
「windows配置」
win+x-->設(shè)備管理器-->網(wǎng)絡(luò)適配器-->有線網(wǎng)卡-->右鍵屬性
有線網(wǎng)卡
在網(wǎng)卡的高級(jí)選項(xiàng)卡下,找到魔術(shù)包喚醒,并啟用.如果這里看不到的話,請(qǐng)更新網(wǎng)卡驅(qū)動(dòng).
網(wǎng)卡配置
之后在電源管理中,勾選允許此設(shè)備喚醒計(jì)算機(jī)
網(wǎng)卡電源管理
至此,WoL配置完成.
配置完成后,最明顯的現(xiàn)象是,在關(guān)機(jī)狀態(tài)下可以看到,計(jì)算機(jī)的網(wǎng)卡工作指示燈依舊是亮著的. 說(shuō)明網(wǎng)卡在監(jiān)聽(tīng)相關(guān)魔術(shù)包.
「樹(shù)莓派配置」
喚醒設(shè)備可以選擇支持網(wǎng)絡(luò)喚醒的路由器,樹(shù)莓派,以及另外一臺(tái)終端等. 目前openwrt上有類似的插件可以使用. 但是我那臺(tái)垃圾堆里淘換來(lái)的斐訊K3上刷的openwrt有點(diǎn)問(wèn)題,網(wǎng)絡(luò)喚醒的插件并不好使. 所以,我選擇使用樹(shù)莓派.
我的樹(shù)莓派上跑的是centos,配置也很簡(jiǎn)單. 用于喚醒的工具ether-wake集成在了ethtool中. 所以:
yum -y install ethtool
安裝完之后,可以直接使用ether-wake -i eth0 11:22:33:44:55進(jìn)行喚醒.
其中eth0 是樹(shù)莓派的有線網(wǎng)卡, 后面的mac地址是被喚醒主機(jī)的mac地址
配置完成后可以測(cè)試一下,wireshark可以正常抓到魔術(shù)包.
發(fā)送成功
至此,局域網(wǎng)內(nèi)的配置完成.
到上面為止,我已經(jīng)可以在內(nèi)網(wǎng)順利的喚醒我的筆記本. 下面要解決的是內(nèi)網(wǎng)穿透問(wèn)題. 也就是怎么在公網(wǎng)上訪問(wèn)樹(shù)莓派.
關(guān)于內(nèi)網(wǎng)穿透有很多的解決辦法,這里列出幾個(gè):
這里選擇frp,關(guān)于原理和配置這里不再贅述,詳情請(qǐng)查看frp的github主頁(yè)
使用相對(duì)還是比較簡(jiǎn)單的,如果沒(méi)有自己的VPS,可以使用這個(gè)公益性質(zhì)的frp代理服務(wù):外網(wǎng)門
外網(wǎng)門目前國(guó)內(nèi)的服務(wù)器基本都停掉了,海外的幾個(gè)機(jī)房勉強(qiáng)可用. 使用時(shí),請(qǐng)先做安全性評(píng)估.
到這里為止,已經(jīng)可以在外網(wǎng)正常的喚醒我的筆記本了.
但是!!!
操作起來(lái)相對(duì)還是有點(diǎn)復(fù)雜的,要喚醒我的筆記本,首先需要登錄到樹(shù)莓派,然后再敲喚醒的命令,而且mac地址那么長(zhǎng),誰(shuí)記得住....
作為一個(gè)懶癌晚期患者,一直遵循著自然界動(dòng)物的所有行為偏向于能量消耗最低的方式這一法則. 所以我要做的是,一鍵喚醒.
這里借助paramiko 這個(gè)包,做一個(gè)自動(dòng)登錄樹(shù)莓派并發(fā)送命令的python腳本,代碼參考python3+paramiko實(shí)現(xiàn)ssh客戶端-博客園 這篇文章
到這里為止,基本實(shí)現(xiàn)了我的需求,我只需要運(yùn)行該python腳本就可以直接喚醒我的筆記本.
最后一步就是遠(yuǎn)控了.
既然在第二步我們已經(jīng)做到了內(nèi)網(wǎng)穿透,遠(yuǎn)程控制也可以借助frp轉(zhuǎn)發(fā)3389端口,直接使用遠(yuǎn)程桌面. 但是為了更加方便,我選擇使用teamviewer作為主要方案,遠(yuǎn)程桌面作為備用方案. 原因很簡(jiǎn)單,teamviewer可以實(shí)現(xiàn)更方便的文件傳輸和帶寬壓縮,也可以支持VPN,相比遠(yuǎn)程桌面更加方便.
teamviewer下載地址: www.teamviewer.cn/cn/download/windows
被控端我選擇的是teamviewer host, teamviewer host可以支持無(wú)人值守訪問(wèn),相比teamviewer更方便.
teamviewer host
控制端就直接使用的是teamviewer了.
安裝很簡(jiǎn)單,常規(guī)的windows應(yīng)用程序的安裝方式,一路下一步. 注冊(cè)之后,將被控端綁定到賬號(hào)上,可以實(shí)時(shí)的看到被控端在線情況,這樣就不需要去記訪問(wèn)ID和code了.
關(guān)于teamviewer就不多做介紹了,一個(gè)大名鼎鼎的遠(yuǎn)控軟件,相信很多人都用過(guò).
好,至此,所有的配置完成.
參考資料:
1.System Power States
2.What Is Wake-on-LAN, and How Do I Enable It?
本文使用 mdnice 排版