NAT 穿透技术详解
NAT穿透技术详解
1.P2P网络结构模型
顾名思义,P2P就是点到点的意思,是与C/S结构不一样的纯分布式结构。
1.1.传统的C/S结构
传统的C/S结构是每个客户端均知道中心化的SERVER,由客户端主动与SERVER进行通信。
1.2.P2P网络结构
P2P网络结构是分布的网状结构,每个节点并不预先知道其它节点的可通信位置信息。
1.3.P2P结构的演化
P2P结构经历了如下的演化阶段:
•集中目录式
•纯分布式
•混合式
1.3.1.集中目录式
集中目录式就是具有一个集中点,作为知道其它节点通信信息的中介,所以不属于纯分布式,具有以下特点:
•最早出现的P2P应用模式
•仍然具有中心化的特点,也称为非纯粹的P2P结构
•典型代表是共享MP3音乐文件的Napster
•集中的统一管理提供了良好的商业模式,譬如IM,迅雷等
1.3.2.纯分布式
纯分布式就是无中心节点,全分布的概念,具有一线特点:
•完全取消了集中的*服务器,扩展性和容错性较好
•纯P2P非结构化网络采用泛洪方式进行,消耗大量带宽
•没有集中的管理导致更容易受到病毒侵害和恶意攻击
•采用纯P2P非结构化拓扑结构的代表是Gnutella模型
•采用结构化拓扑结构譬如环型DHT可以避免广播危害
1.3.2.1.纯分布式非结构化模型
纯分布式非结构化模型就是所以节点都是相等的地位的,没有谁预先知道谁的通信位置信息。
1.3.2.2.纯分布式环形DHT网络结构
纯分布式DHT网络结构就是所以节点都是相等的地位的,但是每个节点都预先知道部分节点的通信位置信息。
1.3.3.混合式
混合式就是集中目录式与纯分布式的结合,同时也就是具有两者的优点,也规避了两个的某些缺点。主要有以下特征:
•吸纳了集中目录式和纯分布式的优点,是P2P和C/S的结合
•没有集中的固定服务器,引入超级节点的概念,超级节点和其邻近的普通节点构成自治簇
•簇内采用集中目录式,簇与簇之间采用纯分布式
•Kazaa是混合式模型的典型代表
•普通节点搜索在本地所属簇中进行,只有查询不充分的情况下才通过超级节点间有限泛洪
2.NAT穿透原理
P2P既然需要两个节点直接之间互相通信,而两个节点多数情况都位于防火墙内和内部局域网内,从内往外访问很容易,但反过来却无法直接进行,这就涉及到NAT穿透技术。
2.1.UDP穿透之七中情形
UDP穿透主要有以下七种情形:
•Open Internet
主机具有公网IP,允许主动发起和被动响应两种方式的UDP通信。
•UDP Blocked
位于防火墙之后,并且防火墙阻止了UDP通信。
•Symmetric Firewall
主机具有公网IP,但位于防火墙之后,且防火墙阻止了外部主机的主动UDP通信。
•Full Cone NAT
当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个固定的公网{IP:端口}。此后,通过这个socket发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;同时,任何外部主机都可以使用这个公网{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个映射表,内网主机的内网{IP:端口}与公网{IP:端口}是一一对应的关系。一旦这个映射关系建立起来(内部主机向某一外部主机发送一次数据即可),任何外部主机就可以直接向NAT内的这台主机发起UDP通信了,此时NAT透明化了。
•Restricted Cone NAT
当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个公网{IP:端口}。此后,通过这个socket向外发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;而任何收到过从这个socket发送来的数据的外部主机(由IP标识),都可以通过这个公网{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个内网{IP:端口}到公网{IP:端口}的映射,还维护了一个{外部主机{IP}, 公网{IP:端口}}到内网{IP:端口}的映射。因此,要想外部主机能够主动向该内部主机发起通信,必须先由该内部主机向这个外部发起一次通信。
•Port Restricted Cone NAT
当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个公网{IP:端口}。此后,通过这个socket向外部发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;一旦外部主机在{IP:端口}上收到过从这个socket发送来的数据后,都可以通过这个外部主机{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个从内网{IP:端口}到公网{IP:端口}的映射,还维护了一个从{外部主机{IP:端口}, 公网{IP:端口}}到内网{IP:端口}的映射。
•Symmetrict NAT
当内网主机创建一个UDP socket并通过它第一次向外部主机1发送UDP数据包时,NAT为其分配一个公网{IP1:端口1},以后内网主机发送给外部主机1的所有UDP数据包都是通过公网{IP1:端口1}发送的;当内网主机通过这个socket向外部主机2发送UDP数据包时,NAT为其分配一个公网{IP2:端口2},以后内网主机发送给外部主机2的所有UDP数据包都是通过公网{IP2:端口2}发送的。公网{IP1:端口1}和公网{IP2:端口2}一定不会完全相同(即要么IP不同,要么端口不同,或者都不同)。这种情况下,外部主机只能在接收到内网主机发来的数据时,才能向内网主机回送数据。
2.2.UDP穿透之网络发现
UDP穿透的七种情形节点自身如何知道,也就是如何在防火墙内和局域网内知道自己进行公网UDP通信时的网络结构。每个节点通过和一个具有双网卡和双公网地址的STUN服务器进行通信,通过一定的协议规则来判断自身的网路结构。
2.3.UDP穿透之网络发现流程
UDP穿透之网络发现流程如下图示:
2.4.UDP穿透之四种NAT
UDP穿透之网络发现协议图解:
•全锥形NAT
•受限锥形NAT
•端口受限锥型NAT
•对称型NAT
上述除了对称性NAT无法实现简单的打洞穿透外,其它都是可以简单的实现穿透的。
2.4.1.全锥形NAT
全锥形NAT的IP、端口都不受限。只要客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),其他IP的主机(B)或端口(A:P2)都可以使用这个洞发送数据到客户端。映射关系为:Client->NatIP:NatPort->Any,即任何外部主机都可通过NatIP:NatPort发送数据到Clietn上。
2.4.2.受限锥形NAT
受限锥形NAT的IP受限,端口不受限。当客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。映射关系为:Client-> NatIP:NatPort->A,即只有来自A的数据包才能通过NatIP:NatPort发送到Client上。
2.4.3.端口受限锥型NAT
端口受限锥型NAT的IP、端口都受限。返回的数据只接受曾经打洞成功的对象(A:P1),由A:P2、B:P1发起的数据将不被NatIP:NatPort接收。映射关系为:Client->NatIP:NatPort->A:P1,即只有来自A:P1的数据才可通过NatIP:NatPort发送到Client上。
2.4.4.对称型NAT
对称型NAT具有端口受限锥型的受限特性。但更重要的是,他对每个外部主机或端口的会话都会映射为不同的端口(洞)。只有来自相同的内部地址(IP:PORT)并且发送到相同外部地址(X:x)的请求,在NAT上才映射为相同的外网端口,即相同的映射。一个外部地址(X:x)对应一个NAT上的映射,每个映射仅接收来自他绑定的外部地址的数据。关键点在到不同的目的地(目的IP:目的端口)分配不同的映射地址(IP:Port)
2.5.TCP穿透探索
因为UDP穿透简单,所以多数P2P的实现都是以UDP协议来实现的,但TCP也是可以穿透,只要符合TCP通信协议的规范就可以,主要在SYN消息如何准确的伪造出来。
2.5.1.SYN消息的构造
构造出SYN消息的序列号成为能够穿透成功的关键,当接收到的 SYN 包中的源IP地址和端口、目标IP地址和端口都与NAT登记的一个已经激活的TCP会话中的地址信息相符时,NAT会放行这个SYN 包。
2.5.2.TCP穿透图示
下图展示了在两个NAT之间实现TCP传透的例子:
3.P2P搜索算法
P2P节点找到自己需要的资源的节点有以下两种搜索算法:
•非结构化搜索算法
•结构化搜索算法
3.1.非结构化搜索算法
1.盲目搜索法
a)逐步深化搜索法
b)随即漫步搜索法
2.智能搜索法
a)高速缓存器法
b)移动代理法
3.2.结构化搜索算法
结构化搜索法典型的就是chord环,即DHT即分布式哈希表(Distributed Hash Table),它通常是为了拥有极大节点数量的系统,而且在系统的节点常常会加入或退出节点而设计的。
Chord由麻省理工学院(MIT)在2001年提出,其目的是提供一种能在P2P网络快速定位资源的的算法,它并不关心资源是如何存储的,只是从算法层面研究资源的取得,因此,Chord的API就简单到只有一个set、get。
Chord要实现的其实就是给定一个关键字Key,并能够将其映射到某个节点。Chord采用一致性哈希为每个节点和关键字产生一个m位的ID,并按照ID的大小构成环形拓扑。另外,为了路由的需要,Chord还维护了一张最多m项的路由表即Finger表。如下图所示的就是m为 6的一个Chord拓扑环和Finger表。