一、定义

内网穿透也成NAT穿透,进行NAT穿透是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机

NAT(网络地址转换)设备自动屏蔽了非内网主机主动发起的连接,也就是说从外网发往内网的数据包将被NAT设备丢弃掉。这使得位于不同NAT设备之后的主机无法交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使NAT设备产生一个映射条目。

二、工作方式

通信双方一台位于NAT之后

​ 主机A有公网IP,主机B位于NAT之后,有一个内网IP。由于主机A有公网IP,所以主机B可以直接通过TCP连接到主机A,而主机A则无法直接向主机B发起连接。这时需要一个共有服务器辅助进行内网穿透,A、B主机同时向服务器发起登录请求,并保持一个TCP或UDP连接。服务器记录其IP地址和端口后(服务器对主机B的记录是起经过NAT映射之后的IP和端口号)。当主机A想连接主机B,首先向服务器提出请求,服务器在收到请求后向主机B发出打洞命令,并将主机A的IP和端口号发给主机B。主机B根据收到的IP地址和端口号向主机A发起TCP连接或UDP数据包(打洞)。由于打了洞所以公网主机也可以访问通过这个洞越过NAT访问内网设备,接下来两个主机即可进行通信。

​ 即使用服务器记录下要访问内网的设备的IP,然后让处于内网的设备根据IP主动发起通信连接。(因为处于内网的设备已经提前主动连接了共有服务器,所以服务器才能向器发送命令和数据)

通信双方都位于NAT之后

​ 实现方式同理,由于两个设备都没有公网IP,所以双方任意方向的的连接请求都会被对方的NAT设备屏蔽,同样需要两个设备都同时向服务器发起登录请求并保持连接。这个时候需要设备A向服务器提出连接请求,服务器将设备A的IP和端口号发给设备B,并向B发起打洞命令。设备B收到后向设备A发送一定数目的 UDP探测包或 TCP 连接请求,在 NAT B 上打一个方向为端口号对A设备的洞,随后告知服务器打洞完成。服务器收到后让A发出请求,由于此时设备B已经留下了对应于设备A的洞,故A设备发出的请求或数据包不会被丢弃。而随着A请求设备B,自己的NAT同样出现了朝向设备B的洞,那么双方即可完成通信。

三、总结

如果A主动向B发送一条信息,则A就在自己的NAT上打了一个朝向B的洞。这样A的这条消息到达B的NAT的时候,虽然被丢掉了,但是如果B这个时候在给A发信息,到达A的NAT的时候,就可以通过A之前打的洞将消息发送给A。

简单来讲,就是如果A和B要进行通信,那么得事先A发一条信息给B,B发一条信息给A,提前在各自的NAT上打了对方的洞,这样下一次A和B之间就可以进行通信了。而想要让他们能给对方法信息就得知道对方的IP地址,这就需要通过一个实现连接好的公网服务器进行信息的传递。

内网穿透就是说我们让自己的内网设备事先去绑定一个具有公网IP设备的端口进行通信。那么当我们请求公网设备的指定端口时内网设备便能知道请求方的IP和端口,随后主动与其通信,实现与内网设备的通信。