掌桥专利:专业的专利平台
掌桥专利
首页

一种内网穿透系统

文献发布时间:2023-06-19 10:21:15


一种内网穿透系统

技术领域

本发明涉及计算机网络技术领域,具体涉及一种基于Java NIO技术实现的内网穿透的系统。

背景技术

局域网就是局部地区形成的一个区域网络,是一种私有网络。在局域网网关路由器没有进行映射的情况下外部网络是无法直接连接到局域网内部的设备。现生活中绝大多数公司或个人设备都是处于多层局域网之中,内部网络外网是无法直接访问的。在生活中工作中我们经常有远程访问内部网络的需求,专线专网、VPN专网是常用的解决方案,但是对于个人或是小公司来说,专线专网、VPN的架设成本通常是难于承受的。

因此,如何提供一种成本较低的能够远程访问内部网络的技术方案,成为本领域技术人员亟待解决的技术问题之一。

发明内容

有鉴于此,本发明实施例提供一种内网穿透系统,以提供一种成本较低的能够远程访问内部网络的技术方案。

为实现上述目的,本发明实施例提供如下技术方案:

一种内网穿透系统,包括:

中继服务器和中继客户端,所述中继服务器应位于外网中,所述中继客户端位于内网中;

所述中继服务器用于暴露内网ip端口,获取外网用户发送的网络请求指令,所述网络请求指令中具有目标内网iP端口,基于所述网络请求指令建立所述中继服务器与中继客户端之间的中继通道;当获取到所述外网用户发送的请求数据指令后,将所述请求数据指令通过所述中继通道发送至所述中继客户端,通过所述中继通道获取中继客户端发送的目标资源服务器的响应数据,将所述响应数据发送给所述外网用户;

所述中继客户端,用于建立内网资源服务器与所述中继客户端之间的资源通道,在通过所述中继通道获取到所述请求数据指令后,通过所述资源通道将所述请求数据指令发送给内网资源服务器,并获取内网资源服务器针对所述请求数据指令产生的响应数据,通过所述中继通道将所述响应数据发送给所述中继服务器。

可选的,上述内网穿透方法中,所述中继客户端在获取到所述响应数据以后,还用于:

关闭所述网资源服务器与所述中继客户端之间的资源通道;

将所述响应数据发送给所述中继服务器之后,还用于:

关闭所述中继服务器与中继客户端之间的中继通道。

可选的,上述内网穿透方法中,所述中继服务器在获取外网用户发送的网络请求指令,基于所述网络请求指令建立所述中继服务器与中继客户端之间的中继通道时,具体用于:

在获取到用于外网用户发送的网络请求指令时,缓存所述中继服务器与外网用户之间的用户连接通道,通过所述继服务器与中继客户端之间的长连接通道,向所述中继客户端发送中继通道的建立消息,建立所述中继服务器与中继客户端之间的中继通道,并进行安全验证。

可选的,上述内网穿透方法中,所述中继服务器还用于:建立所述用户连接通道与所述中继通道之间的第一映射关系;

所述中继服务器将所述响应数据发送给所述外网用户时,具体用于:

确定获取到的响应数据对应的中继通道;

基于所述第一映射关系确定与所述中继通道对应的用户连接通道;

通过所述用户连接通道将所述响应数据发送给所述外网用户。

可选的,上述内网穿透方法中,所述中继客户端还用于:

建立所述资源通道与所述中继通道之间的第二映射关系;

所述中继客户端在通过所述中继通道获取到所述请求数据指令后,通过所述资源通道将所述请求数据指令发送给内网资源服务器时,具体用于:

确定获取到请求数据指令中的中继通道;

基于所述第二映射关系确定与所述中继通道相匹配的资源通道;

通过所述资源通道将所述请求数据指令发送给内网资源服务器;

所述中继客户端在获取内网资源服务器针对所述请求数据指令产生的响应数据,通过所述中继通道将所述响应数据发送给所述中继服务器时,具体用于:

确定获取到响应数据的资源通道;

基于所述第二映射关系确定与所述资源通道相匹配的中继通道;

通过所述中继通道将所述响应数据发送给所述中继服务器。

可选的,上述内网穿透方法中,所述基于所述网络请求指令建立所述中继服务器与中继客户端之间的中继通道,具体为:

基于所述网络请求指令中包含的目标内网iP端口建立所述中继服务器与中继客户端之间的中继通道;

所述中继客户端建立内网资源服务器与所述中继客户端之间的资源通道时,具体用于:

基于所述网络请求指令中包含的目标内网ip端口,建立内网资源服务器与所述中继客户端之间的资源通道。

可选的,上述内网穿透方法中,所述中继服务器和中继客户端为基于java系统开发的服务器和客户端。

可选的,上述内网穿透方法中,所述中继客户端,还用于:

向所述中继服务器发送内网ip端口调节指令;

所述中继服务器在获取到所述内网ip端口调节指令时,依据所述调节指令调节所述中继服务器暴露的内网ip端口。

所述中继服务器集成于外网服务器中。

基于上述技术方案,本发明实施例提供的上述方案,通过中继服务器获取外网用户的网络请求指令,基于所述网络请求指令建立所述中继服务器与中继客户端之间的中继通道,当获取到所述外网用户发送的请求数据指令后,将所述请求数据指令通过所述中继通道发送至所述中继客户端,中继客户端在建立内网资源服务器与所述中继客户端之间的资源通道,在通过所述中继通道获取到所述请求数据指令后,通过所述资源通道将所述请求数据指令发送给内网资源服务器,并获取内网资源服务器针对所述请求数据指令产生的响应数据,所述中继服务器通过所述中继通道获取中继客户端发送的目标资源服务器的响应数据,将所述响应数据发送给所述外网用户,实现了外网用户发送的数据以及资源服务器的响应数据的中继,使得外网用户能够访问内网资源,且方案实施成本较低。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为应用本方案的内网穿透系统的网络框架示意图;

图2为本申请实施例提供的内网穿透系统的结构示意图;

图3为本申请实施例公开的内网穿透系统中各个装置之间的数据交互流程示意图;

图4为本申请实施例公开的内网穿透系统中,中继服务器端与所述中继客户端之间的安全校验流程示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

首先,对本申请所述用到的技术用于进行说明:

Java NIO。Java作为服务端最流行的开发语言之一,其具有跨平台、高性能以及良好的网络编程接口,适合用于编写网络工具软件。Java NIO(non-blocking IO)是从Java1.4版本开始引入的一个新的IO API,JAVA NIO具有面向缓存非阻塞和多路复用等特点。

面向缓冲区。面向缓存也就是数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。

非阻塞的。Java IO的各种流是阻塞的。这意味着,当一个线程对socket连接进行多或写时是阻塞的直达读写完成,该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,一个线程从某通道发送请求读写数据,可读或可写将通道中的数据读取到缓存或是将缓存中的数据写入通道中,不可读写或是数据不够直接进行下一个操作,而不是一直阻塞等待通道可以读写或是数据写完后才进行下一步。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道。NIO适用于多条连接、多次请求,即需要多个线程多次操作,使用NIO可以减少创建线程和线程频繁切换的消耗。

多路复用。Java NIO使用了Windows、Linux系统底层功能select/poll/epoll,通过Selector能实现对多个连接通道的事件进行监控,同时通过对Selector的实时轮循可以实现对多个通道操作和功能复用。

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区),Selector。而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

下面对本申请所公开的技术方案进行说明。

本发明的核心思路是使用java nio技术构建一个socket数据中继软件系统,将该系统加载于中继服务器和中继客户端中,通过该中继服务器和中继客户端实现内网穿透功能。由此,可见,Socket数据中继提供包括两个基础部分,中继服务端和中继客户端,中继服务端部署在外网服务器上,中继客户端部署到需要访问的资源且可以访问外网的局域网中,其框架结构图如图1所示。

参见图2,图2为本申请实施例公开的内网穿透系统的结构示意图;本申请实施例公开的内网穿透系统,可以包括:

中继服务器100和中继客户端200,所述中继服务器100应位于外网中,所述中继客户端200位于内网中;

参见图3,图3为中继服务器100和中继客户端200之间的数据交流过程示意图;

在本方案中,所述中继服务器100用于暴露内网ip端口,外网用户在访问内网时,会发送针对目标内网ip端口的网络请求,所述网络请求指令中具有目标内网iP端口,所述中继服务器100获取所述外网用户发送的网络请求指令,基于所述网络请求指令建立所述中继服务器100与中继客户端200之间的中继通道;当获取到所述外网用户发送的请求数据指令后,将所述请求数据指令通过所述中继通道发送至所述中继客户端200,通过所述中继通道获取中继客户端200发送的目标资源服务器的响应数据,将所述响应数据发送给所述外网用户。

所述中继客户端200,用于建立内网资源服务器与所述中继客户端200之间的资源通道,在通过所述中继通道获取到所述请求数据指令后,通过所述资源通道将所述请求数据指令发送给内网资源服务器,并获取内网资源服务器针对所述请求数据指令产生的响应数据,通过所述中继通道将所述响应数据发送给所述中继服务器100。

在本申请实施例公开的技术方案中,所述中继服务器暴露用户访问的端口、socket数据中继端口以及消息端口;所述中继客户端主动连接所述中继服务器的消息端口,并与之建立长连接通道,用于实时发送心跳数据和接收来中期自服务器端的消息;当外网用户访问中继服务器时,中继服务器通过所述长连接通道发送对接消息到中继客户端,用于中继客户端与中继服务器建立一条专门的通道用于传输数据,该通道记为中继通道。中继通道建立后中继服务器端将用户的请求数据指令通过中继通道发送到中继客户端,中继客户端再将数据发送到资源目标资源服务器上,实现请求数据的中继。再而中继客户端将读取到的目标资源服务器响应数据通过中继通道发送到中继服务器,中继服务器端再将响应数据发送给外网用户,实现响应数据的中继。进而实现外部网络访问内部数据(内网穿透)的功能。

参见图3,为了保证内网数据的安全性,在数据交互完成以后,还需要关闭中继通道和所述资源通道,即,上述方案中,所述中继客户端200在获取到所述响应数据以后,还用于:

关闭所述网资源服务器与所述中继客户端200之间的资源通道;

将所述响应数据发送给所述中继服务器100之后,还用于:

关闭所述中继服务器100与中继客户端200之间的中继通道。

在本申请另一实施例公开的技术方案中,为了保证内网数据的安全性,在建立所述中继通道时,还需要进行安全验证,即,上述方案中,所述中继服务器100在获取外网用户发送的网络请求指令,基于所述网络请求指令建立所述中继服务器100与中继客户端200之间的中继通道时,具体用于:

在获取到用于外网用户发送的网络请求指令时,缓存所述中继服务器100与外网用户之间的用户连接通道,通过所述继服务器与中继客户端200之间的长连接通道,向所述中继客户端200发送中继通道的建立消息,所述中继客户端200在获取到该消息后,连接所述中继服务器的中继端口,建立所述中继服务器100与中继客户端200之间的中继通道,并通过所述中继通道发送对接数据和安全认证数据,进行安全验证。

参见图3,在本申请另一实施例公开的技术方案中,所述中继服务器100还用于:建立所述用户连接通道与所述中继通道之间的第一映射关系,即,根据所述对接消息,将用户连接通道与所述中继客户端连接对接端口的通道进行映射,在本方案中,将该通道记为中继通道;

所述中继服务器100将所述响应数据发送给所述外网用户时,具体用于:

确定获取到的响应数据对应的中继通道;

基于所述第一映射关系确定与所述中继通道对应的用户连接通道;

通过所述用户连接通道将所述响应数据发送给所述外网用户。

在本方案中,通道之间的映射关系可以采用NIO多路复用循环技术来实现,获取到一条数据时,采用NIO多路复用循环技术读取所缓存的数据对应的发送通道,然后查找映射关系,得到映射到的通道,再将数据写入映射到的通道中,并发送给目标对象。

参见图3,与上述实施例相对应,所述中继客户端200还用于:

建立所述资源通道与所述中继通道之间的第二映射关系;

所述中继客户端200在通过所述中继通道获取到所述请求数据指令后,通过所述资源通道将所述请求数据指令发送给内网资源服务器时,具体用于:

确定获取到请求数据指令中的中继通道;

基于所述第二映射关系确定与所述中继通道相匹配的资源通道;

通过所述资源通道将所述请求数据指令发送给内网资源服务器;

所述中继客户端200在获取内网资源服务器针对所述请求数据指令产生的响应数据,通过所述中继通道将所述响应数据发送给所述中继服务器100时,具体用于:

确定获取到响应数据的资源通道;

基于所述第二映射关系确定与所述资源通道相匹配的中继通道;

通过所述中继通道将所述响应数据发送给所述中继服务器100。

在本申请公开的实施例中,所述基于所述网络请求指令建立所述中继服务器100与中继客户端200之间的中继通道,具体为:

基于所述网络请求指令中包含的目标内网iP端口建立所述中继服务器100与中继客户端200之间的中继通道;

所述中继客户端200建立内网资源服务器与所述中继客户端200之间的资源通道时,具体用于:

基于所述网络请求指令中包含的目标内网ip端口,建立内网资源服务器与所述中继客户端200之间的资源通道。

可选的,上述所述中继服务器100和中继客户端可以为基于java系统开发的服务器和客户端。

在本申请另一实施例公开的技术方案中,中继服务器暴露的内网ip端口完全可以由中继客户端控制,且暴露部分内网ip端口而不是整个局域网,由此,本申请上述实施例公开的技术方案中,所述中继客户端200,还可以用于:

向所述中继服务器100发送内网ip端口调节指令;

所述中继服务器100在获取到所述内网ip端口调节指令时,依据所述调节指令调节所述中继服务器100暴露的内网ip端口。

进一步的,上述方案中。整个中继逻辑的实现是通过消息传送建立的。中继服务器端发送消息到中继客户端进行安全认证、交换密钥和发送对接消息。中继客户端发送消息到中继服务器端进行安全认证、交换密钥和发送心跳消息。中继客户端收到对接消息对消息进行从新加密并作为对接数据与中继服务器端进行对接,从而实现了数据安全性校验。

参见图4,所述中继服务器端与所述中继客户端之间的安全校验流程具体为:

中继客户端连接到中继服务器端的消息端口以后,中继服务器端发送通过中继客户端公钥加密后的随机令牌;

中继客户端使用私钥解密所述随机令牌得到令牌原文,并发向所述中继服务器送通过所述中继服务器端公钥加密后的令牌原文;

中继服务器使用私钥解密对获取到的令牌原文进行解密,并将解密得到的令牌原文与自身存储的令牌原文进行对比;当对比结果一致时,发送服务器端到的对称加密密钥至所述中继客户端;

所述中继客户端发送中继客户端的对称加密密钥至所述中继服务器端;

中继客户端向所述中继服务器端发送使用对称加密的心跳信息;

中继服务器端对获取到的心跳消息进行处理;

所述中继服务器端在获取到网络请求指令时,发送对称加密后的对接数据至所述中继客户端;

所述中继客户端解密所述对接数据,生成对接认证数据密文;

将所述对接认证数据密文发送至所述中继服务器的中继端口;

所述随机令牌得到令牌原文,并发向所述中继服务器;

所述中继服务器端获取到对接认证密文后,对对接认证密文进行验证,当验证通过时,所述中继服务器端和所述中继客户端进行对接操作。

在本申请实施例公开的技术方案中,中继服务器消息部分可以采用NIO的非阻塞socket服务通道,在将中继服务器的消息端口与中继通道和用户连接通道绑定的同时,将通道的接收事件和读取事件注册到选择器上,遍历选择器监控通道就绪的事件。当某个通道的接收事件就绪时,通过接收事件处理器对象,对新接入的消息客户端进行安全认证和密钥交换逻辑,并返回消息客户端通道,该通道供前置服务使用,用于写入对接消息。当读取事件就绪时,通过消息读取处理器对象,对消息进行读取和处理.

在本申请实施例公开的技术方案中,所述中继服务器消息接收事件主要用于,处理消息客户端的连接事件,主要有对消息客户端的安全认证和对称加秘密钥交换功能。保证消息之间安全传输。

在本申请实施例公开的技术方案中,所述中继服务器读取事件主要用户读取中继客户端发送过来的消息,所述中继服务器端与中继客户端之间的消息采用对方的密钥加密然后封装成数据长度相同的包在通道之间相互传播,中继服务器的消息客户端通道读取事件就是读取通道之间的消息数据到缓存,当缓存的数据到达一个数据包的长度时进行消息处理。

在本申请实施例公开的技术方案中,中继客户端开启一个通道(长连接通道)并连接到中继服务器消息端口上,通过安全认证和密钥交换后,连接一直保持,中继客户端实时监控消息通道的读取事件来获取来自中继服务器端的消息,也可以通过消息通道(长连接通道)向服务端发送心跳等消息。

在本申请实施例公开的技术方案中,可以通过第一映射关系和第二映射关系实现通道映射,通道映射是两端通道数据准确传输的保证,两个通道形成相互映射关系后可以通过一个通道找到另外一个通道,以实现数据准确的交换。在中继服务器中,外网用户连接中继服务器前置端口的通道(用户连接通道)需要与中继客户端连接到中继服务端中继端口的一个通道(中继通道)进行对接、映射。中继客户端也需要将一条连接到中继服务器端口中继端口的通道(中继通道)与一条连接资源服务器的通道(资源通道)对接、映射。

通道映射完后将通道注册读取事件到选择器上,当一个通道读取事件触发就可以将该通道的数据读取写入映射的通道中,实现数据中继复制。

在本申请实施例公开的技术方案中,中继服务器代理端口为外网用户的访问端口,外网用户连接到代理服务端口时,代理端口将外网用户的连接缓存并给中继客户端发送消息,以建立中继通道。

在本申请实施例公开的技术方案中,中继端口是为中继客户端提供的,主要功能是对接和交换数据,中继客户端通过接收到的对接消息,发起新连接到中继服务器的中继端口,并传输对接信息。中继服务器根据中继客户端通过中继端口发送过来的对接消息找到缓存的用户连接通道与中继通道相互映射,注册读取事件到选择器上。

在本申请实施例公开的技术方案中,数据中继主要功能是对万网用户的请求数据和资源服务器的响应数据进行中继分别转发到资源服务器和外网用户,本申请中利用socket的双向数据传输原理,构成一条逆向连接的通道以实现内网穿透。

在本申请实施例公开的技术方案中,中继客户端和中继服务器端数据交换的通道相互映射后分别将读取事件注册到选择器上。选择器实时轮循,当通道读取事件就绪后将数据读取到缓存中,然后由通道映射关系找到相互映射的通道,并将缓存中的数据写入该通道,实现数据的中继。

由上述实施例公开的技术方案可见,本申请具有以下优点:

跨平台:采用java开发,只要有java运行环境就能运行。

成本低:只需要一台配置简单的外网服务器安装java运行环境即可。而且运行资源消耗低。

操作简单:配置好中继客户端的服务器ip端口和目标地址ip端口,运行即可使用。不用停止即可。

安全可控:服务端与客户端进行连接时需要双向认证,加载非对称加密证书,对应的加密证书无法相互通信,可以防止恶意客户端连接。服务器暴露的内网ip端口完全由客户端控制,且暴露部分ip端口而不是整个局域网。客户端在内网运行,完全在内网操作,相对安全可靠。

为了描述的方便,描述以上系统时以功能分为各种模块分别描述。当然,在实施本发明时可以把各模块的功能在同一个或多个软件和/或硬件中实现。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

相关技术
  • 内网穿透安全管控方法、管控系统及内网穿透系统
  • 使用IGMP实现内网穿透的方法和内网穿透系统
技术分类

06120112516673