前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NAT穿透技术详解

NAT穿透技术详解

原创
作者头像
tigerzhou
发布2018-07-20 21:24:06
2.4K0
发布2018-07-20 21:24:06
举报
文章被收录于专栏:技术达人技术达人

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表。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
弹性公网 IP
弹性公网 IP(Elastic IP,EIP)是可以独立购买和持有,且在某个地域下固定不变的公网 IP 地址,可以与 CVM、NAT 网关、弹性网卡和高可用虚拟 IP 等云资源绑定,提供访问公网和被公网访问能力;还可与云资源的生命周期解耦合,单独进行操作;同时提供多种计费模式,您可以根据业务特点灵活选择,以降低公网成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com