1、關于作者
- dromara開源組織成員,dromara/neutrino-proxy專案作者
- 名稱:傲世孤塵、雨韻詩澤
- 名言:
- 扎根土壤,心向太陽,積蓄能量,綻放微光,
- 拘濁酒邀明月,借赤日暖蒼穹,喻萬物為星斗,化滄海成詩篇,
- 還生命以坦然,遺滄海以一笑,
- 微信號:yuyunshize
- Gitee: gitee.com/asgc
2、專案簡介
- 中微子代理(neutrino-proxy) 是一款基于netty的內網穿透神器,該專案采用最為寬松的MIT協議,因此您可以對它進行復制、修改、傳播并用于任何個人或商業行為,
- 演示環境:
- 地址:http://103.163.47.16:9527
- 賬號:visitor/123456
- 該開源版本針對開發者個人,不提供任何付費服務,上面提供的地址、賬號僅用于演示,已提供現成的license供大家測驗,
- 市面上基于內網穿透的常見產品有:花生殼、TeamView、cpolar等,
- 該專案的目標是打開內網穿透功能黑盒,讓更多感興趣的朋友能更簡單、低成本的掌握內網穿透技術,
- 學習、使用程序中,有任何問題都可以通過微信(通過上面的微信號,或掃描結尾的二維碼)與筆者聯系,同時,若該專案對您有所幫助,也請大家不吝轉發推薦,
3、目錄&檔案說明
├── data.db 'sqlite資料庫檔案,若未配置mysql,默認使用sqlite,專案首次啟動會自動初始化sqlite資料庫,
├── docs '專案相關的一些檔案
├── ├── Aop.MD '框架層Aop機制、使用說明
├── └── Channel.MD '內網穿透實作原理、代理實作流程說明
├── lib '專案開啟了將自動生成的類保存到本地后,運行程序中動態生成的類自動保存到此處,方便學習、除錯
├── neutrino-core '一套手寫的基于netty的框架,相當于簡易版的SpringBoot + Mybatis + xxljob,計劃后期分離為單獨開源專案維護
├── neutrino-proxy-admin '基于vue-element-admin開發的一個管理系統,用于可視化操作埠映射、代理資料實時監控
├── neutrino-proxy-client '基于netty的代理客戶端,用于和服務端互動、轉發內網資料
├── neutrino-proxy-core '代理相關的公共代碼(協議、常量)
├── neutrino-proxy-server '基于netty的代理服務端,用于和客戶段互動,將客戶端轉發的內網資料轉發至外網埠
└── todolist.MD '近期的開發計劃
復制代碼
4、專案亮點
- 性能:基于netty,天然擁有netty的高性能優勢
- 學習:除netty之外,只依賴了最基本的日志、資料庫驅動/連接池、json等jar包,代理層代碼量非常精簡,極其適合java初學者用來學習和掌握Web框架底層原理、內網穿透實作機制,
- 除錯:只需要安裝jdk8,甚至連資料庫都無需考慮,即可直接在本地運行服務端+客戶端,除錯代理流程,盡可能減少前期步驟,確保大家能更快上手,
- 測驗:針對框架層封裝(如:AOP、Web容器、ORM、調度管理等),提供了豐富的測驗代碼,
5、運行環境
以下版本均為筆者開發時實際的使用版本
Node:v13.12.0Java:1.8.0_351Mysql:8.0.31 (非必需,使用sqlite則無需考慮資料庫)Nginx:1.21.4 (非必需,可直接使用服務端專案提供的靜態資源服務)
6、使用方法
6.1、打包
可直接前往Gitee倉庫發行版頁面下載所需版本已打好的包, 若需手動打包,則可參照下面的執行命令:
# 服務端打包
mvn clean install -U -pl neutrino-proxy-server -am -Dmaven.test.skip=true
# 客戶端打包
clean install -U -pl neutrino-proxy-client -am -Dmaven.test.skip=true
# 管理后臺前端專案打包(本地環境,local改為dev則為dev環境,同時需要修改config目錄下面的環境配置)
npm run build:local
復制代碼
6.2、部署
6.2.1、服務端部署
使用常規的jar包部署方式即可,如:java -jar xxxx
6.2.2、管理后臺部署
Nginx方式部署(推薦):
server {
listen 9527;
server_name localhost;
#開啟gzip
gzip on;
#低于1kb的資源不壓縮
gzip_min_length 1k;
#壓縮級別1-9,越大壓縮率越高,同時消耗cpu資源也越多,建議設定在5左右,
gzip_comp_level 5;
#需要壓縮哪些回應型別的資源,多個空格隔開,不建議壓縮圖片.
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
#配置禁用gzip條件,支持正則,此處表示ie6及以下不啟用gzip(因為ie低版本不支持)
gzip_disable "MSIE [1-6]\.";
#是否添加“Vary: Accept-Encoding”回應頭
gzip_vary on;
location / {
root /work/projects/neutrino-proxy-server/neutrino-proxy-admin/dist;
try_files $uri $uri/ /index.html;
add_header Last-Modified $date_gmt;
}
}
復制代碼
在沒有Nginx時,為了快速體驗代理效果,可直接使用服務端專案提供的靜態資源服務, 直接將neutrino-proxy-admin打包后的檔案解壓放在neutrino-proxy-server.jar同級別目錄下即可, 例如:服務端配置的web埠為8080,則訪問http://服務端IP:8080, 則會直接決議渲染neutrino-proxy-server.jar同級別目錄下neutrino-proxy-admin/dist/index.html,
需要注意的是,使用服務端自帶的靜態資源服務時,由于框架目前未支持快取、gzip壓縮,所以訪問速度沒有使用nginx快,正式使用推薦用nginx,
6.3、配置
6.3.1、配置埠池
埠池的作用是將代理服務需要對外暴露的埠進行集中管理,方便安全組設定時統一操作,
本專案為了簡化首次配置,默認初始化資料會將9101~9120的所有埠加入埠池, 可以在服務端專案sql配置(port_pool.data.sql檔案)中自行修改初始化資料,也可以運行后在埠池管理頁面手動維護,
首次使用如果為了快速體驗,建議直接使用默認埠池,則無需任何配置,
6.3.2、配置用戶
用戶是登錄管理后臺的身份主體,同時也是持有license的身份主體,用于支持代理連接的合法性認證,
本專案為了簡化首次配置,默認初始化admin、visitor兩個用戶,默認密碼為123456, 可以在服務端專案sql配置(user.data.sql檔案)中自行修改初始化資料,也可以運行后在用戶管理頁面手動維護,
首次使用如果為了快速體驗,建議直接使用默認用戶,則無需任何配置,
6.3.3、配置License
License是客戶端連接代理服務端時所需要的唯一合法憑證,一個License同時只能被一個客戶端使用,
本專案為了簡化首次配置,默認為每個用戶初始化了一些license, 可以在服務端專案sql配置(license.data.sql檔案)中自行修改初始化資料,也可以運行后在License管理頁面手動維護,
首次使用如果為了快速體驗,建議直接使用默認License,則無需任何配置,
6.3.4、配置埠映射
埠映射是代理的基本單元,一個外網埠在同一時刻被唯一的映射到一個內網IP+埠,所有流出該外網埠的流量都轉發自對應的內網埠,同理所有流入該外網埠的流量都會轉發到對應的內網埠,
本專案為了簡化首次配置,默認為每個用戶初始化了一些埠映射,可以在服務端專案sql配置(port_mapping.data.sql檔案)中自行修改初始化資料,也可以運行后在埠映射管理頁面手動維護,
首次使用如果為了快速體驗,建議直接使用默認埠映射,則無需任何配置,
6.4、開啟代理
上述步驟完成后,就可以開始代理自己的局域網設備了,
比如現在有一個license:a123456,該license配置了一個或多個埠映射,其中包含9010到localhost:8080的映射(localhost表示代理客戶端所在主機的埠,可以換成客戶端所在局域網的任何IP),此時修改客戶端配置的服務端ip、license等啟動客戶端,就可以開啟代理了,埠映射管理對應的記錄在線狀態為"在線"則證明代理成功建立,
該license配置也可以通過客戶端啟動引數、啟動后引導式輸入、外置配置提供,為了簡化首次體驗門檻,這里直接提供一個外置配置模版:
{
"jksPath":"classpath:/test.jks",
"licenseKey":"b0a907332b474b25897c4dcb31fc7eb6",
"serverIp":"localhost",
"serverPort":9002,
"sslEnable":true
}
復制代碼
修改上述json中的licenseKey,serverIp、serverPort、sslEnabled后,保存檔案命名為.neutrino-proxy-client.json,放在客戶端當前目錄下(jar包啟動時,放在jar包同級別目錄下,idea啟動時,放在專案根目錄下),然后直接啟動客戶端,
此時通過訪問外網ip+埠,可以成功訪問內網服務,通過此方式,可以代理任何基于TCP之上的協議,如:socket、websocket、http、ftp、ssh等,
7、開發&除錯
篇幅所限,此處不便贅述管理后臺相關的開發,有vue基礎的童鞋基本都可以自行開發,服務端的初始化資料足夠除錯作業,開發程序無需單獨在管理頁面操作,
與SpringBoot專案類似,客戶端、服務端專案均由一個入口類完成整個專案的啟動,分別為ProxyClient、ProxyServer,
內置配置采用yml風格,主要涉及Http埠、靜態資源路徑、協議引數、代理服務端埠、jks證書、資料源、license等, 整個專案基于neutrino-core,風格類似于SpringBoot,筆者不喜歡因過分炫技而引入過多花式操作,因為專案的定位是個人開發者,且滿足使用的同時兼顧學習其原理的需求,基本使用方式與SpringBoot類似,盡可能降低首次學習成本,
neutrino-core專案test目錄下包含眾多核心封裝的測驗代碼,通過除錯這些代碼,能盡可能減少大家學習的障礙,
8、運行截圖
License管理:
埠映射管理:
埠池管理:
用戶管理:
9、迭代進度&未來計劃
從2022-06-16 第一個完整可用版本發布(無管理后臺、無DB,純配置實作)起,該專案已具備完整的內網穿透功能,經過后續的不斷重構,初步完成了以下迭代:
- 使用sqlite取代純配置,增加管理后臺界面,解決修改埠映射需要重新打包的問題,
- 增加mysql支持,初學時,直接默認使用sqlite,可以專注于學習代理相關細節而不必額外安裝、配置資料庫,有了自己的服務器后,可配置使用mysql,完全兼容,
- 增加埠池管理,方便服務器統一設定安全組,避免暴露的外網埠雜亂無章,
- 集成調度管理,個人版專案自帶調度管理,降低學習、使用成本,無需部署、接入其他調度服務,
- 增加簡單的游客權限限制,個人版專案無需權限管理,但是為了演示需要,同時避免游客篡改管理員資料,
- 封裝一套類似于SpringBoot + Mybatis的簡化框架,用于支撐上層代理專案,減少外部依賴,為后期范訓一個開源框架做準備,
由于筆者作業之余才能進行開發,可投入時間不固定,截至目前(2023-02),該專案2.0版本仍未發布,基于此未來的計劃如下:
- 完成2.0版本發布(還剩下報表管理、首頁圖表功能),
- 底層框架全部重構,
- 分離出一個開源框架專案,并持續維護,
- 思考或著手基于內網穿透的產品開發,包括但不限于內網穿透SaaS服務、堡壘機,
10、聯系我們
筆者時間、能力有限,且開源專案非一朝一夕之事,存在眾多問題亦在所難免,使用、學習程序中有任何問題歡迎大家與我聯系,
對專案有什么想法或者建議,可以加我微信 yuyunshize 拉交流群,或者創建issues,一起完善專案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542870.html
標籤:其他
上一篇:二分查找-力扣(Java)
