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.0
  • Java:1.8.0_351
  • Mysql: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项目相似,客户端、服务端项目均由一个进口类完结整个项意图发动,分别为ProxyClientProxyServer

内置装备采用yml风格,主要触及Http端口、静态资源途径、协议参数、署理服务端端口、jks证书、数据源、license等。 整个项目根据neutrino-core,风格相似于SpringBoot。笔者不喜欢因过分炫技而引入过多花式操作,因为项意图定位是个人开发者,且满意运用的一起统筹学习其原理的需求。根本运用方法与SpringBoot相似,尽可能下降初次学习成本。

neutrino-core项目test目录下包含很多中心封装的测验代码,经过调试这些代码,能尽可能削减我们学习的妨碍。

8、运转截图

License办理:

【新晋开源项目】内网穿透神器[中微子代理] 加入 Dromara 开源社区

端口映射办理:

【新晋开源项目】内网穿透神器[中微子代理] 加入 Dromara 开源社区

端口池办理:

【新晋开源项目】内网穿透神器[中微子代理] 加入 Dromara 开源社区

用户办理:

【新晋开源项目】内网穿透神器[中微子代理] 加入 Dromara 开源社区

9、迭代进度&未来方案

2022-06-16 第一个完好可用版别发布(无办理后台、无DB,纯装备完结)起,该项目已具有完好的内网穿透功用。经过后续的不断重构,开始完结了以下迭代:

  • 运用sqlite取代纯装备,添加办理后台界面。处理修正端口映射需求重新打包的问题。
  • 添加mysql支撑。初学时,直接默许运用sqlite,能够专心于学习署理相关细节而不用额外安装、装备数据库。有了自己的服务器后,可装备运用mysql,彻底兼容。
  • 添加端口池办理。便利服务器统一设置安全组,避免暴露的外网端口杂乱无章。
  • 集成调度办理。个人版项目自带调度办理,下降学习、运用成本。无需布置、接入其他调度服务。
  • 添加简略的游客权限约束。个人版项目无需权限办理,可是为了演示需求,一起避免游客篡改办理员数据。
  • 封装一套相似于SpringBoot + Mybatis的简化结构,用于支撑上层署理项目,削减外部依靠,为后期孵化一个开源结构做准备。

因为笔者工作之余才干进行开发,可投入时刻不固定。截至目前(2023-02),该项目2.0版别仍未发布,根据此未来的方案如下:

  • 完结2.0版别发布(还剩下报表办理、主页图表功用)。
  • 底层结构全部重构。
  • 别离出一个开源结构项目,并持续保护。
  • 思考或着手根据内网穿透的产品开发,包含但不限于内网穿透SaaS服务、堡垒机。

10、联系我们

笔者时刻、才能有限,且开源项目非一朝一夕之事,存在很多问题亦在所难免。运用、学习进程中有任何问题欢迎我们与我联系。

对项目有什么想法或许主张,能够加我微信 yuyunshize 拉沟通群,或许创立issues,一起完善项目