FRP+WoL實現遠端開機+遠端桌面

不願透露姓名的高楊 發表於 2020-06-29

FRP+WoL實現遠端開機+遠端桌面

故事背景

這是一個很複雜而且很久遠的故事,如果要講的話,這個故事可以追溯到1981年(都是廢話,沒有乾貨,如果不感興趣請從第二章開始),簡單來說:

  • 1981年RFC791定義了IPv4地址,自此拉開了TCP/IP一統天下的序幕
  • 1991年,我出生了
  • 2011,IANA宣佈IPv4地址正式佣金
  • 不知道的某個時間節點,三大運營商開始使用多級NAT技術解決家庭寬頻IPv4地址緊張問題,同時帶來了內網無法無法訪問的問題
  • 2020年2月,新冠疫情來襲,在家辦公,大量辦公資料及開發環境留存在家裡的電腦上
  • 2020年5月,復工,懶得整理個人的電腦檔案更懶得揹著自己的電腦上班
  • 2020年6月初,有遠端連線家裡個人電腦取檔案等需求
  • 2020年6月17日上午10點07分00秒,在尋找各種遠端方案,發現向日葵開機棒可以滿足我的需求
  • 2020年6月17日上午10點07分01秒,意識到自己很窮,沒錢買開機棒
  • 同日晚上6點30分,決定採用0成本方案解決遠端開機和遠端控制的需求

故事背景就是這樣的,簡單來說,因為我自己的電腦上環境比較完善,而且由於公司網路各種限制,導致包括github在內的很多網站訪問不穩定,所以有了遠端控制的需求。但是如果家裡電腦一直開機的話,作為一個N年前的伊拉克戰損版thinkpad,我倒不擔心耗電問題,我擔心的是長期開機它會不會著火。。。

所以,我的需求和幾種方案大概就彙總如下:

  • 可以遠端開關機
    • 方案一:在家裡留一個人,需要的時候打電話給ta--不現實
    • 方案二:教會我家貓開電腦,並且訓練它聽到特定手機鈴聲後按下開機鍵--扯淡一樣的想法
    • 方案三:小米wifi插座+上電既開機設定--小米wifi插座京東618價格39元,太貴了,買不起
    • 方案四:使用上古技術-網路卡喚醒計算機-需要一個網線直連路由器,網線是當年在工程現場順的,不需要任何成本
  • 公網可訪問
    • 方案一:換專線業務,並要求公網IP--太貴,價效比不高
    • 方案二:工信部投訴,強烈要求運營商分配公網IP--勝率不大,而且有可能被當地客響中心揍
    • 方案三:SSH反向代理或者frp代理+白嫖的谷歌雲--存在被當做異常流量被封VPS的可能,但是0成本
  • 穩定流暢的遠端桌面
    • 方案一:埠轉發+windows自帶的遠端桌面
    • 方案二:teamviewer等遠控軟體
    • 兩個方案都可以考慮

開整

其實很簡單,拓撲圖如下:

frp拓撲
frp拓撲

配置的話大概分這麼幾個部分:

  • 網路喚醒(WoL)
  • frp及路由器
  • 遠端控制軟體

一. 網路喚醒(WoL)

1.1 WoL原理

WoL原理很簡單,就是在PC關機或者睡眠之後讓網路卡和主機板的部分功能繼續工作。在網路卡接收到特定的資料包(Magic Packet)的時候,啟用PC。

這個特定的資料包叫做魔術包(Magic Packet),可以是廣播幀。

封裝在乙太網中
封裝在乙太網中

也可以封裝在UDP報文中(或者IPX資料包中,然而IPX早就涼了),通過UDP埠7或者埠9進行傳送。

封裝在UDP中
封裝在UDP中

WoL的訊息格式也很簡單,先是6個位元組的全1(連續6個FF),然後是被喚醒主機的MAC地址,最後可以帶上4位元組或者6位元組的密碼。

訊息格式
訊息格式

WoL需要主機板和作業系統支援該功能才可以。

這裡僅以windows為例,查閱了微軟的文件,win10為了提高系統啟動速度,預設情況下開啟了所謂的快速啟動。win10的快速啟動是介於關機(S5或者G3)和休眠(S4)的一種折中方案。 休眠的時候,記憶體的所有資料都會被寫到硬碟的檔案裡,再次啟動時,僅需要載入該檔案即可,啟動速度快,但是佔用磁碟空間較大。 win10的快速啟動,在關機的時候,所有的使用者程式都會被結束,但是系統的核心和一部分驅動會保留下來並寫入到磁碟,再次啟動的時候會先載入休眠檔案,之後再啟動使用者程式。給使用者的直接感受就是系統啟動速度變快了。

但是根據微軟的官方文件描述,對於關機狀態(S5)和快速啟動狀態下的喚醒,windows未能提供官方支援。不過幸運的是,現在的主機板一般都支援了這個功能。

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.

1.2 配置

WoL的配置很簡單,大概分三步:

  • BIOS中開啟WoL功能
  • windows開啟magicPacket喚醒
  • 允許網路卡網路卡喚醒
  • 樹莓派配置

BIOS配置

在BIOS中找一下相關的配置,有可能叫WoL,有可能叫wake via PCIE/PCI之類的名字,反正大同小異。 找到類似的選項,開啟它。

BIOS配置
BIOS配置

windows配置

win+x-->裝置管理器-->網路介面卡-->有線網路卡-->右鍵屬性

有線網路卡
有線網路卡

在網路卡的高階選項卡下,找到魔術包喚醒,並啟用.如果這裡看不到的話,請更新網路卡驅動.

網路卡配置
網路卡配置

之後在電源管理中,勾選允許此裝置喚醒計算機

網路卡電源管理
網路卡電源管理

至此,WoL配置完成.

配置完成後,最明顯的現象是,在關機狀態下可以看到,計算機的網路卡工作指示燈依舊是亮著的. 說明網路卡在監聽相關魔術包.

樹莓派配置

喚醒裝置可以選擇支援網路喚醒的路由器,樹莓派,以及另外一臺終端等. 目前openwrt上有類似的外掛可以使用. 但是我那臺垃圾堆裡淘換來的斐訊K3上刷的openwrt有點問題,網路喚醒的外掛並不好使. 所以,我選擇使用樹莓派.

我的樹莓派上跑的是centos,配置也很簡單. 用於喚醒的工具ether-wake整合在了ethtool中. 所以:

yum -y install ethtool

安裝完之後,可以直接使用ether-wake -i eth0 11:22:33:44:55進行喚醒.

其中eth0 是樹莓派的有線網路卡, 後面的mac地址是被喚醒主機的mac地址

配置完成後可以測試一下,wireshark可以正常抓到魔術包.

傳送成功
傳送成功

至此,區域網內的配置完成.

二. 內網穿透

到上面為止,我已經可以在內網順利的喚醒我的筆記本. 下面要解決的是內網穿透問題. 也就是怎麼在公網上訪問樹莓派.

關於內網穿透有很多的解決辦法,這裡列出幾個:

  • ssh反向代理
  • frp
  • nps
  • ...

這裡選擇frp,關於原理和配置這裡不再贅述,詳情請檢視frp的github主頁

使用相對還是比較簡單的,如果沒有自己的VPS,可以使用這個公益性質的frp代理服務:外網門

外網門目前國內的伺服器基本都停掉了,海外的幾個機房勉強可用. 使用時,請先做安全性評估.

到這裡為止,已經可以在外網正常的喚醒我的筆記本了.

但是!!!

操作起來相對還是有點複雜的,要喚醒我的筆記本,首先需要登入到樹莓派,然後再敲喚醒的命令,而且mac地址那麼長,誰記得住....

作為一個懶癌晚期患者,一直遵循著自然界動物的所有行為偏向於能量消耗最低的方式這一法則. 所以我要做的是,一鍵喚醒.

這裡藉助paramiko 這個包,做一個自動登入樹莓派併傳送命令的python指令碼,程式碼參考python3+paramiko實現ssh客戶端-部落格園 這篇文章

到這裡為止,基本實現了我的需求,我只需要執行該python指令碼就可以直接喚醒我的筆記本.

最後一步就是遠控了.

三. 遠端控制

既然在第二步我們已經做到了內網穿透,遠端控制也可以藉助frp轉發3389埠,直接使用遠端桌面. 但是為了更加方便,我選擇使用teamviewer作為主要方案,遠端桌面作為備用方案. 原因很簡單,teamviewer可以實現更方便的檔案傳輸和頻寬壓縮,也可以支援VPN,相比遠端桌面更加方便.

teamviewer下載地址:https://www.teamviewer.cn/cn/download/windows/

被控端我選擇的是teamviewer host, teamviewer host可以支援無人值守訪問,相比teamviewer更方便.

teamviewer host
teamviewer host

控制端就直接使用的是teamviewer了.

安裝很簡單,常規的windows應用程式的安裝方式,一路下一步. 註冊之後,將被控端繫結到賬號上,可以實時的看到被控端線上情況,這樣就不需要去記訪問ID和code了.

關於teamviewer就不多做介紹了,一個大名鼎鼎的遠控軟體,相信很多人都用過.

好,至此,所有的配置完成.

參考資料:

1.System Power States

2.What Is Wake-on-LAN, and How Do I Enable It?

本文使用 mdnice 排版