注册 X
提交 注:点击提交后系统会发送邮件到邮箱验证!(仅支持中国大陆邮箱)
我已阅读并同意 服务条款
首页 > IT技术笔记 > 查看笔记

基于JAVA的内网穿透工具的实现

附件下载:

natcross2-2.1.zip

natcross-boot-client-master.zip

natcross-boot-master.zip

内网穿透的说明

内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。

NAT技术

NAT技术是通过将专用的网络地址转换为公用地址,从而对外隐藏了内部管理的IP地址。这样,通过在内部使用非注册的IP地址,并将它们转换为一小部分外部注册的IP地址,从而减少了IP地址注册的费用以及节省了越来越缺乏的地址空间。同时,这也隐藏了内部网络结构,从而降低了内部网络受到攻击的风险。NAT的功能就是在内部网络的私有地址需要与外部通信时,把内部私有地址转换成合法的全局IP地址。NAT可以在两个方向上隐藏地址,为了支持这种方案,NAT在两个方向上都要翻译原地址和目的地址。NAT的功能通常被集成到路由器、防火墙等设备中。NAT设备维护一个映射表,用它来实现全局到本地和本地到全局的地址转换 [2] 。
NAT有三种类型:静态NAT(StaticNAT)、动态地址NAT(PooledNAT)、网络地址端口转换NAPT(Port-LevelNAT)。
其中,网络地址端口转换NAPT(NetworkAddressPortTranslation)则是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。
NAPT是使用最普遍的一种转换方式,在HomeGW中也主要使用该方式。它又包含两种转换方式:SNAT和DNAT。
(1)源NAT(SourceNAT,SNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。
(2)目的NAT(DestinationNAT,DNAT):修改数据包的目的地址。DestinationNAT刚好与SNAT相反,它是改变第一个数据懈的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。

SOCKET介绍

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
内容过多,这里不在过多的赘述,《Socket的学习(一)什么是Socket?》这篇有很全面的介绍,包括TCP/IP网络协议的介绍,这也是实现网络穿透的一个保证,即不考虑网络连接情况将数据内容进行完全转发,协议的解析等工作与直连方式不变。 在不考虑网络连接带来的IP变化的情况,可以将内容进行完全转发,协议的解析等工作与直连方式不变;也可以将协议通过解析后,再根据目标的协议进行组装,如HTTPS协议转HTTPS协议。

穿透思路

因NAT网内CLIENT可以正常连接到SERVER端,并且能够保持一段时间的长连接,则由CLIENT发起连接,建立SOCKET对,在SERVER收到外部请求时,可以通过已经建立好的SOCKET将数据传输给CLIENT,CLIENT使用相同的方式将数据发送给指定的网络程序,网络程序回发数据后则按原路返回给请求方。

内网穿透时序图

natcross2

内网穿透工具

natcross是做什么的?

  • 需要自己提供硬件支持、部署的内网穿透工具

  • 提供TCP协议类型的内网穿透服务,包括但不限于http(s)、数据库连接、ssh等协议

  • 支持https协议转http协议与应用交互方式

  • 支持无加密、控制端口加密交互、数据加密交互方式

  • 主要服务场景,需要将内网的应用开放到公网,如微信小程序开发调试、支付回调等

  • 支持HTTP根据host进行反向代理;目标依然是内网应用,只是可以根据HTTP协议header中的host字段区分选择目标应用(注意:只是有人提出来了HTTP监听统一端口并用域名访问的问题,并且有做的价值才补充的该功能;没做负载功能,这个是内网穿透,不是nginx,更不建议直接用在生产上,需要负载的可以自己去实现)

打包使用





		        
服务端-ServerApp打包:

修改ServerApp.java中serviceIp为公网服务器的IP

mvn clean compile package -PserverApp
客户端-ClientApp打包:

mvn clean compile package -PclientApp
		      

安装

  1. 需要一台可在公网访问的机器,并将控制端口(默认 servicePort 10010)、数据端口(如tomcat,开放公网 listenPort 8081端口,外网连接时要对应数据端口8081)开放出来

  2. 将ServerApp.jar包放在公网可访问的机器并运行,打包前需要修改serviceIp为公网服务器的IP

  3. 将clientApp为入口进行运行,destIp:destPort为要开放的内网应用,如本地的tomcat(127.0.0.1:8080)

  4. 用浏览器访问serviceIp:listenPort便可以访问到内网的tomcat

参数解释

ServerApp:

字段解释
serviceIp公网服务器的IP
servicePort服务端的控制端口,主要用来与客户端进行指令交互
listenPort服务端的监听端口,也就是部署完成后,在外网访问 serviceIp:listenPort 的方式对内网应用进行访问
aesKey交互密钥key,保证数据的秘密性,可以查看 SecretInteractiveModel.java 中的fullMessage和checkAutograph中确认密钥的使用方式。
如果你使用了secretAll方式进行部署,这个key还是数据加密的key,可以在 SecretPassway.java 中确认密钥的使用方式
tokenKey交互签名key,签名同aesKey
sslKeyStorePathssl证书的路径,默认方法只支持pkcs12的证书格式,使用这个证书可以做到https协议转http协议
sslKeyStorePassword证书密码
createServerSocket创建socket的方式,主要针对普通socket和sslSocket的方式进行封装,结合ssl证书使用

ClientApp:

字段解释
destIp要开放到公网的内网应用所在机器的IP
destPort要开放到公网的内网应用的端口
serviceIp复用ServerApp的字段,所以要保证部署包和内网包的参数一致
servicePort复用ServerApp的字段,所以要保证部署包和内网包的参数一致
listenPort复用ServerApp的字段,所以要保证部署包和内网包的参数一致
aesKey复用ServerApp的字段,所以要保证部署包和内网包的参数一致
tokenKey复用ServerApp的字段,所以要保证部署包和内网包的参数一致

内网穿透思路

因NAT网内CLIENT可以正常连接到SERVER端,并且能够保持一段时间的长连接,则由CLIENT发起连接,建立SOCKET对,在SERVER收到外部请求时,可以通过已经建立好的SOCKET将数据传输给CLIENT,CLIENT使用相同的方式将数据发送给指定的网络程序,网络程序回发数据后则按原路返回给请求方。


1、natcross2-2.1.zip

2、natcross-boot-master.zip

3、natcross-boot-client-master.zip

natcross2

这是核心码的实现,ServerApp运行在服务端,ClientApp运行在内网,便可以进行了,里面有个无加密的配置方式、交互加密、交互和隧道加密的方式,可以根据需要选择运行。

感兴趣的同学只选择natcross2进行使用即可,natcross-boot、natcross-boot-client是一种快捷的封装,主要是为团队方便管理写的管理程序,不用细研究,所有值得看的都在natcross2中了

以上三个分别是核心码、共用的服务端、共用的客户端。
核心码即主要代码,这个库已经可以做到内网穿透的功能业务,ServerApp运行在服务端,ClientApp运行在内网,便可以进行了,这个核心码已经支持了多端口的监听,客户端创建多个ClientControlThread便可以实现多映射的穿透。
公用服务端,是针对公司、团队的环境进行的WEB管理方式的封装,使用spring-boot作为框架进行部署,登录后便可以自由添加修改端口情况。使用sqlite进行数据持久化。

初始化密码,用户名:admin 密码:123456



web管理方式


共用客户端,则是和公用服务端配套的设置,可以将客户端部署到一台内网机器上,客户端会定时获取服务端的设置来建立自己的客户端线程,从而实现自由定制化。



 打赏        分享



评论

邮箱: 昵称: