我有一臺臺式機菱父,配置比較高,放在家里官辽,有一臺筆記本隨身帶著同仆。由于個人工作和興趣原因亩钟,我經(jīng)常在臺式機上使用虛擬機創(chuàng)建不同的開發(fā)環(huán)境清酥。如果是在同一個局域網(wǎng)中蕴侣,一般不存在這個問題,使用“橋接模式”和主機共享一個 IP 地址段辱志,我就可以在筆記本上通過 IP 直接訪問這些虛擬機上的服務(wù)揩懒。
如果出門了呢挽封?這個時候就不能通過 IP 直接連接了,需要借助于內(nèi)網(wǎng)傳統(tǒng)的工具智亮。之前我一直都用的是花生殼和 ngrok阔蛉,花生殼有 2 個免費映射的額度癞埠,ngrok 只有 1 個,相當(dāng)不夠用遭笋,我記得有一段時間我同時做三個不同事情的開發(fā)瓦呼,使用三套不同的開發(fā)環(huán)境,那個時候人還在外地磨澡,導(dǎo)致我要頻繁刪除稳摄、創(chuàng)建花生殼和 ngrok 的映射饲宿。
有沒有一個可以不用“額外付費”的內(nèi)網(wǎng)穿透工具呢瘫想?因為我后面要提到的開源工具,需要用到一個公網(wǎng)的服務(wù)器作為轉(zhuǎn)發(fā)减噪。當(dāng)然我手上有一個云服務(wù)器筹裕,對我來說就不算“額外付費”窄驹,但是對于沒有開通云服務(wù)器的朋友來說乐埠,可能還是需要對比一下方案成本的,這里就不再詳述豪治。
ztm
ztm(https://github.com/flomesh-io/ztm)是一個基于 pipy(https://github.com/flomesh-io/pipy)構(gòu)建的網(wǎng)絡(luò)基礎(chǔ)設(shè)施:
ZTM is an open source network infrastructure software for running a decentralized network. It is built upon HTTP/2 tunnels and can run on any sort of IP networks such as LANs, containerized networks and the Internet, etc.
根據(jù) Github 倉庫上的 README 示例:
Data Center
+-------------------------------------------+
| Hub |
| (state in ~/.ztm/ztm-hub.db) |
+-------------------------------------------+
HTTPS | Port 8888 HTTPS | Port 8888
| |
------------|---------------------------------|--------------
| Firewall |
------------|---------------------------------|--------------
| |
| Internet |
| |
---------------------------- | ----------------------------
Firewall | Firewall
---------------------------- | ----------------------------
| | |
| | |
+--------------------------+ | +--------------------------+
| Agent @ Home | | | Agent @ Workplace |
| (state in ~/.ztm/ztm.db) | | | (state in ~/.ztm/ztm.db) |
+--------------------------+ | +--------------------------+
|
我設(shè)計的實驗方案是創(chuàng)建兩臺虛擬機,一臺裝 Windows 10掩浙,一臺裝 Ubuntu 22.04,這兩臺電腦不屬于一個網(wǎng)段厨姚,不能直接訪問谬墙。首先我們準備實驗環(huán)境,大家可以根據(jù)自己的需求進行修改:
- 云服務(wù)器:Ubuntu 22.04部默,作為 ztm hub傅蹂,用來轉(zhuǎn)發(fā)流量算凿;
- 筆記本:要求能訪問互聯(lián)網(wǎng)氓轰,ztm agent 節(jié)點,作為 ztm mesh 的 root 用戶请敦,用來對其他 ztm agent 簽發(fā)證書储玫;
- Ubuntu 虛擬機(IP:192.168.2.137):Ubuntu 22.04撒穷,ztm agent 節(jié)點裆熙,用來部署測試服務(wù)入录;
- Windows 虛擬機(IP:192.168.2.138):Windows 10,ztm agent 節(jié)點凡桥,用來訪問測試服務(wù)缅刽。
這里說明一下,我在配置虛擬機網(wǎng)絡(luò)設(shè)置的時候迟蜜,都用的 NAT 模式啡省,沒配出來互相獨立的網(wǎng)段,導(dǎo)致這兩臺電腦還是屬于一個網(wǎng)段微姊,所以我直接在 Ubuntu 虛擬機上使用以下命令分预,對 Windows 虛擬機的 IP 進行了限制訪問:
sudo iptables -A INPUT -s 192.168.2.138 -j DROP
這樣 Windows 虛擬機就無法直接訪問 Ubuntu 虛擬機了笼痹,可以使用 ping 192.168.2.137
在命令前后測試一下,可以使用 sudo iptables -D INPUT -s 192.168.2.138 -j DROP
進行恢復(fù)晴裹。
我們首先在 ztm 的 Github 頁面上下載安裝包涧团,注意需要從 Actions 頁面上下載经磅,這里才是最新版预厌,不要從 Releases 頁面下載,下載 windows-build
:
云服務(wù)器
在 Ubuntu 22.04 我們采用源碼編譯苗沧,因為上面的 linux-build
在 Ubuntu 22.04 上運行會碰到一個 GLIBC 版本問題待逞,其他編譯環(huán)境請參考Build 文檔:
apt update
apt install clang cmake npm
git clone https://github.com/flomesh-io/ztm.git
cd ztm
./build.sh
我們把編譯好的 ztm
二進制文件放到 PATH 路徑下识樱,運行以下命令啟動 ztm hub:
sudo /home/admin/bin/ztm start hub --listen 0.0.0.0:8888 --names {IP 或者 Domain}:8888 --permit root.json
這里注意它會在當(dāng)前運行命令的目錄下生成一個 root.json 文件牺荠,使用該文件加入到這個 Mesh(網(wǎng)格) 的節(jié)點擁有這個 Mesh 的 root 權(quán)限,也就是可以邀請用戶灶壶。
筆記本
我這里使用的是 Mac驰凛,我也是使用源碼編譯方式得到 ztm 命令行担扑,我們把上一步從云服務(wù)器啟動 ztm hub 生成的 root.json 文件拷貝到本地,首先需要啟動 ztm agent:
ztm start agent
我們打開瀏覽器胚宦,訪問 http://localhost:7777
枢劝,agent 服務(wù)默認監(jiān)聽在 7777 端口您旁。我們點擊歡迎界面的 Join Mesh 按鈕填寫信息轴捎,網(wǎng)格字段填寫方便你識別的網(wǎng)格名稱,端點字段填寫方便你識別的端點名稱侦锯,選擇上一步的 root.json 作為右側(cè)的許可證率触,點擊保存:
點擊端點頁面的右上角,進行到證書簽發(fā)穴张,后續(xù)需要將兩臺虛擬機(Windows 和 Ubuntu)生成的 identity 發(fā)送給 root 用戶進行簽發(fā),下載簽發(fā)后的文件發(fā)送到對應(yīng)的 agent 節(jié)點:
Windows 虛擬機
在 Windows 上直接使用 ztm 提供的安裝包(前面提到的 windows-build
)玻驻,推薦把安裝 ztm 的目錄加入到 PATH 環(huán)境變量中:
啟動 ztm户辫,點擊右上角下載 identity 文件渔欢,發(fā)送給 root 用戶進行上一步的簽發(fā)瘟忱,得到 permit 文件:
在進行證書簽發(fā)的時候访诱,需要配置用戶名,這個是一個邏輯的用戶九榔,一個用戶可以擁有多個端點涡相,這個端點可以理解為進程,因為一臺物理機或虛擬機上可以運行多個端點攻旦,跑不同的 Mesh牢屋,這個在后續(xù)文章中會深入解釋這些概念槽袄。
Ubuntu 虛擬機
Ubuntu 虛擬機的操作也與 Windows 虛擬機類似遍尺,啟動 ztm agent,下載 identity迂苛,發(fā)給 root 用戶簽名三幻,拿到簽名后的 permit 文件呐能,使用該文件加入 Mesh。
經(jīng)過一番操作之后首妖,回到我的筆記本上爷恳,這個時候我們能看到的端點應(yīng)該如下:
然后我們在 Ubuntu 虛擬機啟動一個監(jiān)聽在 127.0.0.1:5000 的服務(wù)舌仍,注意此時 Windows 虛擬機是無法直接訪問 Ubuntu 虛擬機的。
內(nèi)網(wǎng)穿透
在 Windows 虛擬機上通過應(yīng)用頁面的隧道進行配置:
入口選擇 leo-vm-windows灌曙,監(jiān)聽 127.0.0.1:5001在刺,出口選擇 leo-vm-ubuntu蚣驼,目標(biāo) 127.0.0.1:5000相艇。
訪問成功坛芽!