网络地址转换

NAT概述

       网络地址转换(Network Address Translation,NAT)诞生于1994年,它的提出是在IPv4地址资源面临枯竭的背景下。NAT的设计初衷之一是为了作为IPv6全面部署之前的过渡策略(虽然现在已成为IPv6部署推进滞后的原因之一),采用NAT滞后,互联网地址就不再需要时全球唯一的,因此可以在互联网的不同部分(称为地址范围(address realm))被重复使用。允许在多个范围中的地址重复使用,大大缓解了地址耗尽的问题。此外,NAT可以与防火墙相结合形成复合设备,这种设备已成为用于连接终端用户最为常见的路由器类型。

       NAT本质上是一种允许在互联网的不同地方重复使用相同的IP地址集的机制(如上图所示)。建立NAT的主要动机是正在急剧减少的有限IP地址空间。使用NAT最常见的情况是,唯一与Internet连接的站点仅被分配了很少的几个IP地址(甚至只有一个IP地址),但是内部却有多台主机需要同时上网。当所有进出的流量均通过一个单独的NAT设备时,该设备将内部系统的地址空间和全球互联网地址空间分割开,因此所有的内部系统可以使用本地分配的私有IP地址访问互联网。

       NAT的引入用以解决两个问题:IP地址枯竭和关于路由可扩展性的担忧。NAT刚推出的时候仅作为权宜之计,知道一些具有更大地址空间的协议(IPv6)被广泛部署为止。无类别域间路由(CIDR)的发展解决了路由可扩展性的问题。NAT则减少了对具备全局路由的互联网地址的需求,同时提供了一些防火墙的功能,并且仅需要很少的配置。但具有讽刺意味的是,快速发展和广泛使用的NAT却严重影响了IPv6的推进进程(在IPv6的诸多益处中,其中一项就是不再需要NAT)。

       NAT存在几个缺点,最明显的是,需要做特殊配置才能使处于NAT内部的主机能够提供可供互联网访问的服务,因为互联网上的用户无法直接访问具备私有地址的主机。此外,为了使NAT正常工作,每一个隶属于同一个连接或关联的双向数据包都必须通过相同的NAT。这是因为NAT必须重写每个数据包的寻址信息,以便私有地址空间的系统和Internet主机之间能够正常通信。在许多方面,NAT和互联网协议的基本宗旨是背道而驰的。

       NAT的工作原理就是重写通过路由器的数据包的识别信息。这种情况常发生在数据传输的两个方向上。在这种最基本的形式中,NAT需要重写往一个方向传输的数据包的源IP地址,重写往另一个方向的数据包的目的IP地址。这允许传出的数据包的源IP地址变为NAT路由器中面向Internet的网络接口地址(全局地址)而不是原始主机的接口地址。通俗来说,NAT路由器将其管理的内部主机发送的数据包的源IP地址由局部地址变为全局地址,从外部传输过来的数据包则做相反转换以分配到合适的内部主机。因此,在互联网上的主机看来,数据包是来自于具备全局路由IP的NAT路由器,而不是位于NAT内部的私有地址的主机。大多数的NAT同时执行转换(translation)和包过滤(packet filtering)。

基本NAT和NAPT

       传统的NAT包括基本NAT(basic NAT)和网络地址端口转换(Network Address Port Translation,NAPT)。基本NAT只执行IP地址的重写,本质上就是将私有地址改写为一个公共地址——往往取决于一个由ISP提供的地址池或公有地址范围。basic NAT也分为静态和动态两种,主要区别是其维护的NAT地址映射表的一对一映射关系是静态不变的还是动态可变的。basic NAT无助于减少需要使用的IP地址数量,因为这要求全局可路由的地址数量必须大于或等于希望同时访问Internet的内部主机数量。

       NAPT也称为IP伪装,它使用传输层标识符(即TCP和UDP端口,ICMP查询标识符)来确定一个特定的数据包到底和NAT内部的哪台主机关联。即改变外出数据包的源端口并进行端口转换,采用端口多路复用(Port Address Translation,PAT)的方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,可以最大限度地节约IP地址资源。这使得大量的内部主机能够同时访问互联网,而使用的公有地址数量却很少,通常只需一个。同时,也可以隐藏网络内部的所有主机,有效避免来自Internet的攻击。

地址冲突解决

       在NAT内部使用的地址范围不受除了本地网络管理员之外的任何人的限制。因此,有可能在私有地址范围内采用全局地址空间。然而,当这样的全局地址也被互联网上的另一个实体所使用时,在私有范围内的本地系统极有可能无法达到使用相同地址的公共系统,这是因为采用相同地址的本地系统会屏蔽掉使用相同地址的远端系统。为了避免这种不良情况的发生,保留了三个IPv4地址范围作为私有地址范围使用:10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。这些地址范围经常被用来作为嵌入式DHCP服务器(DHCP传送门)的地址池的默认值。

       实际上,所谓的私有地址,是RFC1918规定的前述三块地址范围。这三块私有地址本身是可路由的,只是公网上的路由器不会转发这三块私有地址的流量;当一个公司内部配置了这些私有地址后,内部的计算机在和外网通信时,边界路由会通过NAT或者NAPT技术,将内部的私有地址转换成外网IP,外部看到的源地址是边界路由转换过的公网IP地址,这在某种意义上也增加了内部网络的安全性。

NAT映射

       在如图所示的NAT网络模型中,内部地址为(X:x)的主机要与外部主机通信,需要使用一个外部地址(X':x'),NAT负责创建一个由(X:x)到(X':x')的地址映射。假设内部主机先连接到(Y1:y1),再连接到(Y2:y2),NAT需先创建(X:x)到(X1':x1')的映射,再创建(X:x)到(X2':x2')的映射。在大多数情况下,X1'等于X2',因为大多数网站只使用一个全局路由的IP地址。如果x1'等于x2',映射被认为是重复使用的。如果x1'和x2'均与x相等,NAT实现的是称为端口保留的动作。在某些情况下,端口保留是不可能的,所以NAT必须处理端口冲突问题。

       参照上图,如果对于任何Y1:y1或Y2:y2(即外部主机),X1':x1'等于X2':x2',则NAT存在独立于端点的映射。若当且仅当Y1等于Y2时,X1':x1'才等于X2':x2',则NAT存在地址相关的映射。若当且仅当Y1:y1等于Y2:y2时,X1':x1'才等于X2':x2',则NAT存在地址和端口相关的映射。NAT对信息进行处理的行为按照上述条件进行划分,其分类又可称为全锥形NAT(Full Cone NAT)、地址限制锥形NAT(Address-Restricted cone NAT)、端口限制锥形NAT(Port-Restricted cone NAT)和对称型NAT(Symmetric NAT)。若NAT的外部地址是在没有考虑内部或外部地址的情况下选择的,则拥有多个外部地址的NAT(即X1'可能不等于X2')可任意选择一个地址映射,或者为每个连接选择相同的映射(称为配对)。配对是所有传输层的推荐NAT行为,如果未使用配对(即内部主机与外部主机进行一对一通信时NAT却使用不同的映射),内部主机的通信对等端可能会错误地判断它正与不同的主机进行通信。

发夹和环回

       当客户端希望访问位于同一个NAT私有地址空间内的服务器时(如上图所示),会导致一个有趣的问题。能够支持这种场景的NAT需要实现发夹(hairpinning)或者NAT环回(NAT loopback)。若发送方知道接收方的私有地址,这没有问题,可以直接进行连接。但在某些情况下X1只知道公用地址信息:(X2':x2)。在这种情况下,X1借助(X2‘:x2')尝试连接(X2:x2)。当NAT将数据包发送到对应映射的(X2:x2)时即完成了一个发夹过程。但问题是目的是(X2:x2)的数据包头部中的源地址应该是(X1:x1)还是(X1':x1')呢?答案是前者,这种NAT被称为有“外部源IP地址和端口”的发夹行为是TCP NAT所必需的。之所以需要这种行为,是为了均采用全局路由地址的应用能够识别对方。

NAT的P2P限制

       前面提到过,NAT的设计与互联网协议的基本宗旨是背道而驰的,这其中重要的一点(也是其缺陷)就是破坏了IP端到端通信的能力。其解决方案:NAT穿越写在另一篇博文中。

端到端服务模型

       IP协议的一个重要贡献是把世界变得平等。在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。人们熟知的服务器和客户机实际是在应用协议层上的角色区分,而在网络层和传输层没有差异。一个具有IP地址的主机既可以是客户机,也可以是服务器,大部分情况下,既是客户机,也是服务器。端到端对等看起来是很平常的事情,而意义并不寻常。在以往的技术中,很多协议体系下的网络限定了终端的能力,正是IP的这个开放性,使得TCP/IP协议族可以提供丰富的功能,为应用实现提供了广阔平台。因为所有的IP主机都可以服务器的形式出现,所以通讯设计可以更加灵活。使用UNIX/LINUX的系统充分利用了这个特性,使得任何一个主机都可以建立自己的HTTP、SMTP、POP3、DNS、DHCP等服务。与此同时,很多应用也是把客户端和服务器的角色组合起来完成功能。例如在VoIP应用中,用户端向注册服务器登录自己的IP地址和端口信息过程中,主机是客户端;而在呼叫到达时,呼叫处理服务器向用户端发送呼叫请求时,用户端实际工作在服务器模式下。在语音媒体流信道建立过程后,通讯双向发送语音数据,发送端是客户模式,接收端是服务器模式。而在P2P的应用中,一个用户的主机既为下载的客户,同时也向其他客户提供数据,是一种C/S混合的模型。上层应用之所以能这样设计,是因为IP协议栈定义了这样的能力。如果IP提供的能力不对等,那么每个通信会话都只能是单方向发起的,这会极大限制通信的能力。

       大多数IP流量均使用TCP和UDP在互联网上进行传输,这些协议本身可以很好地被NAT支持而无须增加额外的复杂性。但当应用层协议与它们一起携带传输层或更底层的信息,如IP地址,NAT的问题就会变得复杂很多。因为NAT作为较低层的协议却划分了服务器和客户端两个概念,违背了互联网协议的端到端原则

其他局限性

       NAT的局限性除了前面的破坏了端到端原则以外,还有以下几点:

 1.使得IP协议从面向无连接变成面向连接

       NAT必须维护专用IP地址与公用IP地址以及端口号的映射关系。在TCP/IP协议体系中,如果一个路由器出现故障,不会影响到TCP协议的执行。因为只要几秒收不到应答,发送进程就会进入超时重传处理。而当存在NAT时,最初设计的TCP/IP协议过程将发生变化,Internet可能变得非常脆弱。

2.NAT违反了基本的网络分层结构模型的设计原则

       因为在传统的网络分层结构模型中,第N层是不能修改第N+1层的报头内容的。NAT破坏了这种各层独立的原则。

3.NAT同时存在对高层协议和安全性的影响问题

       RFC对NAT存在的问题进行了讨论。NAT的反对者认为这种临时性的缓解IP地址短缺的方案推迟了Ipv6迁移的进程,而并没有解决深层次的问题,他们认为是不可取的。

                                                          本文部分内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》,有改动

       

猜你喜欢

转载自blog.csdn.net/qq_37653144/article/details/81534621