更適合國內的遠程訪問方法:自建根伺服器打造基於 ZeroTier 虛擬內網 - 少數派#
#Omnivore
更適合國內的遠程訪問方法:自建根伺服器打造基於 ZeroTier 虛擬內網
多款公有雲產品出現宕機問題,越來越多人開始選擇私有雲來存儲數據。拍攝的照片、下載的電視劇、音樂和電影如今都被存儲在家中的 NAS 設備或者電腦上。這樣,我們可以在不受公網環境限制的情況下,隨時隨地訪問和使用這些數據。有時候我們需要在外網環境訪問家中 NAS 的資料和數據,但目前很多方案都缺少一定的靈活性。
況且,隨著假期臨近,相信不少朋友都有出門或者回家的打算。考慮到會出現的需要訪問家中 / 公司設備的場景,又或許是臨時下載放在伺服器中的文件,還或許是連上住所的 NAS 和親朋好友一起觀看自己收藏的電影和照片。這個時候,穩定可靠的遠程訪問能力就更加至關重要了。
關聯閱讀:
- 《異地網絡遠程訪問指北》上 中 下
- 過年返鄉之後,我是如何遠程訪問家中設備的?
目前的遠程訪問方案#
總的來說,從外網訪問內網的服務大致有三種方案:
- 獲取公網 IP + DDNS 解析
- 隧道穿透
- 構建虛擬局域網
使用 DDNS 是最為簡單的訪問方法,但目前可行性越來越低
如果你家的寬帶能獲得公網 IP,直接使用 DDNS 是一種靈活的解決方案。只需配置好 DDNS 解析及端口轉發,便可通過域名加端口的方式在公網訪問內網映射的服務。這種配置簡單,速度只受家庭上行帶寬限制。但這種方案的可行性正逐漸降低。主要是因為 IPv4 地址枯竭,國內寬帶運營商不再為家庭用戶分配公網 IP,導致許多家用寬帶的 IP 地址是內網地址,無法實現動態地址解析,從而使得外部訪問變得越發艱難。
frp 作為最為常用的內網穿透工具,難點主要是客戶端配置編輯較為複雜
隧道穿透方案,即通過一台具有公網 IP 的伺服器作為跳板,暴露內網服務到公網中實現訪問,這個方案的優點在於網絡訪問穩定,帶寬速度取決於公網 IP 伺服器的帶寬。缺點則是配置較為複雜,需要在伺服器上安裝相關的服務,還需要在內網服務端寫配置項。同時隧道穿透對一些網絡協議支持較差,尤其是 HTTPS 協議配置極其複雜繁瑣。
最後一種方案則是構建虛擬局域網,簡單來說就是將分處不同網絡下的設備跨網絡組建在一個虛擬局域網中,從而實現基於內網 IP 的設備間互訪,這種方案最大的好處在於不受限於網絡協議,並且部署安裝客戶端較為簡單並支持私有化部署,缺點則是提供該服務的廠商多來自國外,相對應的是服務在國內網絡環境下穩定性較差。
基於構建虛擬局域網的服務目前主流的有 ZeroTier、Tailscale 以及國產的蒲公英。而在我的橫向對比以及測試中最終選擇了更為靈活的 ZeroTier,首先就是家用的情況,即便是官方的 ZeroTier 也幾乎不產生任何費用,支持通過 ID 的方式就可以直接加入自建的虛擬局域網中(Tailscale 添加新設備需要單點登錄授權),更重要的是目前 ZeroTier 提供了更為靈活的自部署方案,無論是操作上還是方法上都遠比另兩款服務更為簡單。
雖然我選擇了 Zerotier 來構建虛擬局域網實現外網訪問內網,但卻並不使用其官方服務,最重要的一點就是官方的根伺服器(行星伺服器)都部署在海外,由於國內互聯網的特殊性導致會出現較高的延遲,從而就會影響到組網的穩定性。雖然可以通過在國內自建 Moon 伺服器(衛星伺服器)來來緩解解決訪問問題,但由於虛擬局域網解析依舊取決於根伺服器,所以最為直接的辦法就是完全在國內互聯網上自建行星伺服器(根伺服器)以及網絡控制器,從而從本質上實現最為高效穩定的虛擬局域網構建。
而這樣做的優點是:不受制於國外網絡訪問速度,整個流程完全自主可控,而實際上費用也是最低的 —— 你僅僅只需要從國內各大雲伺服器廠商那裡購買一台配置極低的雲伺服器,一年費用可能都不到百元。
和 Tailscale 類似,Zerotier 同樣也可以實現網絡控制器以及根伺服器的自部署,只不過以前我們只能自建衛星伺服器(Moon 伺服器)以及網絡控制器,而現在則可以實現自部署根伺服器(行星伺服器),這樣你完全不需要註冊官方的 Zerotier 的任何帳號也可以實現整個虛擬局域網的自建。
在雲伺服器中安裝 Zerotier 行星伺服器#
首先第一件事就是購買一台國內雲服務提供的雲伺服器,整體規格上「1 核 2G」或者「2 核 2G」就可以,最重要的需要有一個公網 IP 方便進行設備管理,在開始之前我們需要打開雲伺服器的防火牆,額外放行 3443 端口(TCP)和 9993 端口(TCP 和 UDP)。
接下來我們使用 SSH 客戶端以 root 權限登錄雲伺服器,然後根據伺服器中發行版不同先更新系統組件並安裝 Git、docker 並啟動 docker:
# debian 系檢查更新
apt update
# debian 系無需確認安裝 git
apt install -y git
# 通過 docker 官方源安裝 docker
curl -fsSL https://get.docker.com |bash
# 通過 systemd 啟動 docker 服務
systemctl start docker
# red hat 系檢查更新
yum update
# red hat 系無需確認安裝 git
yum install git -y
# 通過 docker 官方源安裝 docker
curl -fsSL https://get.docker.com |bash
# 通過 systemd 啟動 docker 服務
systemctl start docker
接著,我們需要複製一份 xubiaolin 製作了自建行星伺服器安裝腳本:
# 複製一份 xubiaolin 製作了自建行星伺服器安裝腳本
git clone https://ghproxy.markxu.online/https://github.com/xubiaolin/docker-zerotier-planet.git
# 進入具體目錄
cd docker-zerotier-planet
# 運行腳本
./deploy.sh
腳本會給出相關的提示選擇,這裡直接輸入 1
回車來安裝,安裝過程要你輸入相應的端口,這裡全部選擇默認即可。之後就是創建容器的過程,如果你和我一樣使用的是性能比較低的雲伺服器,那麼整個安裝等待會比較長(十分鐘左右)。
當你看到類似終端界面出現Successfully copied 2.048kB to /tmp/planet
的字樣就表示整個安裝過程已經結束,當然你如果不確定的話可以使用如下命令來判斷該容器是否已經啟動:
docker ps
如果在 STATUS
下面顯示為 Up 表示容器已經啟動,那麼接下來直接在瀏覽器的地址欄輸入 http://雲伺服器ip:3443
來打開網絡管理後台,如果可以看到如下登錄頁面就算是伺服器端安裝成功了。
所有運行完成之後,這個自建的虛擬局域網服務會生成一個名為planet
的文件,這個也是後面我們在配置客戶端時需要的,這裡使用 SSH 客戶端進入到 docker-zerotier-planet
目錄,然後繼續運行 ./deploy.sh
這個腳本,輸入數字 3 回車後將 planet
文件拷貝到當前目錄,然後使用 sFTP 客戶端將文件複製回本地待用即可。
給自建的 Zerotier 設置網絡#
在本地打開瀏覽器,然後訪問http://雲伺服器ip:3443
進入到網絡控制器登錄頁面:
使用默認帳號:admin
、密碼:password
登錄後,點擊選項卡中的 Add Network
來創建一個網絡。
創建完成後會自動跳轉到新建的這個網絡詳情頁面中,然後點擊上方 IPv4 Assign Mode
,再勾選Auto-assign from IP Assignment Pool
來讓新加入網絡的設備自動從地址池中獲取一個 IP。
另外需要單獨保存的是對應的網絡 ID,比如說我創建的這個名為ceshi
網絡後面對應的一串字符,這個單獨保存下來備用,後面需要通過這個 ID 讓客戶端加入到你創建的這個 ID 中。
客戶端加入#
由於我的主要用途是讓隨身攜帶的筆記本電腦可以隨時訪問到家中的群暉,因此需要的是將家中的群暉、Mac 電腦以及 Windows 筆記本加入到同一個虛擬局域網中。
Windows 系統設備設置#
首先下載官方的 ZeroTier Windows 客戶端安裝包並進行安裝。
第二步:安裝完畢之後使用文件資源管理器訪問如下路徑:C:\ProgramData\ZeroTier\One
,使用此前從雲伺服器中拷貝複製下來的 planet
文件替換目錄下的同名文件。
第三步:打開服務
並選中服務列表中的 ZeroTier One,點擊左上方的重啟服務
。
第四步:右鍵任務欄的 Windows 徽標按鈕,選擇終端管理員
,然後輸入如下命令:
cd C:\Windows\system32
zerotier-cli.bat join 網絡 ID
輸入後看到 200 Join OK 就表示當前設備已經加入到我們創建的這個虛擬局域網中了,這時再使用瀏覽器打開http://雲伺服器 ip:3443
,點擊 Network
選擇你創建的網絡,會看到網絡詳情列表下面就會出現一個新的設備,你可以在 Nember name
下面給他進行備註,然後勾選 Authorized
讓其加入網絡即可,稍後你就可以在 IP assignment 下看到這台設備分配的內網 IP 地址了。
macOS 系統設備的設置#
首先依舊是下載官方的 ZeroTier macOS 客戶端並進行安裝。
第二步:安裝完畢之後,使用訪達進入到目錄/Library/Application Support/ZeroTier/One
,使用此前從雲伺服器中下載的 planet
文件替換目錄下的同名文件。
第三步:打開終端,輸入如下命令重啟 ZeroTier One 客戶端:
cat
/Library/Application Support/ZeroTier/One/zerotier-one.pid |
sudo
xargs
kill
緊接著在終端中輸入如下命令加入你創建的虛擬局域網網絡:
zerotier-cli join 網絡 id
如果顯示200 join OK
則表示加入成功。
最後,我們使用瀏覽器輸入 http://雲伺服器ip:3443
訪問網絡管理後台,點擊 Network
選擇你創建的網絡,會看到網絡詳情列表下面就會出現一個新的設備,你可以在 Nember name
下面給他進行備註,然後勾選 Authorized
讓其加入網絡即可。
同步在終端輸入命令:zerotier-cli peers
可以看到加入設備的角色以及對應的網絡,如果雲伺服器對應的角色是 Planet 而剛剛加入網絡的設備角色是 LEAF 就表示基於國內網絡的虛擬局域網已經創建成功了。
群暉設備的設置#
我的主要目的是讓群暉和我隨身攜帶的筆記本電腦處於相同的局域網中,其實最重要的就是群暉了,這裡我首先將從雲伺服器中下載的planet
文件拷貝到群暉的文件目錄中,這裡我將其拷貝到 soft backup
這個文件夾下面。
接下來,我們打開群暉的套件中心,在設置
-套件來源
裡面加上「礦神源」——https://spk7.imnks.com/。然後在套件中心側邊欄中選擇「社群」,找到 ZeroTier 並選擇安裝。
套件安裝完成後先不要啟動。而是通過 SSH 客戶端鏈接群暉,輸入以下命令修復套件:
sudo sed -i 's/package/root/g' /var/packages/zerotier/conf/privilege
然後再輸入一下命令將剛才我們上傳的 planet
文件複製到套件目錄中:
mv /volume1/@appdata/zerotier/planet /volume1/@appdata/zerotier/planet.bak
cp /volume1/soft backup/planet /volume1/@appdata/zerotier/
這時再回到群暉的套件中心
啟動 ZeroTier。這時在 SSH 客戶端輸入如下命令來讓群暉加入到你自建的虛擬局域網中:
cd /var/packages/zerotier/target/bin
./zerotier-one -q join 網絡 ID
顯示 200 join OK 就表示鏈接成功,使用瀏覽器訪問http://雲伺服器ip:3443
管理後台,在網絡詳情頁面中找到新增的群暉,然後勾選 Authorized
讓其加入網絡即可。
結語#
自建 Zerotier 行星伺服器可以所有設備均在國內網絡環境下直連,相比官方根伺服器設在海外,延遲顯著降低。由於這種自建虛擬局域網對網絡協議限制較少,通過 Samba 協議創建的文件服務可直接通過內網 IP 訪問,無需配置域名即可使用 webdav 協議訪問,簡化了操作。
考慮到群暉官方 QuickConnect 連接將僅支持中繼訪問,自建 ZeroTier 虛擬局域網有效提升了互訪性能。例如,依賴 Synology Drive 的用戶如我,客戶端連接群暉的問題大大減少。
如果你也希望提升不同網絡下桌面設備與家中內網伺服器的互訪性能,可以嘗試完全自部署的 ZeroTier,或許會帶來不同的新體驗。
> 下載少數派 客戶端、關注 少數派小紅書,感受精彩數字生活 🍃
> 實用、好用的正版軟件,少數派為你呈現🚀
© 本文著作權歸作者所有,並授權少數派獨家使用,未經少數派許可,不得轉載使用。