计算机网络打洞技术

  • 格式:docx
  • 大小:18.84 KB
  • 文档页数:6

Internet的快速发展以及IPv4地址数量的不足使得NAT设备得到了大规模的应用,然而这也给越来越多的端到端通信也带来了不少的麻烦。

一般来说,NAT设备允许内网内主机主动向公网内主机发送数据,但却禁止内网外的主机主动向内网内的主机传递数据。

由于很多的会话双方处于不同的NAT设备后,它们通信一般通过公网服务器中转,而要建立P2P通信,则必须解决N A T穿越问题才能建立通信。

第三章 NAT穿越模块的设计与实现NAT 是介于内网和公网之间的设备,公网中的IP 地址是全球唯一的,而在内网中的IP 地址可以重复出现,但不能出现在公网中[18]。

NAT的基本功能就是通过一个或几个lP地址,来实现局域网上的所有主机都可以对因特网进行访问[19]。

NAT实现了公网地址和内网地址之间的映射,可从两个方面来概括:(1) 当内网内的IP包经过NAT需要流入公网时,NAT将此IP 包的源IP地址和端口改为NAT接口上的一个公网地址和端口;(2)当公网中的IP包经过NAT 需要访问内网资源时,NAT将此IP 包的目的地址和端口改为内网IP 地址和端口。

图3.1 UDP包经过NAT原理图图 3.1是 UDP包经过NAT后的示意图,可以看出UDP包从内网主机A发出时,到达NAT后它的源端IP和端口都已经改变。

同时从主机B的UDP包发往NAT-A的公网IP 和端口后,NAT将其自动转发给主机A。

3.1 NAT穿越方案分析3.1.1 NAT的类型NAT设备的类型对于穿越NAT,有着十分重要的影响,根据其端口映射方式,NAT可分为如下4类,前3种NAT类型可统称为cone NAT。

(1)全克隆( Full Cone) : NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。

任何一个外部主机均可通过该映射发送IP包到该内部主机。

(2)限制性克隆(Restricted Cone) : NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。

但是,只有当内部主机先给IP地址为X的外部主机发送IP包,该外部主机才能向该内部主机发送IP包。

(3)端口限制性克隆( Port Restricted Cone) :端口限制性克隆与限制性克隆类似,只是多了端口号的限制,即只有内部主机先向IP地址为X,端口号为P的外部主机发送1个IP包,该外部主机才能够把源端口号为P的IP包发送给该内部主机。

(4)对称式NAT ( Symmetric NAT) :这种类型的NAT与上述3种类型的不同,在于当同一内部主机使用相同的端口与不同地址的外部主机进行通信时, NAT对该内部主机的映射会有所不同。

对称式NAT不保证所有会话中的内有地址和公开IP之间绑定的一致性。

相反,它为每个新的会话分配一个新的端口号。

所以即使是同一台外部主机的不同连接,其分配的端口号都是不一样的,通常都是在原来的端口号上加一。

由此可见,Symmetric Cone条件最严格,Port /Restricted Cone次之,Full Cone 条件最不严格。

因为我国的网络技术应用得比较晚,所以可以说绝大部分的网络都是cone NAT[20]。

3.1.2 NAT给P2P通信带来的问题研究NAT的存在,使得局域网的用户可以共享一个IP地址访问因特网,解决了IP地址的不足,同时起到了防火墙的作用。

但是NAT的存在给P2P网络也带来了问题:(1)内网主机的IP地址是虚拟的,在因特网上是非法的,因而内网主机对公网是不可见的。

(2)即使内网内主机的IP地址已知,NAT仍然阻止公网主机主动访问内网主机。

(3)内网主机可以作为客户机访问外网,但不能作为服务器向外网提供服务[21]。

NAT产生种种问题的原因主要是NAT不允许外部主机主动访问内部主机,这样虽然有安全性高的优点,但是同时带来服务性能低的不良效果。

上述这些限制使得在NAT 的网络中,外网主机无法穿过NAT主动与内网主机进行通信,P2P网络各主机无法彼此发现对方进行对等信息交换,特别是位于不同NAT之后的不同内网中的机器,更是无法相互连接。

如果不能够穿越NAT,P2P网络就无法实现真正的对等,也就无法实现所有信息的交换或共享。

当前处于NAT后的主机通信一般通过服务器的中转,例如当客户机A和客户机B 都分别处于不同的NAT后面,先各自发起一个TCP或UDP的连接,连接到一个大家都知道的拥有固定IP地址的服务器S上。

由于A和B不能直接连接,两个客户端就使用S服务器进行消息的传递。

例如,A要发送一条信息到客户端B,客户端A以C/S连接方式简单的发送一条信息到S服务器,然后S服务器使用已经和客户端B建立的C/S 连接发送这条信息到客户端B。

NAT后主机不建立P2P通信时发送数据的具体过程如图3.2所示。

这种方法的优势在于只要两个客户端都连在服务器上,它就是有效的。

它的明显缺点是它需要了服务器的处理并占用了带宽,而且即使服务器的网络状况良好,也有一定的通讯滞后问题。

所以我们需要对该方案进行改进,提出了NAT穿越技术。

图3.2 NAT后主机不建立P2P通信时发送数据的具体过程NAT穿越的主要目的是是让处于NAT后的通信主机在建立连接后,可以绕过服务器的中转,直接进行P2P通信。

这样可以大大节省网络带宽,且数据传输更稳定,出现延时现象更少。

3.1.3 Cone类型的UDP穿越UDP是是无连接的协议,几乎不提供可靠性措施,但是UDP的效率非常高。

它与TCP 协议不同,不需要在传输数据之前要建立一种虚拟的连接关系。

所以UDP连接只要知道对方的IP地址和UDP端口,就可以进行数据传输。

在P2P网络中,采用UDP方式进行数据传输,只有获得对方主机的公网IP地址和端口才可以进行数据交换。

因此,需要在P2P网络中设立一台有公网IP地址的注册服务器,任何主机都要先登录到注册服务器,注册服务器将记录这个IP地址和端口号为公网IP地址和UDP端口。

这样在注册服务器上将建立一张映射表,这张映射表记录了登录到注册服务器的主机在内网中的IP地址和端口号和经过NAT之后NAT所分配的IP 地址和端口号,即(内网IP地址:UDP端口号)-(公网IP地址:UDP端口号),如果主机不在NAT之后,则二者相同,这样每台登录的主机都拥有Internet上唯一的(公网IP地址:UDP端口号)。

图3.3 UDP穿越示意图当一台主机要和另一台主机进行通信,它先从注册服务器那里获得目的主机的公网IP地址和端口号,而后就可以直接进行通信,实际的数据交换不需要注册服务器参与,从而实现了P2P穿越NAT。

当主机A1和B1位于不同的NAT之后,它们用UDP穿越NAT建立直接通信如图3.3所示,具体的过程如下:(1)A1和B1先登录到公网注册服务器,并向服务器发送各自的实际IP地址和UDP 端口信息。

(2)注册服务器记录为两个公网IP地址和端口号,同时从接收到的UDP数据报头中提取IP地址和端口信息,记录为内网IP地址和端口号,这样在注册服务器上的映射表中就增加两条记录,分别为:A1:2:2000)一(.10:2000)、B1:一(.20:4000)。

(3)从注册服务器的映射表可以知道A1和B1位于不同的NAT之后。

A1要向B1发送UDP消息那么A1发送命令给Server,请求Server命令B1向A1方向打洞, Server 在发送打洞命令时同时将Client A的公网地址.10:2000发送给B1()。

B1收到命令后向A1的公网地址发送信息,虽然NAT A会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。

但是我们已经在NAT B上打一个方向为(即 A1的外网地址)的洞,那么A1发送到的信息, B1就能收到了。

然后 A1就可以通过B1的外网地址与B1进行P2P通信了。

(4)至此,两个不同NAT之后的主机A1和B1穿越NAT之后,实现了P2P的信息直连。

3.1.4 cone类型的TCP穿越对于UDP穿越NAT,现在已经有了一些比较标准而且有效的方法,如STUN协议。

但目前尚未能完全解决TCP穿越NAT的问题,即便有一些方法,但也处于测试阶段。

在此介绍一下当前一种TCP穿越实现方法,其原理是呼叫双方处于不同的NAT后,处于NAT 后的主机先与公网上的注册服务器建立辅助连接( TCP、UDP均可) ,在呼叫发生时,通过注册服务器的协助在呼叫双方间建立TCP直连。

对于cone类型的NAT可采用图3.4所示的方法解决TCP穿越问题,主要过程可分为建立辅助连接、查询被叫、TCP打孔、建立TCP直连4个部分。

3.1 建立辅助连接各会话用户先与注册服务器建立UDP连接(以下称为辅助通道)并一直在该连接通道上发送UDP数据包以保持自己处于激活状态,服务器记录各用户的ID (ID是用户的唯一标识符)。

图3.4 “TCP打孔”方法穿越NAT过程(注:图中圆括号内为消息内容,方括号内为消息路径。

如连接通知(C: V)UDP[ C: R >NB: Q >B: P ]表示该消息内容为服务器地址、端口(C: V) ,消息从IP地址C端口R出发经过IP地址NB端口Q到达IP地址B端口P。

)3.2 查询被叫(1)主叫A与呼叫服务器C建立TCP连接,并向服务器发送被叫ID,请求服务器协助查询被叫IP地址、端口。

服务器记录主叫在经NAT映射前后的IP地址、端口(NA:N)以及本次连接使用的端口V。

该请求在建立TCP直连的步骤3中得到回复。

(2)呼叫服务器通过已经建立的辅助通道向被叫发送连接通知,其中携带与主叫建立TCP连接使用的IP地址、端口(C:V),即通知被叫向该地址、端口回送消息。

(3)被叫向连接服务器回复连接请求,建立TCP连接,服务器记录被叫在经NAT映射前后的IP地址、端口(NB:Y)。

3.3 TCP打孔(1)连接服务器向被叫返回连接的详细信息,如主叫ID及主叫经过NAT映射后的IP 地址、端口(NA:N) ,并关闭与被叫的TCP连接;(2)被叫尝试向主叫的经过NAT映射后的IP地址、端口(NA:N)发送建立TCP连接的请求。

(3)根据前述的NAT类型,此处可能有2种情况: 1) Full Cone方式下,NATA会将该TCP消息转发到内网内的主叫端口M,由于主叫 A 已经使用该端口与连接服务器建立TCP连接,故主叫A会返回一个端口已占用消息; 2)Restricted Cone 或Port Restricted Cone方式下,NAT A不会转发该消息给主叫, 而是返回一条出错消息给被叫。

如果NAT B收到该出错消息后,将其转发给内网内的被叫B,则该TCP连接终止, TCP 打孔失败。