4.1 NAT 操作

NAT的详细描述请参见RFC 1631。与CIDR(Classless Iinterdomain Routing,无类别域间路由)类似,NAT的本意也是通过利用较少的公有IP地址来表示大量私有IP地址的方式来降低IP地址空间的耗用速度,但此后用户发现NAT在网络迁移和融合、服务器负载共享以及创建“虚拟服务器”等方面也非常有用。本节将逐一介绍这些应用场景。在这之前,首先介绍NAT的功能及相关术语。

4.1.1 NAT 基本概念

图4-1描述了一个简单的NAT功能。设备A拥有一个属于私有地址空间(由RFC 1918所指定)的IP地址,而设备B拥有一个公有IP地址,当设备A向设备B发送数据包时,数据包需要穿越一个运行了NAT功能的路由器,由NAT路由器将数据包源地址字段中设备A的私有IP地址(192.168.2.23)替换成可以在Internet进行路由的公有IP地址(203.10.5.23),并转发数据包。当设备B向设备A发送应答数据包时,数据包的目的地址将是203.10.5.23,因而该数据包仍要经过NAT路由器,由SSNAT路由器将目的地址替换成设备A的私有IP地址。

img254a

图4-1 NAT路由器将设备A的私有IP地址(192.168.2.23)替换成公有可路由的IP地址(203.10.5.23)

对NAT操作中所涉及的端系统来说,NAT操作是完全透明的。如图4-1所示,设备A仅知道其IP地址是192.168.2.23,而不知道地址203.10.5.23。另一方面,设备B认为设备A的地址就是203.10.5.23,根本不知道地址192.168.2.23,该私有地址对设备B来说。是隐而不见的。

NAT可以进行双向地址隐藏。如图4-2所示,在设备A和设备B上同时执行了NAT,设备A认为设备B的地址是172.16.80.91,而实际上设备B的真实地址是92.31.7.130。可以看出,为支持该地址方案,NAT路由器需要在双向转换源地址和目的地址。

img254b

图4-2 NAT路由器在双向转换源地址和目的地址

Cisco NAT设备将NAT世界划分为内部(inside)和外部(outside)两部分,内部网络通常是私有企业或ISP,外部网络是公共Internet或面向Internet的服务提供商。此外,Cisco NAT设备将地址也划分为本地(local)地址和全局(global)地址,本地地址是内部网络中设备看见的地址,全局地址则是外部网络中设备所看见的地址。根据上述4个术语,可以将地址归入以下4类。

IL(Inside Local,内部本地地址):分配给内部设备的地址,这些地址不会被宣告到外部网络。

IG(Inside Global,内部全局地址):内部设备被外部网络所知晓的地址。

OG(Outside Global,外部全局地址):分配给外部设备的地址,这些地址不会被宣告到内部网络。

OL(Outside Local,外部本地地址):是外部设备被内部网络所知晓的地址。

如图4-2所示,设备A和设备B分别位于内部网络和外部网络,192.168.2.23是内部本地地址,203.10.5.23是内部全局地址,172.16.80.91是外部本地地址,192.31.7.130是外部全局地址。

IG地址被映射到IL地址,OL地址被映射到OG地址,NAT设备在地址转换表(address translation table)中跟踪地址映射情况。例4-1显示了图4-2中NAT路由器的地址转换表,该表包含了3个表项,从下往上看,第一个表项将OL地址172.16.80.91转换为OG地址192.31.7.130,第二个表项将IG地址203.10.5.23转换为IL地址192.168.2.23,这两个表项都是静态表项,是在配置路由器转换指定地址时创建的。最后(顶部)一个表项将内部地址转换为外部地址,该表项是动态表项,是在设备A首次将数据包发送给设备B时创建的。

例4-1:图4-2中NAT路由器的地址转换表。

img255

如前所述,NAT表项可以是静态表项或动态表项。静态表项是本地地址与全局地址之间的一对一映射,也就是说,将一个惟一的本地地址映射到一个惟一的外部地址。动态表项可以是多对一或一对多映射,多对一映射是指可以将多个地址映射到单个地址,而一对多映射则是指可以将单个地址映射到多个可用地址中的某一个地址。

下面将描述NAT的各种常见应用场景,并进一步说明静态NAT以及多种动态NAT的实现方式。

4.1.2 NAT 与 IP 地址保护

NAT的最初使命就是要减缓IP地址的耗用速度,这也是RFC 1631的重点。NAT概念的主要假设就是每个企业在任何时刻仅有少量主机连接到Internet上,而且某些设备(如打印服务器和DHCP服务器)根本就不需要连接到企业外部,因而企业可以从RFC 1918定义的私有地址空间中为网络设备分配IP地址,而将数量少得多的所分配的公有IP地址放置到企业边缘的NAT地址池中(如图4-3所示)。非惟一的私有地址是IL地址,而公有地址则是IG地址。

当内部设备向Internet发送数据包时,NAT设备会从内部全局地址池中动态地选择一个公有IP地址,并将其映射到该设备的内部本地地址,该映射操作将被记录在NAT表中。如例4-2所示,图4-3中来自企业的3个内部地址(10.1.1.1.20、10.1.197.64和10.1.63.148)通过NAT向外发送数据包,并且,来自IG池的3个地址(205.110.96.2、205.110.96.3和205.110.96.1)被分别映射到IL地址。

img256a

图4-3 在本NAT设计方案中,公有IP地址池为8倍数量的私有地址空间提供服务

例4-2:图4-3中3个来自内部本地地址空间的地址被动态映射到3个来自内部全局地址池的地址

img256b

来自外部设备(响应内部设备)的所有数据包的目的地址都是IG地址,为了确保指定连接的所有数据包都能被正确转换,要求必须在NAT表中为最初的映射关系保持一段时间。同时,当同一台设备周期性地向同一个或多个外部目的地发送数据包时,在NAT表中为表项保持一段时间也有助于减少随后的查找操作。

当表项第一次进入NAT表时,同时启动了一个定时器,该定时器的周期被称为转换超时时间(translation timeout)。每当该表项被用于转换数据包的源地址或目的地址后,该定时器就被重置。如果定时器到期,则将从NAT表中删除该表项,而动态分配的地址也将回到地址池中。Cisco的默认转换超时时间为86 400秒(即24小时),可以利用命令ip nat translation timeout来更改该默认时间。


注意: 默认转换超时时间与协议类型有关,后面的表4-3中列出了不同协议的转换超时时间值。


由于多个IL地址都可以映射到地址池中的每个IG地址,因而这种NAT应用属于多对一应用,对图4-3所示应用场景来说,就是8对1的转换关系。这个概念读者应该很熟悉,电话公司就是利用这种概念来设计交换机和中继电路的,设计容量只要同时满足全部用户中的一部分即可,航空公司利用这种概念对外超额预定航班。我们可以将这种应用理解为将IL地址统计复用到IG地址上,但是这种应用的风险(与电话公司和航空公司一样)就是一定要清楚峰值利用周期以及容量被全部耗尽时的风险。

对多对一应用来说,没有严格的本地地址空间与地址池大小的比例限制。对图4-3来说,为了满足特定需求,可以进一步扩大和/或缩小IL/IG的地址范围。例如,即便是包含了16 000 000个地址的IL地址范围10.0.0.0/8,也可以被映射到仅包含4个地址(甚至更少)的地址池——205.110.96.1〜205.110.96.4。真正的限制不是特定IL地址范围内的地址数量,而是使用该地址的实际设备数量,如果只有4台设备使用10.0.0.0/8范围内的地址,那么地址池中最多只需要4个地址,但如果内部网络的设备达到500 000台,那么就需要更大的地址池了。

当动态地址池中的地址出现在NAT表中时,就不能再用于映射其他地址了。如果地址池中的地址都被耗尽了,那么随后要穿越NAT路由器的内部数据包都将无法进行地址转换,从而被丢弃。因而一定要确保NAT池足够大且转换超时时间足够小,从而保证动态地址池永远不会被耗尽。

几乎所有企业都拥有邮件、Web及FTP服务器等需要从外部可访问的系统,而且这些系统的地址必须保持不变,否则外部主机将无法知道每次该如何到达这些系统,因而这些系统无法使用动态NAT,必须将它们的IL地址静态映射到IG地址上,而这些用于静态映射的IG地址则不能进入动态地址池。虽然这些IG地址被永久记录在NAT表中,但仍然可以从动态地址池中选择这些地址,从而会产生地址歧义。

本小节描述的NAT技术对一个不断增长的企业来说非常重要,与其不断从地址管理机构或ISP处申请更多的IP地址空间,还不如将现有的公有IP地址放置到NAT池中,并采用私有地址空间为内部网络设备重新编址。根据企业规模的大小和现有地址的分配结构,可以一次性完成重新编址工作,也可以逐步分期分布完成。

4.1.3 NAT 与 ISP 迁移

如第2章中描述的那样,CIDR的一个缺陷就是会增大用户更换ISP时的难度。如果用户已经从ISP1处分配到了地址块,但又希望将Internet服务提供商更换为ISP2,则只能将ISP1的IP地址归还给ISP1,并从ISP2处重新获取IP地址,这种地址退还工作对企业来说十分困难,而且花费不菲。


提示: 不应该过分强调地址迁移工作的难度和花费,如果在最初的时候就做好地址规划,将能极大地减轻这种地址迁移工作。


假设ISP1(拥有CIDR地址块205.113.48.0/20)为其用户A分配了一个地址空间205.113.50.0/23,如果用户A决定将其Internet服务迁移到ISP2(拥有CIDR地址块207.36.64.0/19),ISP2又为用户A分配了一个新的地址空间207.36.76.0/23,此时,用户A无需为其内部系统重新分配IP地址,只要使用NAT即可(如图4-4所示)。虽然将地址空间205.113.50.0/23退还给了ISP1,但用户A仍然可以使用该地址空间作为IL地址,虽然该地址空间来自公有地址空间,但用户A可以不再使用该地址空间将其互连网络联接到公众Internet上。同时,将来自ISP2的地址空间207.36.76.0/23作为IG地址,并将IL地址映射(静态或动态)到这些IG地址上即可。

该NAT应用方案的一个风险就是内部本地地址有可能会被泄露到公众Internet上,如果发生了这种情况,那么被泄露地址将与合法拥有该地址的ISP1相冲突。如果ISP2使用了严格的路由过滤机制,那么这样的错误将不会泄露到Internet上。但是应该像第2章所强调的那样,任何时候都不应假设AS外部对等体能正确进行路由过滤。因而在使用这种NAT应用方案时要特别谨慎,在允许数据包进入ISP2之前必须转换所有的IL地址。

img258a

图4-4 该企业用户虽然拥有一个属于ISP1的内部本地地址空间,但属于ISP2的用户,因而使用NAT将其IL地址转换到分配自ISP2的CIDR地址块的IG地址

本NAT应用方案衍生出来的另一个问题是ISP1很可能会将地址空间205.113.50.0/23重新分配给其他用户B,那么用户A将无法到达用户B。例如,假设用户A网络中的某台主机希望将数据包发送到newbie@ISPl.com,DNS将会把目的地址解析为205.113.50.100,发送数据包的主机也将使用该地址。但不幸的是,该地址被主机误认为是用户A本地网络中的地址,从而数据包会被错误路由或被丢弃。

通过上面的案例,希望用户明白本小节所讨论的地址迁移方案虽然暂时非常有用,可以降低当前迁移的复杂度,但用户最终应该将内部网络重新编址为私有地址。

4.1.4 NAT 与多归属自治系统

CIDR的另一个不足之处在于很难实现多归属到不同的服务提供商。图4-5重新分析了第2章曾经讨论过的问题,用户多归属到ISP1和ISP2,并拥有一个CIDR地址块(属于ISP1地址块中的子网),为了与Internet建立正确的通信关系,ISP1和ISP2都需要宣告该用户的地址空间205.113.50.0/23。如果ISP2不宣告该地址,那么该用户的所有入站流量都将经过ISP1;如果ISP2宣告了205.113.50.0/23,而ISP1仅宣告自己的CIDR地址块,那么该用户的入站流量将匹配精确路由,从而全部选择ISP2,这样就会产生以下问题。

img258b

图4-5 由于多归属用户的CIDR地址块是ISP1的CIDR地址块的一个子网,因而ISP1和ISP2都得宣告精确聚合路由

•ISP1必须在其CIDR地址块中“打孔”。这就意味着可能需要在很多路由器上修改相应的过滤器和路由策略。

• ISP2必须宣告其竞争对手的部分地址空间,而这样做很可能会引起这两个ISP的反感。

•宣告用户的精确地址空间,那就意味着会弱化CIDR在控制Internet路由表规模方面的效率。

•某些全国性的服务提供商不接受长于/19的前缀,也就意味着Internet上的某些地方将无法知道该用户经过ISP2的路由。

图4-6显示了通过NAT来解决CIDR在多归属环境中的问题的方法:在连接ISP2的路由器上配置网络地址转换,将IG地址池设置为ISP2分配的CIDR地址块。这样,ISP2就不用再宣告ISP1的地址空间,ISP1也无需再宣告该用户的精确路由,该用户企业网中的主机既可以通过选择最靠近的边缘路由器来访问Internet,也可以通过设置一定的路由策略来访问Internet。对主机发送出来的数据包来说,无论经过哪台路由器,其IL地址都一样;但是,如果数据包是要发送给ISP2,那么就需要进行地址转换。因而从Internet的角度来看,根据转发数据包的ISP不同,来自用户的数据包中的源地址也将不同。

img259a

图4-6 利用NAT来解决图4-5中CIDR所遇到的问题

图4-7 给出了更有效的设计方案:在两台边缘路由器上都实施NAT,来自每个ISP的CIDR地址块都设置为各自NAT中的IG地址池,IL地址来自私有地址空间10.0.0.0。这样该企业用户就可以更加容易地更改ISP,所要做的只是在变更ISP时重新配置其IG地址池。

img259b

图4-7 该企业用户的IL地址与任何ISP都没有关系,ISP分配的CIDR地址块都成为NAT内部全局地址池

4.1.5 端口地址转换

前面所讨论的NAT多对一应用是一种将大量地址统计复用到一个较小的地址池的应用技术,但也有一对一的地址映射应用。例如,当来自内部全局地址池的地址被映射到内部本地地址时,在第一次映射被清除之前,这些IG地址将不能被映射到其他地址。不过,NAT有一种特定功能,可以将多个地址同时映射到单个地址,Cisco将这种功能称为PAT(port address translation,端口地址转换),某些场合也将这种功能称为NAPT(network address and port translation,网络地址和端口转换)或IP伪装(IP masquerading),有时也被称为地址超载(address overloading)。

TCP/IP会话并不是两个IP地址之间的包交换,而是两个IP套接字之间的包交换。所谓的套接字就是(地址,端口)二元组,如Telnet会话可以由(192.168.5.2,23)和(172.16.100.6,1026)之间的包交换组成。PAT会同时转换IP地址和端口号,来自不同地址的数据包可以被转换为同一个地址,但相应的端口号不相同,这样就可以共享同一个地址了。图4-8解释了PAT的工作原理。

img260

图4-8 PAT同时转换IP地址和相关的端口号,因而允许多台主机同时使用同一个全局地址

如图4-8所示,4个携带内部本地地址的数据包到达NAT路由器,其中数据包1和数据包4的地址相同但源端口号不同,数据包2和数据包3的地址不同但源端口号相同。NAT路由器将这4个数据包的源地址都转换为同一个内部全局地址,由于这些数据包拥有不同的源端口号,因而仍保持着惟一性。通过转换端口号,大约可以将32 000个不同的内部本地套接字转换到同一个内部全局地址,因而对SOHO(Small Office/Home Office,小型办公室/家庭办公室)应用环境来说,PAT是一种非常有用的应用工具。此时,在去往ISP的单连接上,多台网络设备只需要一个IP地址。

4.1.6 NAT 与 TCP 负载分发

利用NAT可以将多台相同的服务器表示为单个地址。如图4-9所示,外部网络设备到达的服务器地址都是206.35.91.10,但实际上内部网络中存在4台镜像服务器,NAT路由器采取轮询(round-robin)方式在这4台服务器之间分发会话,即数据包1~4(每个数据包都来自不同的源地址)的目的地址被转换为服务器1~4,而数据包5(来自另一个源地址的会话)则将被转换到服务器1。

img261

图4-9 发送给服务器集群(由单个地址206.35.91.10来表示)的TCP数据包以轮询方式被分别转换到4台相同服务器的真实地址

很明显,图4-9中的4台服务器必须提供相同的可访问内容。这是因为,访问服务器集群的主机可能这次选中的是服务器2,而下一次选中的则可能是服务器4,只有这样才能保证让主机在任何时刻都觉得访问的是同一台服务器。

该应用方案与基于DNS的负载共享方案类似。DNS的负载共享方案是采取轮询方式将同一个名字解析为多个不同的IP地址,该方案的不足之处在于主机接收到名字/地址解析结果后会缓存该解析结果,以后的会话将被发往同样的地址,从而降低了负载共享的效率。而基于NAT的负载共享方案仅在打开一个新的来自外部网络的TCP会话时才进行地址转换,因而可以更均衡地实现负载分发操作。对NAT TCP负载均衡来说,NAT路由器不会转换任何非TCP包的地址。

需要注意的是,与基于DNS的负载均衡类似,基于NAT的负载均衡也不稳定,因为NAT路由器并不感知服务器的故障,仍然会将数据包转换到该故障服务器的地址。这样一来,一台故障或离线服务器就会造成去往该服务器集群的流量出现路由黑洞。

4.1.7 NAT 与虚拟服务器

NAT技术不仅可以让外部通过同一个地址访问所有服务,还可以将多种服务分发到不同的地址(如图4-10所示)。

img262

图4-10 让NAT基于目的端口号将入站数据包转换到不同的地址

如图4-10所示,企业拥有一台邮件服务器(本地地址为192.168.50.1)和一台HTTP服务器(本地地址为192.168.50.2.),这两台服务器的全局地址均为206.35.91.10。当外部主机向内部网络发送数据包时,NAT路由器除了要检查目的地址之外,还要检查目的端口号。如图4-10所示,主机向206.35.91.10发送了一个目的端口号为25(表示邮件)的数据包,由NAT路由器将该数据包的目的地址转换为邮件服务器的地址192.168.50.1;同一台主机发出的目的端口号为80(表示HTTP)的数据包,则被NAT路由器将该数据包的目的地址转换为Web服务器的地址192.168.50.2。