P2P技术(一):NAT
1、NAT由来
NAT是一项神奇的技术,说它神奇在于它的出现几乎使IPv4起死回生。在IPv4已经被认为行将结束历史使命之后近20年时间里,人们几乎忘了IPv4的地址空间即将耗尽这样一个事实——在新技术日新月异的时代,20年可算一段漫长的历史。更不用说,在NAT产生以后,网络终端的数量呈加速上升趋势,对IP地址的需求剧烈增加。
说它神奇,更因为NAT给IP网络模型带来了深远影响,其身影遍布网络每个角落。根据一份最近的研究报告,70%的P2P用户位于NAT网关以内。
2、NAT的工作特点
NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。
RFC1918规定l了三个保留的地址段落:10.0.0.0-10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255,分别处于A/B/C类地址,作为内部网络IP
NAT处理报文的几个关键特点:
- NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关
- 网络访问只能先由私网侧发起,公网无法主动访问私网主机
- NAT网关在两个访问方向上完成两次地址的转换和翻译,出方向做源信息替换,入方向做目的信息替换
- NAT网关的存在对通信双方是保持透明的
- NAT网关为了实现双向翻译的功能,需要维护一张表,把回话信息保存下来
其中第二个特点打破了IP协议架构中所有节点在通讯中的对等地位,这是NAT最大的弊端,为对等通讯带来了诸多问题,当然相应的克服手段也应运而生。事实上,第四点是NAT致力于达到的目标,但在很多情况下,NAT并没有做到,因为除了IP首部,上层通信协议经常在内部携带IP地址信息。
3、NAT的实现方式
NAT工作模型有一对一的NAT、一对多的NAT。其中一对一表示一个内部主机占用一个公网IP,这种方式对节约公网IP没有多大意义,主要实现一下特殊需求比如:用户希望隐藏内部主机的真实IP。
NAT工作模型最常用的就是一对多。在一对多模型中,按照端口转换的工作方式不同,又可以更进一步的划分。
3.1、静态NAT
即一对一的NAT,这里只进行IP转换,没有进行端口的转换
![通俗易懂:快速理解P2P技术中的NAT穿透原理_11.png](https://tva1.sinaimg.cn/large/008i3skNly1gq0ve6pvurj30d007ewfu.jpg)
3.2、NAPT
端口多路复用技术。与静态NAT的差别是,NAPT不但要转换IP地址,还要进行传输层的端口转换。具体的表现形式就是,对外只有一个公网IP,通过端口来区别不同私有IP主机的数据。
![通俗易懂:快速理解P2P技术中的NAT穿透原理_22.png](https://tva1.sinaimg.cn/large/008i3skNly1gq0vljoc2gj30hu07k76j.jpg)
3.3、NAPT的四种NAT类型
-
完全锥形NAT(Full Cone NAT)
特点:IP和端口都不受限
表现形式:将来自内部同一个IP地址同一个端口号(IP_IN_A : PORT_IN_A)的主机监听/请求,映射到公网IP某个端口(IP_OUT_B : PORT_OUT_B)的监听。任意外部IP地址与端口对其自己公网的IP这个映射后的端口访问(IP_OUT_B : PORT_OUT_B),都将重新定位到内部这个主机(IP_IN_A : PORT_IN_A)。简单来说就是只要客户端由内到外建立一个映射后,其他外部主机的IP和端口都可以使用这个洞给客户端发送数据。
-
受限锥形NAT(Restricted Cone NAT)
特点:IP受限,端口不受限
表现形式:与完全锥形NAT不同的是,在公网映射端口后,并不允许所有IP进行对于该端口的访问,要想通信必需内部主机对某个外部IP主机发起过连接,然后这个外部IP主机就可以与该内部主机通信了,但端口不做限制。
-
端口受限型NAT(Port Restricted Cone NAT)
特点:IP和端口都受限
表现形式:该技术与受限锥形NAT相比更为严格。除具有受限锥形NAT特性,对于回复主机的端口也有要求。假设内部主机发送过报文给A主机P1端口,那外部主机向内部主机发送UDP报文时候必须要求报文IP是A,端口是P1。这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。
-
对称型NAT(Symmetric NAT)
特点:对每个外部主机或端口的会话都会映射为不同的端口(洞)
表现形式:同一个客户端和不同的目标IP:PORT通信,经过NAT映射后的公网IP:PORT是不同的。此时,如果B想要和客户端通信,也只能通过NatIP:NatPortB(也就是紫色的洞洞)来进行,而不能通过NatIP:NatPortA(也就是黄色的洞洞)。
以上四种类型对NAT的限制是越来越大。
4、NAT的限制与解决方案
IP协议的一个重要贡献就是把世界变得平等,我们熟知的CS体系结构是在应用层协议上的角色区分,而在网络层和传输层没有差异,一个IP地址的主机既可以是客户机,也可以是服务器。
与此同时,很多应用也是把客户端和服务器的角色组合起来来完成功能。而在P2P应用中,一个用户的主机既为下载的客户,同时也向其他客户提供数据,是一种C/S混合的模型。上层应用之所以能这样设计,是因为IP协议栈定义了这样的能力。试想一下,如果IP提供的能力不对等,那么每个通信会话都只能是单方向发起的,这会极大限制通信的能力。
**而NAT最大的弊端正在于此——破坏了IP端到端通信的能力!其次NAT设备会对数据包进行编辑修改,这样就降低了发送数据的效率;此外,各种协议的应用各有不同,有的协议是无法通过NAT的(不能通过NAT的协议还是蛮多的),这就需要通过穿透技术来解决
4.1、NAT弊端
- NAT使IP会话的保持时效变短。由于IP和端口资源有限,所以在会话结束后需要回收资源,即老化操作。基于UDP通信协议很难确定何时通信结束,所以NAT网关主要依赖超时机制回收外部的端口,但是如果应用需要维持连接的时间大于NAT网关的设置,通信就会意外中断。因为网关回收相关转换表资源以后,新的数据到达时就找不到相关的转换信息,必须建立新的连接。当这个新数据是由公网侧向私网侧发送时,就会发生无法触发新连接建立,也不能通知到私网侧的主机去重建连接的情况。这时候通信就会中断,不能自动恢复。即使新数据是从私网侧发向公网侧,因为重建的会话表往往使用不同于之前的公网IP和端口地址,公网侧主机也无法对应到之前的通信上,导致用户可感知的连接中断。很多应用协议的设计者已经考虑到了这种情况,所以一般会设置一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。
- NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就是依赖IP进行主机跟踪的机制都失效了。一个IP被很多用户共享,如果存在恶意的用户行为,很难定位到发起连接的那个主机。
- NAT工作机制依赖于修改IP包头的信息,这会妨碍一些安全协议的工作。因为NAT篡改了IP地址、传输层端口号和校验和,这会导致认证协议彻底不能工作,因为认证目的就是要保证这些信息在传输过程中没有变化。IP分片机制是在信息源端或网络路径上,需要发送的IP报文尺寸大于路径实际能承载最大尺寸时,IP协议层会将一个报文分成多个片断发送,然后在接收端重组这些片断恢复原始报文。IP这样的分片机制会导致传输层的信息只包括在第一个分片中,NAT难以识别后续分片与关联表的对应关系,因此需要特殊处理。
4.2、NAT路由类型判断
根据上面的介绍,我们可以了解到,在实际的网络情况中,各个设备所处的网络环境是不同的。那么,如果这些设备想要进行通信,首先判断出设备所处的网络类型就是非常重要的一步。
举个例子来说:对于IM中的实时音视频功能和VoIP软件,对位于不同NAT内部的主机通信需要靠服务器来转发完成,这样就会增加服务器的负担。为了解决这种问题,要尽量使位于不同NAT内部的主机建立直接通信,其中,最重要的一点就是要判断出NAT的类型,然后才能根据NAT的类型,设计出直接通信方案。不然的话,两个都在NAT的终端怎么通信呢?我们不知道对方的内网IP,即使把消息发到对方的网关,然后呢?网关怎么知道这条消息给谁,而且谁允许网关这么做了?
为了解决这个问题,也就是处于内网的主机之间能够穿越它们之间的NAT建立直接通信,已经提出了许多方法,STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)技术就是其中比较重要的一种解决方法,并得到了广泛的应用。
参考链接:
http://www.52im.net/thread-50-1-1.html
http://www.360doc.com/content/14/0305/17/8285430_357987074.shtml
http://www.52im.net/thread-1055-1-1.html
《计算机网络自顶向下方法》