内网穿透原理内网穿透工具


内网穿透,也即NAT穿透,进行NAT穿透是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与NAT设备的相对位置介绍内网穿透方法。

UDP内网穿透的实质是利用路由器上的NAT系统。NAT是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐蔽。

在整个音频共享模块中,UDP内网穿透技术是实现多个不同内网节点之间的UDP音频流互相转发的技术重点。音频对讲过程可分解为音频压缩、发送的输出过程和音频接收、解压、播放的输入过程。而多人音频对讲的过程实际上就是多个节点的系统中,两两节点之间的音频流收发过程。在这里无法直接处理的环节是每个参与音频对讲的节点作为服务器端接收其他节点发送过来的音频流数据的输入过程,因为大部分参与者都没有自己的公网IP,这样的内网节点直接在本地启动一个接收音频流的服务器线程,不在同一内网之内的其他节点无法直接连接到这个服务器。虽然可以通过在每个局域网和公网之间的路由器上添加端口映射将内网服务端口呈现在公网上,但这样做涉及到要修改每个节点对应的路由器配的置以及权限等问题,不是理想可用的实现方法。使用UDP内网穿透技术,可以使一个普通的内网节点在需要时将自己的服务器端口自动的呈现在公网上,并且能够让系统内其他节点正确获取这个音频接收服务器的地址,以便其他节点能够将自己的音频流发送到这个音频接收端口。

网络地址转换(NetworkAddressTranslation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使NAT设备产生一个映射条目,这就有必要研究一下内网穿透技术。

传统的NAT技术是通过将专用的网络地址(如企业内部网)转换为公用地址(如互联网),从而对外隐藏了内部管理的IP地址。这样,通过在内部使用非注册的IP地址,并将它们转换为一小部分外部注册的IP地址,从而减少了IP地址注册的费用以及节省了目前越来越缺乏的地址空间。同时,这也隐藏了内部网络结构,从而降低了内部网络受到攻击的风险。

穿透内网右图表示了NAT技术的穿透过程。NAT设备(或软件)维护一个状态表,用来把内部网络的私有IP地址映射到外部网络的合法IP地址上去。每个包头中的IP地址和端口信息在NAT设备(或软件)中都被修改并翻译成一正确的IP地址发往下一级。当一个内网主机通过NAT打开一个“外出”的TCP或UDP会话时,NAPT分配给这个会话一个公网IP和端口,用来接收外网的响应的数据包,并经过转换通知内部网的主机。这样,NAPT在[私有IP:私有端口]和[公网IP:公网端口]之间建立了一个端口绑定。

穿透内网一台主机有一个公网IP,另一台主机有一个内网IP。如右图所示,ClientA位于NAT之后,并拥有[IP地址:端口]对[10.0.0.1:],ClientB位于NAT之前,并拥有[IP地址:端口]对[138.76.29.7:],NAT拥有公网IP155.99.25.11。由于ClientB有一个公网IP,ClientA可以直接通过TCP连接到[138.76.29.7:],然而,如果ClientB向ClientA发起主动连接,则不会成功。此时,需要一个公有的服务器辅助进行内网穿透。ClientA和ClientB向服务器发起登陆请求,并保持一个TCP或UDP连接,服务器记录其IP地址和端口号,这里服务器对ClientA是记录其经过NAT映射之后的IP和端口号。当ClientB想连接ClientA时,首先向服务器提出请求,服务器在收到请求后向ClientA发出打洞命令,并将ClientB的[IP地址:端口]对发给ClientA,ClientA根据接收到的IP地址和端口号向ClientB发起TCP连接或发送UDP数据包。接下来ClientA和ClientB之间便可以建立数据传输通道。

穿透内网两台主机都处于内网中,如右图所示。服务器记录的[IP地址:端口]对是ClientA和ClientB经过NAT映射之后的IP地址和端口号,此时,ClientA和ClientB之间任意方向的连接请求都会被对方的NAT设备屏蔽。ClientA首先向服务器提出连接请求,服务器将ClientA的IP地址和端口号对[155.99.25.11:]发给ClientB,并向ClientB发出打洞命令;ClientB收到服务器的打洞命令后首先向[155.99.25.11:]发送一定数目的UDP探测包或TCP连接请求,在NATC上打一个方向为[155.99.25.11:]的洞,ClientB随后向服务器报告打洞完成;服务器在收到ClientB的报告后将ClientB的公网IP地址和端口号对[110.10.33.10:],此时由于NATB上已经留下了对应于[155.99.25.11:]方向的洞,ClientA向[110.10.33.10:]发出的数据包或连接请求将不会被丢弃。

巧妙地利用NAT原理实现NAT内网穿透技术,就可以使内网服务器接收到外网数据包。内网穿透流程如下:

注册收发接口

(1)两个需要通过内网穿透进行通讯的内网客户端,分别将自己的外网收发接口注册给一个具有公网ip的中转服务器,如右图所示。

告知对端的收发接口

(2)中转服务器将两个客户端注册的收发接口分别告知给对端,如右图所示。

发送打洞包

(3)一个内网客户端使自己的接收端口作为源地址,向对端的发送端口发送一个udp数据包,这个数据包称为打洞包。发送过这个打洞包后,可以在这个内网的出口路由器上产生一条NAT记录,令后续从对端发送端口发来的数据包都不被丢弃,而是转发给相应的内网客户端的指定端口,如右图所示。

对端发送来的音频流数据包转发至本端内网服务器端口

(4)发送过打洞包后,对端发送至本端路由器指定接收端口的数据包,就会根据NAT记录转发至本端的内网服务器接收端口,从而实现了内网服务器接收外网数据包的功能,如右图所示。



(5)另一个内网服务器同样执行上述步骤

(3)

(4),即可实现两端内网服务器相互收发音频数据包的功能。

百科词条内容由用户共同创建和维护,不代表百科立场。如果您需要医学、法律、投资理财等专业领域的建议,我们强烈建议您独自对内容的可信性进行评估,并咨询相关专业人士。