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

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代理+白嫖的Google雲–存在被當做異常流量被封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下載地址://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 排版