# java-Intranet-penetration **Repository Path**: huanminabc/java-intranet-penetration ## Basic Information - **Project Name**: java-Intranet-penetration - **Description**: java-netty自研内网穿透 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-11-23 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 内网穿透 ## 功能说明 1. 底层使用netty实现(所有语言中最牛逼的socket没有对手,不接受反驳),目前支持tcp协议,占时不支持udp协议 2. 支持多服务端口映射到内网端口,也就是说你可以同时访问mysql,redis,mq,es,nginx等等 3. 支持服务端宕机重启后,客户端自动重连 4. 支持动态修改端口映射配置,不需要重启服务端 **为什么说netty是最牛逼的socket** 1. netty是基于nio的,底层使用epoll实现,性能极高 2. netty是基于事件驱动的,不需要像传统的socket一样,需要不断的轮询 3. netty是基于线程池的,不需要像传统的socket一样,每个连接都需要一个线程,导致线程资源耗尽 4. netty是基于reactor模式的,不需要像传统的socket一样,每个连接都需要一个线程,导致线程资源耗尽 5. netty是基于零拷贝的,不需要像传统的socket一样,每个连接都需要一个线程,导致线程资源耗尽 6. netty业务写出来的代码,比传统的socket简洁很多,可维护性非常高,同时有非常多的可直接使用的各种处理类,比如解决粘包拆包等问题, 基本上你只需要关注业务逻辑就行了 7. 还有好多的好处,不一一列举了,有兴趣的可以自行百度,或者看看netty的源码 > 有人说使用go或者c++比java快啊,那么我只能说你不懂网络传输瓶颈是什么? > > 代码的处理速度快,但是网络传输速度慢,那么你的代码再快也没用,而且代码执行效率上java和c++差距不是很大的,而且java的代码可维护性比c++强太多了,这个是不争的事实 netty上手难度高,但是后期非常平滑, 不是写一个简单的demo跑起来就算是会了, 不信你可以写一个真真的业务就明白了,需要涉及的概念非常多的.这些概念不懂,写的时候会各种问题,而且很难排查,有时候就不会报错但是代码就是不执行,当然这不是netty的专属问题这是所有语言socket编程都要面临的问题。 ## 安装说明 ![img.png](img.png) [install](install) 目前都是开发版本,所以执行的时候会产生大量的日志,这个后期打包为prod版本的时候会自动过滤掉,所以不用担心日志太多的问题 现在还处于测试阶段,所以还没有打包成可执行文件, 需要依赖jdk环境,后期会打包成可执行文件,不需要依赖jdk环境 ## 端口说明 防止本地端口被占用,在启动服务端和客户端时,检测端口是否被占用,如果被占用,请关闭占用端口的程序或者更换端口 10333 服务端 10334 客户端 linux 查看端口占用 ```shell netstat -tunlp | grep 10333 ``` linux 杀死进程 ```shell kill -9 pid ``` windwos 查看端口占用 ```bash netstat -ano | findstr "10333" ``` windows 杀死进程 ```bash tasklist | findstr "pid" ``` ## 使用方法 为了跨平台,那么需要`自行安装JDK8和配置系统环境变量` 这个一点都不难,百度一下就行了,不同系统安装方法不同,这里不做介绍。 ### 服务端 chmod 777 start.sh stop.sh 运行start.sh,启动服务端,运行stop.sh,停止服务端 ### 客户端 > 在windwos中使用xx.bat脚本 start.bat 启动客户端,stop.bat 停止客户端 > 在linux,mac中使用xx.sh脚本 chmod 777 start.sh stop.sh 运行start.sh,启动服务端,运行stop.sh,停止服务端 ## 配置文件说明 在客户端和服务端安装目录中, 都有一个config目录: - application-config.yml 配置文件 - application-common.yml 系统配置文件 ,这个文件一般不需要修改,别手贱修改了,导致程序出了问题。 ## 端口映射文件 [db.properties](server%2Fsrc%2Fmain%2Fresources%2Fdb.properties) 端口映射文件,默认在服务端的config目录下 TIPS: key为端口映射的唯一标识,则key不能相同 , 服务端的端口不能重复, 一个服务端口只能做一个内网端口的映射 服务端如果是运行中,文件内容是不能直接修改,需要通过服务端的接口修改动态刷新到内存和文件中(待测试,因为自己占时不需要所以没有验证过,只是写出来了) 接口文档: https://apifox.com/apidoc/shared-68ff7a80-3bbf-4f73-9e6b-92dceb799377 通过PostMan或者Apifox等方式调用接口 文件格式: key=服务端端口,内网目标应用ip:端口 内网目标应用ip: 如果不是二次转发基本就是127.0.0.1 ,如果需要转发到比如虚拟机里面,那么就需要改为虚拟机ip ## 番外 本来我是没想写一个内网穿透的,是因为我现在用的开源免费的软件,他不开源了,并且下载链接也没有了,导致我没法用了, 当时考虑买一个但是我看了好多产品都太贵了,而且限制也很多。 然后我脑子一热我就想着自己写一个,然后我就开始写了,写的过程中我发现我之前的想法都太简单了,我之前的想的是客户端和服务端建立一个连接,然后用户给服务端发送一个请求, 服务端将请求转发给客户端,客户端再转发给目标服务器,然后目标服务器返回数据给客户端,客户端再返回给服务端,服务端再返回给用户,这样就实现了内网穿透。 虽然看似很简单,但是实际上有很多问题,比如客户端和服务端建立连接后,客户端和服务端之间的连接保持问题,客户端和目标应用连接保持问题, 用户和服务端连接保持问题,不同连接断开的各种情况处理 , 数据传输的时候是不是要考虑粘包拆包的问题,同时用户或者目标任何一方断开连接那么是不是需要通知另一方,多用户客户端同时访问一个端口有没有做隔离,等等好多隐藏的问题。 这个项目总共耗时2周,基本都是每周6,7写,其他时间上班都没时间, 写的时候通信架构设计有问题,导致消息能发到内网目标应用里面,但是和目标应用交互不了消息就断了, 比如mysql,redis啥的, 然后实战检查不出来了就把代码大部分都删除,从头开始设计,反反复复好几次, 最终的代码其实是花了1晚上就写出来了,周5晚上下班回家灵感来了, 找到解决办法了,熬到了4点多把全部核心代码都写出来了,然后睡一觉起来开始测试发现是好使的,然后我又在真实的场景下测试也是好使的, 到此为止我就把这个项目当做完成了,后面的功能都是锦上添花可以慢慢弄。