手機(jī)單控及玩客云服務(wù)部署小記
近期家里拉了寬帶,好友送了一個(gè)玩客云盒子,遂探索使用遠(yuǎn)程控制方式實(shí)現(xiàn)手機(jī)操作。
一、手機(jī)篇
對于遠(yuǎn)程控制的場景,一般使用紅米這種技術(shù)開放程度高的品牌,遂在咸魚上40多塊淘了個(gè)紅米note4x作測試。不過郵過來的手機(jī),既沒有電池又沒有直充線,筆記本usb的電流不足無法將手機(jī)開機(jī),只能勉強(qiáng)進(jìn)入fastboot模式。在退換不方便的情況下,只能用充電頭點(diǎn)亮手機(jī),在全程無法開機(jī)連接電腦的前提下硬著頭皮測驗(yàn),還好最終實(shí)現(xiàn)了功能。
1.解BL鎖。
可以照著B站的這個(gè)視頻一步一步的操作:[從零開始 Vol.1]綁定及解鎖BootLoader 。
對于我來講,下載小米的官方線刷工作后,使用管理員運(yùn)行工具即正常安裝驅(qū)動,然后在手機(jī)上進(jìn)入開發(fā)者工具(接充電頭),綁定小米賬號后重啟進(jìn)入fastboot模式(接電腦),最后使用小米的官方解鎖工具完成解鎖。
2.獲取Root權(quán)限
一般有兩種方法,刷機(jī)至開發(fā)版或者使用面具(Magisk),我首先選擇的是線刷開發(fā)版。但從最晚的9.8一直刷到9.1,甚至還刷了個(gè)8.12,都在獲取Root功能中提示“下載過程中存在異常,建議您重新下載”,導(dǎo)致無法獲取root。我上網(wǎng)上搜索也發(fā)現(xiàn)有類似的問題,我猜測應(yīng)該是紅米官方人為的關(guān)閉了老舊機(jī)型與系統(tǒng)的Root獲取功能。最后只能重新刷了最新的穩(wěn)定版11.0.2,然后選擇面具方式獲取Root。線刷時(shí)注意不要選擇“全部刪除并lock”,否則手機(jī)會重新鎖住,便需再次執(zhí)行第1步。
可以照著面具中文網(wǎng)的教程一步一步的操作:Magisk安裝教程,本質(zhì)上masgisk就是一個(gè)破解工具,通過在boot.img中注入屏蔽代碼,然后刷入手機(jī)替換原版,實(shí)現(xiàn)對操作系統(tǒng)的欺騙,最終完成Root獲取。
3.開機(jī)自啟遠(yuǎn)程調(diào)試
這一步需要修改手機(jī)的啟動配置文件。安裝老牌的文件管理器 Root Explorer并賦予Root權(quán)限,然后使用它打開 /system/build.prop 文件,在文件的最后添加開機(jī)自動打開adb訪問端口,端口值可自定義。
service.adb.tcp.port=5555
最后進(jìn)入手機(jī),打開開發(fā)者模式,打開usb調(diào)試模式,打開usb調(diào)試(安全設(shè)置)即可,其中開啟后者前需要先插入一張sim卡。至此,手機(jī)側(cè)的工作已準(zhǔn)備好。
4.其它設(shè)置
紅米note4x是實(shí)體按鍵,無虛擬按鍵選項(xiàng)。可在更多功能探索中,打開懸浮球選項(xiàng),方便遠(yuǎn)程之后執(zhí)行返回,開關(guān)機(jī)等操作。
其它參考:
Android 設(shè)備開機(jī)或聯(lián)網(wǎng)時(shí)自動開啟無線調(diào)試(WIFI調(diào)試)
scrcpy鏈接手機(jī)后只能顯示無法觸控/scrcpy啟動腳本/adb傳輸文件打包
二、玩客云
手上玩客云的基本情況是arm7 32位架構(gòu)的4核cpu,1G的內(nèi)存,8G的存儲,有千兆的網(wǎng)口,還有一個(gè)usb2口。盒子已經(jīng)刷為了armbain 23.08系統(tǒng),采用的debain分支bullseye版本,歸屬玩客云版本為6.1.31
1.更換軟件庫
首先將軟件庫更換為國內(nèi)源,需要修改 /etc/apt/sources.list 及 /etc/apt/sources.list.d/armbian.list 兩個(gè)文件。其中前者是通用軟件庫,后者是專用軟件庫,以更換為清華源為例。
sources.list,注釋原有內(nèi)容并填入如下內(nèi)容
# 默認(rèn)注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# 以下安全更新軟件源包含了官方源與鏡像站配置,如有需要可自行修改注釋切換
deb https://security.debian.org/debian-security bullseye-security main contrib non-free
# deb-src https://security.debian.org/debian-security bullseye-security main contrib non-free
armbian.list,將 http://apt.armbian.com 替換為 https://mirrors.tuna.tsinghua.edu.cn/armbian ,如下
deb https://mirrors.tuna.tsinghua.edu.cn/armbian bullseye main bullseye-utils bullseye-desktop
最后統(tǒng)一升級軟件庫目錄并執(zhí)行軟件更新,更新后歸屬玩客云版本號為6.6.32。
apt-get update
apt-get upgrade
2.安裝常用軟件
安裝 screen、ne、alex,具體安裝與設(shè)置方式,可參見我的另一篇 Ubuntu 22.04部署小記
參考
三、手機(jī)投屏與控制
市面上常見的控制軟件大部份為scrcpy系,如scrcpy、qtscrcpy等,原理是通過手機(jī)的adb服務(wù)與手機(jī)進(jìn)行交互。在填寫手機(jī)被分配的IP后即可實(shí)現(xiàn)遠(yuǎn)程投屏與控制。教程很多,不贅述。
參考
13k+ Stars 功能強(qiáng)悍,群控手機(jī),開源無需root
四、手機(jī)直控
當(dāng)手機(jī)adb服務(wù)假死,或者連接過程中因?yàn)榫W(wǎng)絡(luò)原因掉線,再次連接時(shí)可能會提示端口占用而無法連接,此時(shí)只能通過人工現(xiàn)場重啟adb服務(wù),甚至重啟手機(jī)的方式進(jìn)行恢復(fù)。為了更穩(wěn)健的遠(yuǎn)程手機(jī),建議新增手機(jī)直控模式,即直接在手機(jī)內(nèi)安裝app,然后通過客戶端工具將指令發(fā)給app,app調(diào)用手機(jī)shell直接執(zhí)行或者解析屏幕顯示模擬點(diǎn)擊執(zhí)行。
目前比較經(jīng)濟(jì)高效的方式是借助手機(jī)的自動化框架完成上述事宜。市面比較常見的有hamibot、autojs、easyclick等。我這邊選擇的是autojs,其客戶端工具名為autojs-web-control,使用了nodejs、nginx及mysql數(shù)據(jù)庫,目前在github上存在好幾個(gè)倉庫版本。
1.直接運(yùn)行模式
zrk1993的倉庫版本使用了直接運(yùn)行模式。
1.1 npm
使用apt工具進(jìn)行安裝
apt install npm
將node與npm的鏡像地址均修改為國內(nèi)源(淘寶)
npm config set registry https://npmmirror.com/mirrors/npm/ npm config set disturl https://npmmirror.com/mirrors/node/
1.2 mariadb
系統(tǒng)使用mysql存儲數(shù)據(jù)。可以使用mariadb平替。
apt install mariadb
打開/etc/mysql/mariadb.conf.d/50-server.cnf,注釋bind-address屬性,打開遠(yuǎn)程訪問權(quán)限。
#bind-address = 127.0.0.1
本機(jī)登錄mariadb,打開root的遠(yuǎn)程登錄權(quán)限并設(shè)置密碼為root
mysql -u root -p grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges;
使用數(shù)據(jù)庫工具連接mariadb,創(chuàng)建cloud_auto數(shù)據(jù)庫,然后下載并解壓倉庫代碼,執(zhí)行cloud_auto.sql及update.sql,執(zhí)行前者時(shí)如果腳本報(bào)錯(cuò)則刪除開頭注釋后再次執(zhí)行。
1.3 server端
打開server/utils/db.ts文件,將端口和密碼修改為實(shí)際值
const orm = new DBM({ connectionLimit: 10, host: 'localhost', port: 3306, user: 'root', password: 'root', database: 'cloud_auto', isDebug: true, });
在server目錄執(zhí)行打包,獲取相關(guān)依賴庫
npm install
打開tsconfig.json文件,修改發(fā)布目標(biāo)目錄為dist
"outDir": "./dist",
在server目錄執(zhí)行發(fā)布
npm run build
修改package.json,添加start指令,簡化服務(wù)啟動命令
"scripts": { "start": "node ./modules/default/main.js", "build": "tsc -p tsconfig.build.json", "clean": "ts-clean", "lint": "tslint --fix -p tsconfig.json -c tslint.json" },
將依賴庫及引用文件復(fù)制至dist目錄
cp -rf ./node_modules/ ./dist/ cp ./package.json ./dist/
項(xiàng)目里引用了作者另外兩個(gè)庫,在實(shí)際操作中沒有一并發(fā)布,如果現(xiàn)在直接運(yùn)行本項(xiàng)目會報(bào)錯(cuò),我這邊手工編譯也會報(bào)錯(cuò),只需要手工下載作者的打包結(jié)果并放至指定目錄即可
下載 https://github.com/zrk1993/souljs 項(xiàng)目,解壓后將 dist 文件夾復(fù)制至 dist/node_modules/souljs/ ,下載 https://github.com/zrk1993/soul-orm 項(xiàng)目,解壓后將 dist 文件夾復(fù)制至 dist/node_modules/soul-orm/
cp -rf ./dist/ dist/node_modules/souljs/ cp -rf ./dist/ dist/node_modules/soul-orm/
最后執(zhí)行如下兩種命令中的任意一種,均可開啟服務(wù),將監(jiān)聽9317端口數(shù)據(jù)
npm run start
node ./modules/default/main.js
1.4 web端
項(xiàng)目依賴python2,且使用的是python命令。注意不能最小化安裝python2-minimial,否則編譯過程會報(bào)找不到 compiler.ast 的錯(cuò)誤,然后對python命令作軟鏈接
apt install python2ln -s /usr/bin/python2 /usr/bin/python
在web目錄執(zhí)行打包,獲取相關(guān)依賴庫。由于直接依賴與間接依賴存在沖突,需要增加legacy-peer-deps進(jìn)行忽略
npm install --legacy-peer-deps
修改web目錄下 .env.staging 文件,將api與ws地址指向service端
VUE_APP_BASE_API = 'http://192.168.191.50:9317'
VUE_APP_WS_HOST = 'ws://192.168.191.50:9317'
運(yùn)行 npm run dev可以本地模式運(yùn)行,但更建議以stage標(biāo)簽方式發(fā)布至dist目錄下,然后掛載至nginx中訪問,提高運(yùn)行性能
npm run build:stage
1.5 nginx服務(wù)掛載
使用apt工具進(jìn)行安裝
apt install nginx
修改 /etc/nginx/sites-enabled/default 配置文件 ,將根目錄指向上面web端發(fā)布的dist目錄
root /opt/autojs-web-control-master/web/dist;
重啟nginx后
systemctl restart nginx.service
現(xiàn)在就可以使用瀏覽器訪問服務(wù)器ip,使用admin/123456來登錄 Autojs Web Control System

參考
MariaDB versus MySQL: Compatibility
mariadb新安裝解決遠(yuǎn)程訪問以及root登錄
npm install xxxx --legacy-peer-deps命令是什么?為什么可以解決下載時(shí)候產(chǎn)生的依賴沖突呢?
ImportError: No module named compiler.ast on embedded linux
1.6 auto.js app
auto經(jīng)歷了二代,第一代的最終版是4.1.1,因?yàn)樯婕澳承┰虮幌录埽缓蟀l(fā)布出第二代,屏蔽了不少app的適配。我這邊只是用于開關(guān)機(jī)或開關(guān)服務(wù)的簡單操作,使用第一代即可。從這里下載第一代的最終版。
安裝至手機(jī)上后打開app,首先將提示需打開此app的無障礙服務(wù),而后使用面具為其賦予Root權(quán)限。點(diǎn)擊左上角的三根線圖標(biāo),點(diǎn)擊“連接電腦”,在彈出的框中輸入布署server端的服務(wù)器ip地址,確認(rèn)后即可在web端看到設(shè)備上線。

在web端創(chuàng)建如下腳本,實(shí)現(xiàn)重啟手機(jī)adb服務(wù)
auto.waitFor(); function RestartADBD() { toastLog("ADBD重啟中……"); shell("stop adbd", true); sleep(1000); shell("start adbd", true); toastLog("ADBD已重啟。"); } RestartADBD();
在web端創(chuàng)建如下腳本,實(shí)現(xiàn)重啟手機(jī)
auto.waitFor(); // 文檔地址:https://docs.hamibot.com/reference/widgetsBasedAutomation function ShutdownR() { //使用root權(quán)限重啟 shell("reboot", true); sleep(1000); //1秒后還未重啟,則采用物理方式重啟。 powerDialog(); sleep(1000); click('重新啟動'); } ShutdownR();
目前每次手機(jī)重啟后,auto.js app連接電腦的設(shè)置會被默認(rèn)關(guān)閉,服務(wù)端會丟失手機(jī)設(shè)備的連接,導(dǎo)致后續(xù)無法繼續(xù)發(fā)送指令。可以借助auto.js app的自動化操作能力,實(shí)現(xiàn)設(shè)置的重打開。
在開發(fā)者模式中,打開指針位置選項(xiàng),確認(rèn)好auto.js app在桌面上的坐標(biāo),然后在app中創(chuàng)建新腳本,如下
device.keepScreenDim(); // 保持屏幕常亮,但允許屏幕變暗來節(jié)省電量。當(dāng)屏幕沒有點(diǎn)亮,則會喚醒屏幕。 sleep(1000); swipe(500, 1500, 900, 500, 201); // 滑動解鎖,小米手機(jī)的滑動時(shí)間應(yīng)在201-230之間 sleep(1000) click(650, 1400); // 打開桌面auto.js應(yīng)用 sleep(5000) desc("打開側(cè)拉菜單").click(); // 打開設(shè)置面板 sleep(1000) swipe(500, 1200, 500, 500, 1000); // 向上滑動顯出連接電腦的選項(xiàng) sleep(1000); click(500, 1300); // 點(diǎn)擊連接電腦滑動開關(guān) sleep(1000); click(860, 775); // 連接服務(wù)器
點(diǎn)擊腳本右鏈的三個(gè)點(diǎn)按鈕,選擇更多,創(chuàng)建定時(shí)任務(wù),將腳本設(shè)置為特定事件(廣播)觸發(fā)運(yùn)行 - 開機(jī)時(shí),然后將 auto.js app 加入授權(quán)手機(jī)的開機(jī)自動。實(shí)測在本手機(jī)中,開機(jī)見到桌面后,再等40秒左右將自動運(yùn)行此腳本連接server端。
1.7 腳本調(diào)試
一段合格的腳本編制需要大量的調(diào)試,app使用條件有限,建議使用vscode工具完成代碼編制與腳本調(diào)試。
1.7.1 vscode
vscode的安裝與使用網(wǎng)上有很多教程,不贅述。與auto.js app搭配使用的是Auto.js-autox.js-VSCodeExt插件,完成安裝后,通過ctrl + shift + p 或者查看->命令菜單,調(diào)出命令框,輸入auto.js,然后在智能提示中選擇"開啟服務(wù)并監(jiān)聽ADB設(shè)備(Start all server)",即可啟動server端監(jiān)聽,然后在auto.js app中將連接電腦的ip地址指向vscode所在電腦ip地址即可完成連接。最后在vscode中創(chuàng)建任意名稱的js文件,錄入代碼后,按F5鍵即可實(shí)現(xiàn)代碼調(diào)試。
1.7.2 auto.js app
在代碼編寫與調(diào)試過程,經(jīng)常需要對界面元素進(jìn)行定位。auto.js支持兩種定位模式。如果使用基于界面元素的定位,這時(shí)就需要開啟app的懸浮窗功能,也需要手機(jī)對app授權(quán)懸浮窗權(quán)限,然后會在界面的左中側(cè)顯示一個(gè)小的懸浮圓鈕,點(diǎn)擊后會展開若干功能,其中第三個(gè)就是界面分析;如果使用基于坐標(biāo)的定位,則是開啟手機(jī)開發(fā)者模式中的指針位置,然后記錄操作過程的坐標(biāo)。在我的體驗(yàn)中,對于界面復(fù)雜且命名混亂,想實(shí)現(xiàn)的功能又特別簡單,目標(biāo)手機(jī)能保持相同品牌相同型號的,使用坐標(biāo)定位會更簡單。具體的使用方式參見官方教程。
1.8 保持連接
默認(rèn)情況下,實(shí)測app會在鎖屏之后2分鐘左右斷開與server端的連接,當(dāng)在后臺運(yùn)行時(shí),也可能受操作系統(tǒng)策略影響在任意不確定時(shí)間被系統(tǒng)后臺中止,所以需要進(jìn)行相關(guān)設(shè)置,使app長久穩(wěn)定運(yùn)行,且保持app與server端的連接狀態(tài)。
1.8.1 電池策略
進(jìn)入手機(jī)的設(shè)置,電池與性能,然后點(diǎn)擊右上角的設(shè)置,關(guān)閉鎖屏后斷開數(shù)據(jù),鎖屏后清理內(nèi)存,然后在應(yīng)用智能省電中,將auto.js的策略設(shè)置為無限制。
1.8.2 鎖屏策略
在web端使用如下命令來保持屏幕常亮且允許屏幕變暗來節(jié)省電量。進(jìn)入手機(jī)的設(shè)置,鎖屏和密碼,然后將自動鎖屏的策略修改為從不也是相關(guān)的效果(但不會屏幕變暗來節(jié)省電量),建議使用命令方式。
device.keepScreenDim()
1.8.3 應(yīng)用鎖定策略
打開手機(jī)自帶的app切換頁面,然后長鍵auto.js應(yīng)用,在彈出的按鈕中點(diǎn)擊鎖按鈕,這樣可以保證應(yīng)用在后臺運(yùn)行時(shí)不被清理。
1.8.4 設(shè)置為前臺服務(wù)
打開 auto.js app,打開設(shè)置面板,打開前臺服務(wù)開關(guān),可以提高應(yīng)用的存活率。
1.8.5 心跳包策略
通過設(shè)置心跳包,讓app與server端定期通信,可以增強(qiáng)連接的可靠性。在web端創(chuàng)建一個(gè)運(yùn)行腳本,錄入上面讓屏幕保持常亮的語句,執(zhí)行設(shè)備選擇目標(biāo)設(shè)備(實(shí)測選擇所有設(shè)備時(shí)運(yùn)行無效果),然后在計(jì)劃任務(wù)中設(shè)置每間隔1分鐘執(zhí)行一次,最后啟動此定時(shí)任務(wù)即可,cron表達(dá)式如下。在我目前實(shí)測中,做到前面兩步即可保持常連接。
*/1 * * * *
參考
從0到1,教你如何使用Tasker+Autojs實(shí)現(xiàn)自動打卡功能
autojs,定時(shí)腳本的一個(gè)簡單應(yīng)用,應(yīng)用自啟動與手動啟動的區(qū)別。
【Android】【應(yīng)用保活】保證應(yīng)用在后臺繼續(xù)運(yùn)行
2.docker模式運(yùn)行(未成功)
shonngithub的倉庫版本使用了docker-compose模式。下載并解壓,進(jìn)入deploy目錄。但其主理人只編譯了amd64架構(gòu)的鏡像,玩客云為armv7 32位架構(gòu)無法運(yùn)行,故需要重新尋找鏡像。
2.1 docker及docker-compose
使用apt工具進(jìn)行安裝
apt install docker.io docker-compose
創(chuàng)建或修改/etc/docker/daemon.json,添加國內(nèi)的鏡像加速源。今年7月以來很多加速源均失效了,需要不斷的更新這個(gè)目錄。
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com", "https://dockerhub.icu/", "https://hub.rat.dev/", "https://docker.wanpeng.top" ] }
項(xiàng)目里deploy/docker-compose文件的版本為3.8,需要下降至3.7或更低,否則運(yùn)行報(bào)錯(cuò)
version: '3.7'
2.2 mysql
經(jīng)查找,biarms/mysql 提供了5.7的armv7架構(gòu)的mysql,修改編輯docker-compose.yml,將image屬性進(jìn)行修改
image: biarms/mysql:5.7.33-beta-circleci
2.3 autojs服務(wù)端
服務(wù)端為個(gè)性化代碼,需要自己重新編譯。解壓根目錄的Dockerfile文件中引用了 shonnz/node-nginx:alpine,但可惜這個(gè)鏡像也屬于主理人,也作了個(gè)性化處理,且找不到Dockerfile,即使通過dfimage工具逆向出來的Dockerfile參考也不得所以,目前已向主理人申請Dockerfile文件,等待返饋。
參考
docker 與 docker-compose 文件版本 對應(yīng)關(guān)系
在 armv7l 和 s390x 架構(gòu)服務(wù)器上啟用 MySQL 和 OpenResty
【Docker】從零開始將自己的應(yīng)用打包到docker鏡像
五、搭建網(wǎng)絡(luò)連接
筆記本隨自攜帶,一部份手機(jī)可能隨身攜帶,一部份手機(jī)放在家里,玩客云肯定放在家里,所以我需要找到一種方式,能夠隨時(shí)將自己與家里鏈接起來。目前家里的路由器使用的是京東云A6600,俗稱雅典娜,光貓橋接至路由器,路由器播號上網(wǎng)。
我測試的第一種方式,是直接使用ip6公網(wǎng)ip訪問內(nèi)網(wǎng)手機(jī)。但是京東云自帶的不論是dmz還是端口映射,都只能配置ip4版本,京東云也不支持將ip6轉(zhuǎn)為ip4后轉(zhuǎn)發(fā),所以無法成功。但按這種思路,可以衍生出使用玩客云安裝openwrt軟路由播號上網(wǎng),然后玩客云本身也作為服務(wù)器實(shí)現(xiàn)端口映射。這種思路后面再研究。下面幾種方式均基于ip4。
第二種方式,是使用京東云自帶的花生殼+端口映射,但是測試了很久,花生殼一直登錄不上去,可能是版本老舊的原因,無法成功
第三種方式,是使用官方的花生殼樹莓派客戶端+官方花生殼內(nèi)網(wǎng)穿透,這個(gè)測試成功了,但是免費(fèi)賬號只能配置2個(gè)內(nèi)網(wǎng)穿透。雖然后面研究后,可以使用nginx的負(fù)載均衡(upstream)的輪詢功能,通過scrcpy工具的主動連接與主動斷開,實(shí)現(xiàn)相同端口對不同手機(jī)的訪問,但是終究是復(fù)雜了點(diǎn)。(備用方案)
我最終選擇了第四種方式,即使用zerotier或tailscale架設(shè)私有VPN。具體來講又有兩種策略,一種是在所有在手機(jī)、筆記本、玩客云上安裝z或t,所有通信均在z或t網(wǎng)下進(jìn)行。z或t網(wǎng)服務(wù)器在國外,通信的穩(wěn)定性不足,且在手機(jī)上安裝z或t比較費(fèi)時(shí),最終我選擇了另一種,即只在筆記本和玩客云上安裝z或t,玩客云通過端口映射轉(zhuǎn)發(fā)至手機(jī)。
1. 安裝zerotier
按照 內(nèi)網(wǎng)穿透神器ZeroTier使用教程 這個(gè)教程一步一步的注冊賬號、創(chuàng)建網(wǎng)絡(luò)、加入網(wǎng)絡(luò)、分配ip等工作,實(shí)現(xiàn)筆記本與玩客云的互通。
可以通過部署私有化行星或月亮服務(wù)器加快訪問速度(參考1,參考2),不過其要求有固定的外網(wǎng)ip,故放棄。
2. 安裝tailscale(個(gè)人首選)
按照 下一代VPN工具:體驗(yàn)TailScale的簡便和高效 這個(gè)教程在筆記本上一步一步的下載安裝、注冊賬號、官方管理端配置禁用DNS。
然后回到官網(wǎng)選擇linux下的手工安裝模式,選擇 Raspberry Pi Bullseye ,然后按照官方教程一步一步的安裝,在執(zhí)行 tailscale up 命令時(shí),將彈出的地址在瀏覽器中打開,然后使用相同的賬號進(jìn)行登錄綁定,即可完成筆記本與玩客云的組網(wǎng)。可在官方管理端或使用 tailscale ip -4 命令查詢ip地址。個(gè)人實(shí)測感覺t網(wǎng)的連接速度比z網(wǎng)略快(但均慢于花生殼)。
3. 安裝蒲公英(個(gè)人首選)
首先登錄貝銳蒲公英后臺創(chuàng)建網(wǎng)絡(luò),然后按照 中國版的Zerotier:蒲公英進(jìn)階玩法,想不想白嫖,全在你! 這個(gè)教程,在筆記本安裝win版貝銳蒲公英并登錄相同賬戶,同時(shí)在玩客云安裝arm 32位版貝銳蒲公英并登錄相同賬戶,此時(shí)蒲公英將自動將這兩臺設(shè)備組網(wǎng)。在各自的客戶端或貝銳蒲公英后臺可查看各設(shè)備虛擬ip。
下一步配置轉(zhuǎn)發(fā),端口映射又有兩種實(shí)現(xiàn)方式:nginx轉(zhuǎn)發(fā)、iptables轉(zhuǎn)發(fā)。
4 nginx轉(zhuǎn)發(fā)(個(gè)人首選)
這個(gè)比較簡單,在 /etc/nginx/nginx.conf 中添加stream流轉(zhuǎn)發(fā)規(guī)則,然后重啟nginx即可。注意stream節(jié)點(diǎn)需與http平級。
stream { server { listen 51000; proxy_pass 192.168.68.177:5555; } }
4 iptables轉(zhuǎn)發(fā)
首先打開 /etc/sysctl.conf 設(shè)置 net.ipv4.ip_forward 屬性開啟 ip4 數(shù)據(jù)轉(zhuǎn)發(fā)功能,然后重啟服務(wù)器。使用 sysctl -p 檢查設(shè)置結(jié)果
net.ipv4.ip_forward = 1
然后配置轉(zhuǎn)發(fā)規(guī)則。目前玩客云有兩張網(wǎng)卡,一張是物理網(wǎng)卡連接了wifi,與手機(jī)通信,另一張是vpn網(wǎng)卡與筆記本通信,所以 PREROUTING 規(guī)則應(yīng)該配置從VPN網(wǎng)卡到手機(jī)的通信, POSTROUTING 規(guī)則應(yīng)該配置手機(jī)到物理網(wǎng)卡的通信,然后由玩客云內(nèi)部自行實(shí)現(xiàn)從物理網(wǎng)卡到VPN網(wǎng)卡的通信,最終再從VPN網(wǎng)卡至筆記本的通信。由于手機(jī)無法尋址玩客云VPN網(wǎng)卡,POSTROUTING 直接對 PREROUTING 作反向配置將導(dǎo)致數(shù)據(jù)回傳丟包。配置完將立即生效。
iptables -t nat -A PREROUTING -d 192.168.191.50 -p tcp --dport 52000 -j DNAT --to-destination 192.168.68.177:5555
iptables -t nat -A POSTROUTING -d 192.168.68.177 -p tcp --dport 5555 -j SNAT --to 192.168.68.160
目前相關(guān)配置僅存于內(nèi)存中,服務(wù)器重啟后將丟失,所以需要進(jìn)行保存。debian體系下,iptables安裝后不是服務(wù),所以需要保存規(guī)則至文件,然后自建開機(jī)自啟加載服務(wù)。或者使用 iptables-persistent 包完成上述工作。相關(guān)操作見參考即可。
參考
iptables實(shí)現(xiàn)端口映射(本地和遠(yuǎn)程端口映射)
雙網(wǎng)卡Iptables端口轉(zhuǎn)發(fā)

浙公網(wǎng)安備 33010602011771號