《深入解析IPv6(第3版)》——1.2 IPv4地址空间受限的后果

本节书摘来自异步社区《深入解析IPv6(第3版)》一书中的第1章,第1.2节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 IPv4地址空间受限的后果

由于IPv4的地址相对比较稀缺,人们只得通过部署NAT来复用IPv4的私有地址空间。在一些配置方案中,在客户端和Internet之间甚至存在多级NAT结构。尽管NAT的确能够让更多的客户端连接到Internet中,但是它也会造成流量瓶颈,并对某些类型的通信造成困难。

让我们考虑一下NAT的运行方式并解释一下为什么网络地址转换是一种扩展性不强的临时替代方案,而且这种方案会对端到端的通信造成不良影响。

例如,如果某个小企业使用了192.168.0.0/24这个私有IPv4地址前缀作为公司的内网地址,而Internet服务提供商为其分配的公共IPv4地址为131.107.47.119。这个企业于是在网络的边缘部署了NAT,将所有位于192.168.0.0/24的私有地址都映射为131.107.47.119的公有地址。于是,NAT会动态选择TCP或UDP端口来将内部数据流映射为外部数据流。图1-1所示为这个配置的示例。

如果一台私有主机分配到了IPv4地址192.168.0.10,这台主机使用Web浏览器来连接位于157.60.13.9的Web服务器,那么这个私有主机就会创建以下这个IPv4数据包。

  • 目的地址:157.60.13.9
  • 源地址:192.168.0.10
  • 目的TCP端口:80
  • 源TCP端口:1025

然后,这个IPv4数据包就会被发送给NAT,而NAT会将出站数据包的源地址和源TCF端口号转换为:


<a href=https://yqfile.alicdn.com/c615e81b5e1b3e7b01911220da2e3821424ec4b1.png" >
  • 目的地址:157.60.13.9
  • 源地址:131.107.47.119
  • 目的TCP端口:80
  • 源TCP端口:5000

NAT会将{192.168.0.10 TCP 1025}与{131.107.47.119 TCP 5000}之间的映射关系保存在一个本地转换表中,以备将来调用。

转换后的IPv4数据包会在互联网中进行传输,Web服务器会发送响应消息,这个消息随后被NAT接收到。这个接收到的消息包含的信息为:

  • 目的地址:131.107.47.119
  • 源地址:157.60.13.9
  • 目的TCP端口:5000
  • 源TCP端口:80

NAT会查找转换表,并找出初始数据包发送过来时所创建的那个条目,然后根据这个条目来转换数据包的目的地址和目的TCP端口,并将数据包发送给主机192.168.0.10。发送出去的数据包包含的信息为:

  • 目的地址:192.168.0.10
  • 源地址:157.60.13.9
  • 目的TCP端口:1025
  • 源TCP端口:80

对于NAT的出站数据包,它的源IPv4地址(私有地址)会被映射为ISP分配的地址(公有地址),而它的源TCP/UDP端口号则会被映射为不同的TCP/UDP端口号。对于NAT的入站数据包,它的目的IPv4地址(公有地址)会被映射为原先的内部地址(私有地址),而它的目的TCP/UDP端口号则会被映射回原先的TCP/UDP端口号。

一般的网络地址转换依靠如下方法实现。

  • 地址转换:转换IPv4头部的IPv4地址。
  • 端口转换:转换TCP头部的TCP端口号或UDP头部的UDP端口号。
  • 地址和端口转换会降低NAT的转发性能,这是因为NAT必须为每个数据包分别执行上述额外的操作。因此,NAT往往不会被部署在大型环境中。不过,最新开发的标准(如运营商级NAT[CGN])承诺可以将NAT扩展到大型企业或ISP环境中。

若要修改IPv4包中除了地址以及端口以外的内容,NAT需要执行额外的处理过程,同时还需要额外的一个程序组件,叫做NAT编辑器(NAT editor)。不过,万维网(WWW)上传输的HTTP(超文本传输协议)流量不需要NAT编辑器,因为所有的HTTP传输仅仅需要进行地址和TCP端口转换。然而,以下情况都需要使用到NAT编辑器。

IPv4地址、TCP端口或UDP端口存储在有效负载的其他地方。例如,FTP(文件传输协议)的FTP PORT命令会把用点分十进制表示的IPv4地址存储在FTP头部。因此,如果NAT没有正确地为FTP端口命令转换FTP头部的IPv4地址并调整数据流中的TCP序列号,那么会发生连接问题或数据传输问题。
非TCP或UDP标识的数据流。例如,PPTP(点对点隧道协议)就不会使用TCP或UDP来传输数据。它是使用GRE(通用路由封装)的头部,及GRE头部的Call ID字段来标识数据流的。因此,如果NAT没有正确地转换GRE头部中的Call ID字段,也会发生连接问题。
大多数传输都能过穿越NAT技术,因为数据包要么只需进行地址或端口转换就可以满足转换需求,要么就会有NAT编辑器来正确地修改有效负载。不过,仍然有些传输是无法穿越NAT的。比如,如果需要转换的数据位于数据包中加密的部分,就无法对其进行转换。因为,地址或端口转换会破坏IPSec保护的数据包的完整性。目前,IPSec NAT-T(NAT-Traversal)技术可以对某几类IPSec保护的数据包进行NAT转换,它是当前的互联网标准。

除此之外,NAT还存在一个问题,那就是它会对对等体之间的应用造成影响。在对等体之间进行通信的过程中,每一个对等体扮演的角色既是客户端,又是服务器,并且都会向对端发起通信。如果其中某个对等体在NAT身后,那么它有出现了两个地址:一个是在NAT身后的地址(即私有地址);另一个是在NAT前的地址(即公有地址)。

请看下面一个简单的网络拓扑,在这个配置中NAT就会导致对等体之间的应用出现问题。图1-2所示为一个在边缘部署了NAT的内联网。


<a href=https://yqfile.alicdn.com/3c5f8fb8b87505f4d37d742ad598902b85ff5b21.png" >

由于所有主机都运行了对等体间的应用,因此主机A就可以向主机B(直连)与主机C发起会话。但是,主机A无法将主机B的公有地址和端口号告知主机C,因为主机A自己也不知道。同样,主机C也无法发起与主机A或主机B的会话,因为没有现成的转换条目可以将入站的连接请求数据包转换为主机A的私有地址和端口号。即使有转换表,主机C也不一定能发起与主机A与主机B的会话,因为在它看来,这两台主机使用的是同一个IPv4地址。

更麻烦的一点是,目前很多Internet对等体都位于NAT的身后。为了解决这个问题,对等体间应用或多方通信应用(multiple-party application)就必须有能力感知到NAT的存在,或者它们必须使用某些NAT穿越技术,而这无疑会让问题变得更加复杂。同样,一些可以感知NAT的程序都会使用一台回声服务器(echo server)来自动发现自己的地址和端口号,但为了在Internet上部署和维护回声服务器,独立软件供应商(Independent Software Vendor, ISV)就不得不增加开支。

NAT只是延长IPv4公有地址寿命的权宜之计,而不是IPv4公有地址空间问题的最终解决方案。NAT只有在客户端设备位于NAT之后,需要向服务器发起会话,建立客户端/服务器模式的通信时,才能很好地发挥其复用私有地址空间的功效。而大部分服务器设备仍需要明确的公用地址。服务器也可以置于NAT之后,但是这样的话,就必须为NAT手动配置一个静态的转换条目表,以便将入站数据包转换给服务器的内部地址和端口。由于在对等体之间的通信中,每个点既是客户端又是服务端,因此,被NAT分隔在两边的对等体就未必能够正确地进行传输,因此这些应用必须具备可感知NAT的能力。

你可能感兴趣的:(《深入解析IPv6(第3版)》——1.2 IPv4地址空间受限的后果)