Skip to content

内网端口映射应该如何实现

本文将介绍内网端口映射应该如何实现。

前提

很多人或多或少都遇到过这样的问题:需要将内网开发中的项目或网站展示给远程客户,或者用于汇报进度。由于资源都在内网,每次操作都需要费时费力。所以,更加常规的做法是购买一台云服务器,专门用于客户浏览。但是,这样的做法非常麻烦,开发人员不仅需要兼顾本地开发工作,还要把资源推送到专用的服务器上供客户查看。

如果有这样一款软件,能够将内网的服务映射到公网上,甚至直接映射到对方的内网中,那岂不是太方便了?于是,我花了一些时间撸了一个这样一个工具,地址在这里:goRelay

解决思路

假设有这样一种情形,内网1想要访问内网2中的某个资源,如图所示:

image-20241219154505836

由于内网1和内网2是物理隔离的,所以无论如何,它们无法直接互相访问。唯一的解决方案是,在两者之间增加一层中间层,从而实现内网1能够访问内网2中的真实服务的数据。

所以,可以借助有公网IP的服务器,后面简称公网。在内网1中,我们可以顺利地连接到公网的内网映射服务器,但问题是,映射程序如何连接到内网2中的真实服务呢?具体如图所示:

image-20241218185302477

所以,需要在内网2中也定义一个服务,姑且称为映射客户端,由它来作为内网映射程序和真实服务的桥梁,如图所示:

image-20241218185337739

这样的话,映射客户端连接公网上的内网映射服务器和真实的服务,这样的话,在内网1和内网2中的服务在“链路上”确实是通了。

可是,又会存在这样的一个问题:由于内网映射服务器是服务器,而映射客户端是一个客户端,那么,客户端应该提前发送多少个请求到内网映射程序服务器上呢?

所以说,最简单的办法是直接建立一条“真实的链路”。例如,当内网1中的3个客户端同时请求服务时,最直接的做法是让内网映射服务器与映射客户端之间保持3条独立的连接 且 映射客户端与真实服务之间也保持3条连接。这样,映射服务器能够清晰地知道哪个请求来自哪个客户端,响应也能精确地返回给正确的用户。如图所示:

image-20241219143712608

当增加一个请求的时候,再相应的增加一条链接即可,这样是最简单的,也是最方便的,只需要做好链接维持以及数据转发即可,但是想要正确维护好这个链路是非常困难的,有太多的不确定的因素。

所以说,内网映射服务器和映射客户端仅负责数据的传输就好。为了更好地处理客户端鉴别和数据传输,我们可以再启动两个程序,分别用于客户端区分和数据传输。图示所示:

image-20241219145034026

在上图中,内网映射服务器 和 映射客户端 仅负责数据的传送。而转发服务器则是一个独立的服务,主要负责接收客户端的请求,并将请求转发至 内网映射服务器,转发过程至此结束。当流量来到在转发客户端中,它需要解析用户的请求信息,向真实服务发起请求,并将返回的结果传递回真实的客户端。




内网端口映射应该如何实现

https://wangli2025.github.io/2024/12/20/internal_network_port_mapping.html

本站均为原创文章,采用 CC BY-NC-ND 4.0 协议。转载请注明出处,不得用于商业用途。

Comments