> 文章列表 > Java实现内网穿透

Java实现内网穿透

Java实现内网穿透

使用场景

1、当公司的一些系统功能使用了第三方服务时,通常第三方会回调我们的接口。在对接阶段,为了方便debug,我们肯定希望能回调到我们本地电脑上来。

2、当你在公司想访问部署在家里电脑的服务或者文件时。

3、当你的外地同事想访问你本地的服务,虽然发布到测试也可以,但是部署需要时间,发生错误排除也没有本地来的快,不够所见即所得。

虽然有现成的内网穿透工具,但没有比自己写的用起来更有成就感,哈哈哈哈~

而且自己写的,会遇到很多关于网络、线程的问题,网络的阻塞(代码跑着跑着就阻塞住了,也不知道为什么阻塞住了、阻塞在哪了,令人头大)、线程之间的配合(线程之间配合不好,导致数据在传输的时候缺少了,令人摸不着头脑),体会过一遍之后,更能加深自己对这方面知识了解,用这种有实际开发场景的学习方式,比直接背八股文效果更好,了解的更深(知其然,之所以然)。因为是体验、理解过这个知识点所带来的实际成果,能记忆的更深更久,不会像八股文背了又忘,忘了又背。

原理

其实很简单,外网服务器是不可能主动与内网服务器建立连接去通讯的,但是内网服务器可以,所以只要内网服务器告诉外网服务器“我”在哪里,那外网服务器就可以把请求的数据发送给内网服务器。

但是外网有这么多服务器,内网服务器要告诉哪个呢?总不能告诉全部服务器吧,不现实。所以,还是需要一台外网服务器跟内网服务器配合,内网服务器只告诉这个特定外网服务器“我”在哪,其他外网服务器或者内网服务器想要访问我的内网服务器,那就去访问特定外网服务器就可以了,特定外网服务器知道内网服务器在哪里,就可以转发相应的数据。

这个特定外网服务器就相等于代理服务器,转发外网和内网的数据,在它们中间建立了一座桥梁。

 

在云厂商买一台服务器,因为有外网ip,再用Java写一个数据转发的进程就能实现特定服务器的功能,不过本地也是可以测试的,只要用不同的端口,有点像端口的流量转发。

加入了Server-Proxy跟Client-Proxy之后,就能访问内网的服务了。

Client-Proxy的作用:Client-Proxy上线之后告诉Server-Proxy“我”在哪,接收到Server-Proxy的数据之后会转发给本地的服务器,同时也会把本地服务器的数据转发给Server-Proxy。

Server-Proxy的作用:监听两个端口,一个用作外部服务的端口,一个用作监听Client-Proxy上线和数据传输的端口,也是用于数据的传输和回写。

Server-Proxy跟Client-Proxy中间建立的通道,是Client-Proxy上线之后主动与Server-Proxy建立的TCP长连接(图中红色的线,即客户端告诉服务端“我”在哪)。

Java代码实现