本项目是使用C++编写的一个内网穿透服务, 可以将内网中的服务器通过客户端映射到作为中转服务器的服务端的端口上, 通过访问服务端的端口以实现访问内网服务器的目的
项目代码:tiefxblau/Intranet_penetration: 内网穿透服务 (github.com)
内网宽带中的主机可以访问公网宽带主机,反之不可以访问;公网宽带主机可以和公网宽带主机双向访问;内网宽带中的主机和内网宽带中的主机互相无法访问。那么内网宽带中的客户机和公网宽带中的客户机如何访问另一个内网宽带中的服务器呢?这里就需要用到内网穿透技术。
对于在NAT之后的服务器来说,其不是不能主动访问公网端口,而是不能反过来有效的被公网访问。所以可以在中间架设一个公网服务器,让在NAT之后的服务器持续主动访问这个拥有公网IP地址的服务器,这样内网服务器就成功与公网中转服务器建立了一个连接通道。然后当有任何其他NAT后的客户端主动连接公网中转服务器时,公网服务器接收到连接请求之后马上把这连接请求通过先前建立好的隧道转发到内网服务器,内网服务器将响应数据包再原路转发回去,最终到达公网中转服务器,然后返回给其他NAT后的客户端。
本项目思路大致如下:
1. 将需要被公网访问的内网服务注册到客户端 。
2. 客户端向处在公网的服务端发起连接,服务端接受连接后开启一个端口为客户端进行监听。
3. 有用户向服务端发起连接。
4. 服务端告知客户端有用户到来。
5. 客户端收到消息后分别向服务端和内网服务发起新的连接,用户和内网服务可以通过服务端和客户端的中转进行通信了。
以下是对本项目的功能测试:
这里使用一个简单的网络计算器进行测试,网络计算器的服务端作为内网服务,它的客户端作为用户
首先将内网服务在端口8083上开启
此时公网服务端将9002端口作为监听,所以网络计算器的客户端直接访问
公网服务端的ip+9002端口(101.43.183.8 : 9002), 发现成功连接
输入2+3进行计算, 成功的收到了内网服务也就是网络计算器的服务端的回应
内网服务收到的请求
因为我没有处在内网的Linux环境,所以为了测试是否能够实现内网穿透,在Windows下写了一个专门用于测试的简单客户端和一个回响服务
先将处于内网的Windows下的内网服务开启
这次用telnet作为用户向公网服务端发起连接
之后发送信息,收到了来自内网服务的“Hello,client”回响
成功的实现了内网穿透