EntDIY-NAT基于 Netty 實現(xiàn)的 NAT 內(nèi)網(wǎng)穿透訪問軟件
EntDIY-NAT 是一個類似 Ngrok ,基于 Netty 實現(xiàn)的NAT內(nèi)網(wǎng)穿透訪問軟件。
entdiy-nat-common - 公共組件類代碼模塊
entdiy-nat-server - Server服務(wù)端代碼模塊
entdiy-nat-client - Client客戶端代碼模塊
entdiy-nat-tester - 可選模塊,作為client穿透的目標(biāo)測試服務(wù),開發(fā)調(diào)試用途
devops - 提供一套簡單的腳本和配置實現(xiàn)軟件快速部署運行
項目托管同步更新GIT資源庫:
https://github.com/xautlx/entdiy-nat
https://gitee.com/xautlx/entdiy-nat
快速開始
特別提示:以下相關(guān)命令基于Mac或Linux等環(huán)境,Windows系統(tǒng)請參考相關(guān)腳本自行轉(zhuǎn)換命令執(zhí)行。
-
獲取整個項目,并進(jìn)入項目主目錄
-
運行構(gòu)建:
mvn install
- 查閱 devops/entdiy-nat-server/application-server.yml 中相關(guān)配置參數(shù),可按照注釋含義按需調(diào)整。 如果要體驗實際效果可把entdiy-nat-server目錄整體復(fù)制到公網(wǎng)服務(wù)器,簡單體驗也可以在當(dāng)前機器直接運行。 啟動運行Server端:
./devops/entdiy-nat-server/nat-server-cli.sh restart
- 查閱 devops/entdiy-nat-client/application-client.yml 中相關(guān)配置參數(shù), 默認(rèn)穿透訪問當(dāng)前主機的22端口SSH服務(wù)和3306MySQL服務(wù),可按照注釋含義按需調(diào)整。 啟動運行Client端:
./devops/entdiy-nat-client/nat-client-cli.sh restart
- TCP協(xié)議穿透訪問測試,以 122 端口SSH訪問穿透內(nèi)容主機或者用工具以 13306 端口訪問MySQL:
ssh -p 122 [email protected]
功能列表
已實現(xiàn)功能列表:
- TCP協(xié)議穿透 - TCP協(xié)議網(wǎng)絡(luò)訪問穿透,如常見的SSH、MySQL等,當(dāng)然不局限于這些服務(wù),只要是TCP協(xié)議理論均可穿透訪問
- HTTP協(xié)議穿透 - 典型網(wǎng)頁服務(wù)HTTP協(xié)議穿透支持
- 連接池處理 - Server端與Client端的Proxy Channel采用簡化連接池實現(xiàn),提升穿透連接的初始化連接速度和效率
- Client重連機制 - 由于網(wǎng)絡(luò)異常或Server端重啟,需要Client重連機制來實現(xiàn)連接中斷后自動重連Server
- Client/Secret&Token安全認(rèn)證機制 - 基于client和secret及token機制實現(xiàn)基礎(chǔ)的訪問認(rèn)證支持
路線計劃
待實現(xiàn)功能列表:
- HTTPS協(xié)議穿透 - 典型網(wǎng)頁服務(wù)HTTPS協(xié)議穿透支持
- Server端Tunnel定義控制 - 典型的內(nèi)網(wǎng)穿透都是由Client定義隧道,但是對于一些業(yè)務(wù)場景需要由Server進(jìn)行全局的各Client端的隧道定義實現(xiàn)靈活的Server端管控支持
- SSL證書支持 - 引入SSL證書支持,提升穿透訪問數(shù)據(jù)安全性
項目故事
關(guān)于內(nèi)網(wǎng)穿透
對于內(nèi)網(wǎng)穿透本身是一個很通用的需求概念, 目前比較主流常用的有 Ngrok 和 FRP 以及 花生殼、向日葵 之類的軟件,在此不再贅述,具體可以自行網(wǎng)上搜索了解。
那內(nèi)網(wǎng)穿透這個概念和這個項目有什么關(guān)系呢?且繼續(xù)往下看:
關(guān)于物聯(lián)設(shè)備接入
以典型的人臉門禁設(shè)備接入,不同廠商提供不同SDK實現(xiàn)與設(shè)備通訊,不外乎兩種典型訪問模式:
-
在設(shè)備配置定義服務(wù)端的IP和端口,通俗講就是設(shè)備找服務(wù)器
-
在服務(wù)端配置定義設(shè)備的IP和端口,通俗講就是服務(wù)器找設(shè)備
應(yīng)該說兩種模式各有優(yōu)缺點很好理解不再細(xì)說,不同廠商一般也就是兩種模式二選一,例如海康設(shè)備就是典型的服務(wù)器找設(shè)備模式。
一般項目規(guī)模初期或是企業(yè)內(nèi)部應(yīng)用環(huán)境,服務(wù)器和各物聯(lián)設(shè)備都在一個局域網(wǎng)體系,通過廠商SDK實現(xiàn)了各種設(shè)備接入服務(wù)運作良好。 但是突然有一天出現(xiàn)需求:需要把當(dāng)前網(wǎng)絡(luò)之外的設(shè)備,諸如其他異地廠區(qū)的設(shè)備接入到總部系統(tǒng)。 例如以往通過局域網(wǎng)IP和端口訪問的海康門禁設(shè)備,突然走不通了,公網(wǎng)IP服務(wù)器如何訪問到其他網(wǎng)絡(luò)的設(shè)備成了個問題。
當(dāng)然,對于土豪企業(yè)通過VPN來解決此問題的方式不在我們討論之列。 通過向海康客服咨詢得到的反饋也是通過端口映射、為設(shè)備分配公網(wǎng)IP、或者采用海康的平臺軟件中轉(zhuǎn)對接等幾種方式, 基于公網(wǎng)IP和端口映射這類方式涉及軟硬件成本問題,一般實際可操作性不強,一般很自然的方式就會聯(lián)想到在異地設(shè)備所在局域網(wǎng)絡(luò)架設(shè)一個中轉(zhuǎn)服務(wù)來實現(xiàn)。
無論是通過廠商的中轉(zhuǎn)對接軟件,亦或是基于廠商SDK實現(xiàn)一套部署在設(shè)備所在局域網(wǎng)的中轉(zhuǎn)服務(wù)程序,我們可以俗稱為物聯(lián)網(wǎng)關(guān)程序,其部署所在硬件可俗稱物聯(lián)網(wǎng)關(guān)設(shè)備, 可以理解為是一種典型的"胖客戶端"模式,而這種模式主要問題是:
-
胖客戶端模式升級更新很麻煩,客戶端中轉(zhuǎn)程序有任何Bug修復(fù)那都需要把所有網(wǎng)關(guān)設(shè)備都手工更新一遍或者實現(xiàn)一套完善的自動更新分發(fā)機制;
-
例如原先已經(jīng)完整實現(xiàn)了海康SDK設(shè)備接入程序,但是現(xiàn)在新增胖客戶端中間層,勢必又得基于這套網(wǎng)關(guān)程序額外定制開發(fā)一套接入程序;
因此,有必要嘗試一種極簡的"瘦客戶端"模式來解決上述問題,結(jié)合作者多年Ngrok的使用經(jīng)驗,感覺以內(nèi)網(wǎng)穿透的概念來實現(xiàn)這個"瘦客戶端"是一個比較合適的選擇: 服務(wù)端以內(nèi)網(wǎng)穿透的方式訪問設(shè)備,"感覺上"就好像是之前連接局域網(wǎng)設(shè)備一樣, 客戶端唯一做的事情就是實現(xiàn)內(nèi)網(wǎng)穿透通訊數(shù)據(jù)轉(zhuǎn)發(fā),不做任何業(yè)務(wù)處理,程序穩(wěn)定無需頻繁更新, 同時直接沿用原先已成型局域網(wǎng)設(shè)備接入程序,無需客戶端或服務(wù)端新增定制接入開發(fā)。
為啥重復(fù)造輪子呢?
既然上面已經(jīng)有類似這樣的內(nèi)網(wǎng)穿透的成熟軟件,為啥又重復(fù)造個輪子呢?原因如下:
-
諸如開源版本Ngrok基本都是以Client端定義Tunnel穿透隧道,而從上述業(yè)務(wù)背景來看,一般是需要從Server服務(wù)端集中管理設(shè)備穿透配置信息, 以及后期業(yè)務(wù)擴展支持更多高級管理特性,有必要定制一個持續(xù)可維護(hù)的項目;
-
主流開源的ngrok、frp等都是基于go語言的,作為一個Java技術(shù)棧人員,面對Netty的火熱,也算是乎手癢癢造就了這個項目 :)
因此,如果你是對于Java/Netty感興趣、對于內(nèi)網(wǎng)穿透感興趣,可以關(guān)注探討。 當(dāng)然,項目時間不長,還沒有Ngrok和FRP之類軟件的完整和成熟,請注意斟酌評估應(yīng)用風(fēng)險。
