分享一個基於 netty 的 java 開源項目

1、簡介

中微子代理(neutrino-proxy)是一個基於 netty 的、開源的 java 內網穿透項目。遵循 MIT 許可,因此您可以對它進行複製、修改、傳播並用於任何個人或商業行為。

2、項目結構

  • neutrino-proxy
    • neutrino-core 與代理無關的基礎封裝
    • neutrino-proxy-core 與代理相關的公共常量、編解碼器
    • neutrino-proxy-client 代理客戶端項目
    • neutrino-proxy-server 代理服務端項目
    • neutrino-proxy-admin 代理監控項目(暫時空缺)

3、運行

3.1、使用 keytool 工具生成 ssl 證書,若不需要 ssl 加密可跳過

keytool -genkey -alias test1 -keyalg RSA -keysize 1024 -validity 3650 -keypass 123456 -storepass 123456 -keystore  "./test.jks"

3.2、修改服務端配置(application.yml)

application:
  name: neutrino-proxy-server

proxy:
  protocol:
    max-frame-length: 2097152
    length-field-offset: 0
    length-field-length: 4
    initial-bytes-to-strip: 0
    length-adjustment: 0
    read-idle-time: 60
    write-idle-time: 40
    all-idle-time-seconds: 0
  server:
    # 服務端埠,用於保持與客戶端的連接,非SSL
    port: 9000    
    # 服務端埠,用於保持與客戶端的連接,SSL,需要jks證書文件,若不需要ssl支援,可不配置
    ssl-port: 9002
    # 證書密碼
    key-store-password: 123456
    key-manager-password: 123456
    # 證書存放路徑,若不想打進jar包,可不帶classpath:前綴
    jks-path: classpath:/test.jks
  # license配置, 客戶端連接時需要用這個進行校驗
  license:
    # license數為3表示用該license連接的客戶端最多可代理3個埠,-1為不限
    79419a1a8691413aa5e845b9e3e90051: 3
    9352b1c25f564c81a5677131d7769876: 2

3.3、啟動服務端

fun.asgc.neutrino.proxy.server.ProxyServer

3.4、修改客戶端配置

application:
  name: neutrino-proxy-client

proxy:
  protocol:
    max-frame-length: 2097152
    length-field-offset: 0
    length-field-length: 4
    initial-bytes-to-strip: 0
    length-adjustment: 0
    read-idle-time: 60
    write-idle-time: 30
    all-idle-time-seconds: 0
  client:
    # ssl證書密碼
    key-store-password: 123456
    # ssl證書存放位置
    jks-path: classpath:/test.jks
    # 服務端ip,若部署到伺服器,則配置伺服器的ip
    server-ip: localhost
    # 服務端埠,若使用ssl,則需要配置為服務端的"ssl-port"
    server-port: 9000
    # 是否啟用ssl,啟用則必須配置ssl相關參數
    ssl-enable: false

3.5、準備代理資訊配置文件 config.json

{
    "environment": "我的Mac",
    "clientKey": "79419a1a8691413aa5e845b9e3e90051",  # 對應服務端配置license中的key
    "proxy": [
        {
            "serverPort": 9100,         # 外網伺服器對外暴露的埠
            "clientInfo": "127.0.0.1:3306" # 需要代理的本地埠(mysql)
        },
        {
            "serverPort": 9101, # 外網伺服器對外暴露的埠
            "clientInfo": "rm-xxxx.mysql.rds.aliyuncs.com:3306" # 代理外網埠本身無意義,僅供測試
        },
        {
            "serverPort": 9102, # 外網伺服器對外暴露的埠
            "clientInfo": "127.0.0.1:8080" # 需要代理的本地埠(http)
        }
    ]
}

3.6、啟動客戶端

fun.asgc.neutrino.proxy.client.ProxyClient 默認情況下,客戶端會載入當前目錄下的 config.json 文件作為代理配置,可通過命令行參數指定,如:java -jar neutrino-proxy-client.jar/xxx/proxy.json

4、未來迭代方向

  • 優化程式碼、增強穩定性
  • 服務端增加管理頁面,提供報表、授權、限流等功能
  • 從項目中分離、孵化出另一個開源項目 (neutrino-framework)

5、聯繫我們

微信: yuyunshize