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代理+白嫖的谷歌雲--存在被當做異常流量被封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 排版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章