4.3 NAT 配置

配置NAT的第一步就是指定内部和外部接口,除此之外,具体配置与配置静态NAT或动态NAT有关。对静态NAT来说,在NAT表中创建一个合适的映射表项即可;对动态NAT来说,需要创建一个供地址转换时使用的地址池,并创建访问列表以标识需转换的地址,最后再利用一个命令将地址池和访问列表关联起来。

本节将示范NAT常见应用环境中的各种常规配置技术。

4.3.1 案例研究:静态NAT

如图4-15所示,内部网络采用10.0.0.0地址空间进行编址,主机A和主机C必须能够与外部网络进行通信,这两台设备的IP地址被转换成公有IP地址204.15.87.1/24和204.15.87.2/24。

img270b

图4-15设备A和C的内部本地地址都被路由器Mazatlan中的NAT进程静态转换为内部全局地址

例4-4显示了在Mazatlan上实现NAT的配置情况。

例4-4:在 Mazatlan上实现静态NAT。

img271a

路由器的E0接口被命令ip nat inside指定为内部接口,帧中继子接口 S1.705被命令ip nat outside指定为外部接口。

接下来,内部本地地址被命令ip nat inside source static映射到内部全局地址。上例中使用了两次该命令,分别用于主机C和主机A。例4-5显示了NAT表的情况。

例4-5:主机C和A的IL地址被静态转换为IG地址。

img271b

当主机A或C向外部网络发送数据包时,Mazatlan可以在其NAT表中查找到源地址,并进行正确的地址转换。路由器Acapulco有一条去往网络204.15.87.0的路由(对本例来说是一条静态路由),但并不知道网络10.0.0.0,因而Acapulco和主机D可以响应来自主机A和C的数据包。如果主机B或路由器Veracruz向主机D发送数据包,将正常转发该数据包,不进行地址转换;但是当主机D响应未转换的IL地址时,由于Acapulco无相关路由,因而将丢弃该响应数据包,如例4-6所示。

例4-6:当图4-15中的主机D响应主机B未被转换的IL地址时,Acapulco无网络10.0.0.0路由,因而将丢弃该响应数据包。

img271c

外部全局地址也可以被静态转换为外部本地地址。例如,假设图4-15中内部网络的管理员希望主机D “看起来”是内部网络的一部分,也就是说,使用地址10.1.3.1。例4-7显示了路由器Mazatlan的NAT配置情况。

例4-7:让Mazatlan将外部全局地址静态转换为外部本地地址。

img272a

除了加入命令ip nat outside source static之外,路由器Mazatlan的NAT配置没有发生其他变化。命令ip nat outside source static在本例中的作用是将OG地址201.114.37.5映射为OL地址10.1.3.1。例4-8给出了NAT表的结果。

例4-8:通过在Mazatlan上增加一条命令,将OG-to-OL映射加入到了NAT表中。

img272b

虽然本案例研究仅包含了静态映射,但如例4-9所示,当流量在主机A和主机D、主机C和主机D之间传递时,也同时发生了动态映射。在每种情况下,内部映射都被自动映射为外部映射。

例4-9:主机A和C的内部地址被自动映射到主机D的外部地址。

img272c

需要注意的是,本配置并不会阻止内部网络的主机向主机D的OG地址(而不是OL地址)发送数据包。如图4-16所示,主机A能够成功地ping主机D的OL(10.1.3.1)地址或OG地址(201.114.37.5)。

img272d

图4-16 主机A可以向主机D的OL地址或OG地址发送数据包

事实上,调试例4-10中主机 C的输出结果能够更详细地揭示出网络的行为,主机 C向主机 D的 OG地址发起 ping操作,但应答包显示的源地址却是主机 D的 OL地址。去往目的地201.114.37.5的ICMP Echo Request(回显请求)包在穿越NAT设备时未被更改,但源地址为201.114.37.5的 ICMP Echo Reply(回显应答)包在穿越NAT设备时却被更改为OL地址。

例4-10:虽然主机C是向201.114.37.5发起ping,但NAT设备却将应答包的源地址更改为10.1.3.1。

img273a


提示: 如果准备在实验室中重新演练本案例,那么例4-10将揭示一个非常有用的技巧。主机C实际上是一台禁用了IP路由选择(no ip routing)的Cisco路由器,并利用命令ip default-gateway指向Veracruz的本地附属接口。如例4-10所示,这样就可以使用IOS的扩展调试工具,从而能够从主机的视角来观察网络的行为。


如果内部网络的管理员希望阻止流量被发送到OG地址,那么就需要实现路由过滤器(如例4-11所示)。

例4-11:通过路由过滤器来阻止内部网络流量被发送到OG地址。

img273b

请注意,在接口E0上应用了入站过滤器。必须在转换地址之前应用路由过滤,在接口S1.705上应用的出站过滤器无法区分被转换后的目的地址。图4-17给出了过滤结果,主机A仍然能够到达主机D的OL地址,但所有发往OG地址的数据包都被阻塞了。

img274a

图4-17 在Mazatlan上实施了路由过滤之后,内部主机只能通过主机D的OL地址到达主机D

通过例4-10的debug输出结果以及例4-6,可以看出NAT本身并不能保证不将私有地址或非法IP地址泄露到公众Internet。明智的管理员会在连接ISP的接口上过滤私有的A、B、C类地址,明智的ISP也会在连接其用户的接口上做同样的事情。

对本案例研究中的不同配置来说,一个主要难点就在于几乎没有任何“现实中的”设备会使用IP地址去访问其他设备,它们几乎无一例外地都使用域名,因而DNS服务器中必须拥有正确的、与其所在的NAT侧相关联的IP地址。在图4-18中,内部网络和外部网络中都放置了DNS服务器,DNS1可能会有以下域名到地址的映射项:

img274b

图4-18 DNS1是内部网络的权威服务器,DNS2是外部网络的权威服务器

此处的所有主机都有本地地址(内部网络的本地地址)。DNS2可能会有以下域名到地址的映射项:

HostD.outsidenet.com IN A 201.114.37.5

这些表项都被映射到全局地址。DNS1是inside.net的权威服务器,DNS2是outside.net的权威服务器。例4-12给出了Mazatlan的配置情况。

例4-12:Mazatlan的NAT配置,支持图4-18中的DNS1和DNS2。

img275a

除了3台内部主机和1台外部主机之外,例4-12的配置中还有2台DNS服务器。如果主机A希望向主机D发送数据包,那么就需要先向DNS1发送一条DNS查询消息,以获取HostD.outsidenet.com的IP地址。然后DNS1向DNS2查询,由DNS2返回主机D的IP地址201.114.37.5,当该DNS消息穿越NAT设备时,地址被转化为10.1.3.1,DNS1将该地址传递给主机A,主机A就将数据包发送到该地址,之后再由NAT设备转换该数据包的源地址和目的地址。

如果主机D希望与内部网络中的主机通信,那么操作过程正好与上面相反:主机D可能会向DNS2查询HostC.insidenet.com的IP地址,然后DNS2向DNS1查询,由DNS1返回主机C的IP地址10.1.2.2,该地址又被NAT设备转换成204.15.87.2,并被DNS2传递给主机D。之后,当主机D与主机C之间交换数据包时,就由NAT设备来转换数据包的源地址和目的地址。

4.3.2 案例研究:动态NAT

前面所讨论的静态NAT配置案例研究中存在的一个主要问题就是可扩展性问题,如果图4-18中的内部设备不是4台,而是60台或6000台将会如何呢?与维护静态路由表项一样,随着网络规模的不断扩大,维护静态NAT映射关系将成为一个极大的管理负担。

图4-19中的内部网络使用10.1.1.0~10.1.2.255作为其IL地址空间,ISP为其分配的公有地址空间是204.15.86.0/23,该公有地址空间被用作地址池,实现IG地址到IL地址的动态映射。为了实现更好的可管理性和可预测性,地址空间10.1.1.0/24被映射到204.15.86.0/24,10.1.2.0/24被映射到204.15.87.0/24。

img275b

图4-19 内部网络拥有大量的IL地址和IG地址

命令ip nat pool将创建一个地址池并为该地址池命名,之后该地址池被指定为IG地址池,并被命令ip nat inside source list链接到IL地址段。例4-13显示了Mazatlan的配置情况。

例4-13:Mazatlan被配置为从地址池中动态分配IG地址。

img276

从配置中可以看出,创建的地址池分别名为PoolOne和PoolTwo,分配给PoolOne的地址段是204.15.86.1~204.15.86.254,分配给PoolTwo的地址段是204.15.87.1~204.15.87.253。请注意,上述地址段中不包含网络地址和广播地址,命令中的关键字netmask负责进行合规性检查,以确保不会映射到204.15.87.255这样的地址。netmask的一个可替换关键字是prefix-length,例如,ip nat pool PoolTwo 204.15.87.1 204.15.87.253 prefix-length 24与带有关键字netmask 255.255.255.0的命令的效果完全相同。有了这些命令,就可以在分配204.15.86.0~204.15.86.255这样的地址段时,不会映射到“0”和“255”这样的主机地址上。但是一个好的配置实践应仅为地址池配置有效地址,以避免产生不必要的混淆。

另外需要注意的是,PoolTwo中不包含地址204.15.87.254,因为该地址已被静态分配给了DNS1。为了保证在任何时候,外部设备都能向内部设备发起会话(如DNS1),必须采取静态地址分配方式。如果这些设备的IG地址是动态分配的,那么外部设备将无法知道该向哪个地址发送数据包。

其次,配置中使用了访问列表,以标识被转换的IP地址。在Mazatlan的配置文件中,access-list 1被用来标识IL地址段10.1.1.0~10.1.1.255, access-list 2则被用来标识IL地址段10.1.2.0~10.1.2.255。

最后,IL地址被链接到正确的地址池。例如,语句ip nat inside source list 1 pool PoolOne表示源自内部网络的IP地址(也就是IL地址)以及与access-list 1指定的地址段相匹配的地址都被转换为取自PoolOne的IG地址。

例4-4给出了配置动态NAT后的Mazatlan的NAT表,可以看出,惟一的映射表项就是DNS1的静态映射项。

例4-14:首次配置Mazatlan的动态NAT时,除了一条静态映射项之外,NAT表中没有其他任何表项。

img277a

例4-15给出了内部网络设备向外部网络发送流量后的NAT表,每个地址池都按照数值顺序(由低向高)分配IG地址。

例4-15:当内部设备向外部网络发送数据包时,动态IL-to-IG映射表项开始进入NAT表。

img277b

网络管理员可能希望IG地址的主机部分与被映射IL地址的主机部分相匹配,这时就需要在定义地址池的语句最后增加关键字type match-host(如例4-16所示)。

例4-16:通过配置让IG地址的主机部分与被映射IL地址的主机部分相匹配。

img277c

例4-17给出了相应的NAT表情况,与例4-15相比可以看出,两个例子中都转换了相同的IL地址。不过本例不再是从各个地址池中顺序选择IG地址,而是选择了主机部分相匹配的IG地址。

例4-17:IG地址的主机部分与被映射IL地址的主机部分相匹配。

img277d

在默认情况下,NAT表中动态映射表项的保持时间为86 400秒(24小时),也可以利用命令ip nat translation timeout将该时间设置为0~2 147 483 647秒(约68年)之间的任意时间。在第一次进行地址转换时开启超时周期,在每次数据包被映射表项所转换后又被重置。当地址池中的某个地址被映射到NAT表中的地址后,该地址将不能再被映射到其他地址。如果超时周期到期时没有新的映射“选中”该映射表项,那么就从NAT表中删除该表项,地址池中的该地址又重新回到地址池中,成为可用地址。如果在命令ip nat translation timeout中使用0秒或关键字never,该映射表项将永远不会从NAT表中被删除。

利用命令show ip nat translations verbose可以看到所有出现转换超时的映射表项(如例4-18所示)。命令ip nat translations verbose显示了映射表项进入NAT表中的时间、该表项最后一次被用来转换地址的时间以及超时周期到期前的剩余时间。可以使用Flags(标志)字段来标识动态转换之外的转换类型,例如,例4-18中最后一个表项就被显示为静态转换。

例4-18:使用命令ip nat translations verbose可以显示每条映射表项的详细超时周期情况。

img278a

当IL的地址段大于地址池中的IG地址数时,转换超时周期就显得非常重要。看一下例4-19中的配置情况。

例4-19:1 022个IL地址共享拥有254个IG地址的地址池。

img278b

例4-19中1 022个IL地址(10.1.0.0~10.1.3.254)被映射为254个可用IG地址,这就意味着,当NAT表中包含254个映射表项时,将不存在更多的可用IG地址,所有IL地址未被转换的数据包都将被丢弃。采取这种地址映射方案的设计者认为网络中只有一小部分用户会访问外部网络,但是由于NAT表中的映射表项将被保留24小时,从而会加大IG地址的耗尽几率。因此设计者应适当降低超时周期,以降低IG地址被耗尽的几率。

4.3.3 案例研究:网络融合

NAT在防止互联网络之间可能存在的地址冲突方面非常有用。前面的两个案例研究描述的是使用私有地址空间的网络与使用公有地址空间的网络之间的连接情况,其中,采取公有地址编址方式的互联网络可能是其他网络或Internet,最基本的要求就是必须转换RFC 1918私有地址,因为这些地址不是全球惟一的。有了NAT技术,许多企业可以在自己的互联网络中使用着相同的IP地址,当穿越Inetrnet时由NAT设备将这些私有地址“隐藏”起来。

也可以采用前面案例研究中使用公有地址空间(这些公有地址不是由地址分配机构分配的)为内部网络进行编址的配置方式。例如,内部网络的地址空间可能是171.68.0.0/16,当连接到Internet上时,由于这些地址可能已经被正式分配给了其他公司,将这些未经转换的数据包发送到Internet上将造成路由冲突,因而必须进行NAT转换。

另一种地址冲突的可能情形就是两个先前独立的网络进行融合。如图4-20所示,Surf公司和Sand公司经融合后形成了一家Surf n’Sand公司,作为两家公司融合的一部分工作就是连接现有的两个互联网络。但不幸的是,这两个互联网络的设计师在建设网络的时候都采用了相同的地址看见10.0.0.0,致使Surf公司互联网络中很多设备的地址都与Sand公司中的设备地址相同。

img279

图4-20 必须将两个拥有很多重复地址的互联网络连接在一起

最佳解决方案是对新网络进行重新编址,但很多时候地址方案设计得都很差,使得重新编址工作变得非常复杂。例如,Surf n’Sand公司互联网络中的所有设备都采取手工方式配置IP地址,而没有通过DHCP进行地址分配。在完成网络的重新编址之前,可以使用NAT作为连接两个网络的临时解决方案。


注意: 本应用中的NAT只是一种临时解决方案,让互联网络中的地址长期存在冲突状况是一种非常不好的网络配置实践。


Surf n’Sand公司的网络管理员首先向其ISP或地址分配机构申请一段公有地址空间,并被分配了CIDR地址块206.100.160.0/19。然后,将该地址块一分为二,将地址块206.100.160.0/20分配给以前的Sand互联网络,将地址块206.100.176.0/20分配给以前的Surf互联网络。这里的一个假定是:虽然10.0.0.0网络能够支持1 600多万个主机地址,但本例两个网络中的实际主机数都不超过/20地址空间。

图4-21中的路由器Cozumel和Guaymas负责连接这两个互联网络,配置情况如例4-20所示。

img280a

图4-21 在两个互联网络的边界处使用NAT路由器以解决地址冲突问题

例4-20:图4-21中路由器Cozumel和Guaymas的NAT配置。

img280b

img281

DNS服务器对本案例来说非常关键,在NAT配置中,每台DNS服务器都有一个静态的IL-to-IG地址映射表。假设Sand互联网络中的某台设备Beachball.sand.com希望向Surf互联网络中的Snorkel.surf.com发送数据包,并进一步假设这两台设备的IP地址均为10.1.2.2,那么将顺序发生以下事件。

(1)主机Beachball向DNS2查询Snorkel.surf.com的IP地址。

(2)DNS2向DNS1(是surf.com域的权威服务器)发出查询请求,该请求的源地址是10.16.95.200、目的地址是206.100.176.1,该查询又被转发到路由器Guaymas(Guaymas将路由206.100.176.0/20宣告到EIGRP中)。

(3)Guaymas根据静态NAT映射表项将源地址从10.16.95.200转换到206.100.160.1,并将数据包转发到Cozumel。

(4)Cozumel根据静态NAT映射表项将目的地址从206.100.176.1转换到10.100.50.1,并将该请求转发到DNS1。

(5)DNS1响应该查询请求,告知Snorkel.surf.com的IP地址是10.1.2.2,该响应消息的源地址是10.100.50.1、目的地址是206.100.160.1,响应消息被转发到Cozumel(Cozumel将路由206.100.160.0/20宣告到OSPF中)。

(6)Cozumel将DNS响应消息的源地址转换为206.100.176.1, NAT路由器也在响应消息的Answer(答案)字段中发现了地址10.1.2.2,该地址与access-list 1相匹配,从而被转换为名为Surf的地址池中的地址,对本例来说就是地址206.100.176.3。接着,该映射表项就被录入到NAT表中,响应消息也被转发到Guaymas。

(7)Guaymas将该DNS响应消息的目的地址转换为10.16.95.200,并将该响应消息转发给DNSl。

(8)DNS1通知Beachba11:Snorkel.surf.com的IP地址是206.100.176.3。

(9)接着,Beachba11开始用源地址10.1.2.2、目的地址206.100.176.3向Snorkel发送数据包。

(10)在路由器Guaymas处,源地址与access-list 1相匹配,因而从名为Sand的地址池中选择一个地址,对本例来说就是地址206.100.160.2。将源地址进行地址转换后,该映射表项就被录入到NAT表中,数据包也被转发到Cozumel。

(11)Cozumel发现目的地址206.100.176.3被映射到其NAT表中的10.1.2.2,从而将该目的地址映射为该IL地址,并将数据包转发给Snorkel。

(12)Snorkel发送一个源地址为10.1.2.2、目的地址为206.100.160.2的响应数据包,该数据包被转发到Cozumel。

(13)Cozumel将该数据包的源地址转换为206.100.176.3,并将该数据包转发给Guaymas。

(14)Guaymas将该数据包的目的地址转换为10.1.2.2,并将该数据包转发给Beachball。

通过上例可以看出,虽然这两台设备的IP地址完全一样,但它们都不知道对方的真实IP地址。上述方案的关键是路由器Cozumel和Guaymas的路由配置,要求任一台路由器都不能将10.0.0.0网络的信息泄露给对方,两台路由器的配置都不允许将携带10.0.0.0网络中目的地址的数据包转发给对方路由器(将数据包发送给直连的子网10.255.13.248/29除外)。访问列表access-list 1的作用是让这两台路由器都不对源自路由器E1接口的数据包进行地址转换。


注意: 故障检测与排除练习题(3)将要求读者进一步考虑该访问列表的配置。


例4-20中另一个值得关注的细节是,路由器Guaymas上有多个内部接口,多个内部接口是完全可行的。

上述配置中没有很明显表达出来的一个重要主题就是NAT转换超时周期与DNS缓存TTL(Time-To-Live,生存时间)周期之间的协调问题。当DNS服务器从其他DNS服务器接收到一条资源记录后,将缓存该资源记录,以便使用该记录直接响应随后到来的查询请求。对本例研究来说,DNS2会缓存将Snorkel.surf.com映射为206.100.176.3的ARR,之后DNS2就可以直接响应对Snorkel的地址查询请求,而无需再次查询DNS1。该缓存RR有一个相对应的TTL,当TTL到期时就会清除该RR。需要注意的是,DNS的TTL周期必须小于NAT的转换超时周期。

例如,假设NAT转换超时周期在10.1.2.2~206.100.176.3映射表项上到期,IG地址将重新回到地址池中,206.100.176.3之后将被映射到Surf互联网络中的一个不同的IL地址。但DNS2仍然保持着将Snorkel.surf.com映射为206.100.176.3的RR映射表项,此时如果Sand互联网络中的设备向DNS2查询Snorkel的地址,那么DNS2将响应以过期信息,从而导致数据包被发送到错误的主机。

本案例研究的最后一个关注点是Internet接入。通过在Cozumel和Guaymas之间的子网增加一台接入路由器就可以很容易地实现Internet接入(如图4-22所示),来自Surf和Sand互联网络的数据包的源地址都被进行了地址转换,惟一需要做的就是为Cozumel和Guaymas增加默认路由,以指向Internet接入路由器。

img282

图4-22 Internet接入路由器不支持NAT功能,Internet流量的所有地址转换操作均由Cozumel和Guaymas完成

4.3.4 案例研究:通过 NAT多归属到 ISP

4.1.4小节中解释了如何通过NAT来克服多归属到不同ISP时引起的不同CIDR地址块问题。图4-7中的用户多归属到不同ISP,每个ISP看见的数据包的源地址都属于自己的地址空间,任一个ISP都不会从用户处接收源地址属于其他ISP地址块的数据包。

根据前面已经学习过的NAT案例研究,可以很容易地写出图4-7中两台NAT路由器的配置文件。但是,当其中的某台路由器多归属到这两个ISP(如图4-23所示)时将会如何呢?Montego从两个ISP接收了全部BGP路由,因而可以为所有目的地选择最佳提供商。当某个数据包被转发到ISP1时,该数据包的源地址必然源自ISP1分配的地址块205.113.50.0/23;当某个数据包被转发到ISP2时,该数据包的源地址必然源自ISP2分配的地址块207.36.76.0/23。

img283

图4-23 ISP1和ISP2均为JamaicaNet分配了一个CIDR地址块,当数据包被转发给某个ISO时,其源地址必然源自该ISP分配的地址块

例4-21给出了让Montego在不同的接口上使用不同地址池的配置情况。

ISP分配的地址块分别被指定在地址池ISP1和ISP2中,本NAT配置的一个重要特征就是语句ip nat inside source调用的是路由映射,而不是访问列表。通过路由映射,不但可以指定IL地址,还可以指定数据包所要转发的接口或下一跳地址。ISP1_MAP指定源地址属于10.0.0.0网络(与access-list 1所标识的一样)的数据包以及将这些数据包通过接口S1.708转发到ISP1,指定源地址属于10.0.0.0网络的数据包以及将这些数据包通过下一跳地址207.36.65.254转发到ISP2。


注意: 通常情况下,为保持一致性,仅使用命令match interface或match ip next-hop,本例同时使用这两个命令的目的是起示范作用。


例4-21:图4-23中Montego的配置。

img284

例如,地址为10.1.2.2的内部设备发送了一个目的地址为137.19.1.1的数据包。由于路由器Montego通过OSPF将默认路由宣告进了JamaicaNet,因而该数据包被转发给了Montego。Montego执行路由查找并确定去往目的地的最佳路由是经ISP2,出接口为S1.709、下一跳地址为207.36.65.254。第一条ip nat inside source语句的作用是根据ISP1_MAP来检查该信息,虽然源地址匹配,但出接口却不匹配。第二条ip nat inside source语句的作用是根据ISP2_MAP来检查该信息,此时源地址与下一跳地址均匹配,这样就将源地址转换为ISP2地址池中的地址。

例4-22给出了流量穿越ISP之后的Montego的NAT表情况。由于一个IL地址可以被映射为多个地址池中的某个地址,因而地址映射属于扩展延伸,可以显示协议类型和端口号。有关扩展映射的相关内容将在案例研究“端口地址映射”中做详细讨论。

例4-22:Montego的NAT表显示地址映射所选择的IG地址与数据包所要转发的ISP有关。

img285a

例4-22 NAT表中值得关注的内容是有关IL地址的3条表项。UDP流量及其中的一个TCP会话通过ISP2去往目的地,IL地址所映射的IG地址是207.36.76.2,其他TCP会话则通过ISP1,地址相应地就被映射为205.113.50.3。通过这些表项可以看出,虽然源地址均相同,但IG地址所选择的地址池在发生变化,而这一切都取决于数据包被转发到何处。

图4-24显示了3个自治系统的DNS服务器,ISP1和ISP2中的服务器必须接入Ochee。其中Ochee是JamaicaNet的权威DNS服务器,这样Ochee就必须拥有两个CIDR地址块中地址的静态NAT表项。通常不允许将一个IL地址同时静态映射为多个IG地址(因为这样做会产生映射歧义),但是对本案例来说,由于同一个NAT设备同时实现双向映射,因而不存在歧义问题,当Montego路由Ochee的DNS查询消息以及对DNS1和DNS2的响应消息时,能够进行正确的地址转换操作。

img285b

图4-24 DNS服务器Ochee必须拥有静态IL-to-IG映射表项,以便能响应DNS1和DNS2的查询请求

为了能够将一个IL地址映射为多个IG地址,需要在映射语句的最后增加关键字extendable,例4-23显示了Montego的NAT配置情况。

从DNS1的角度来看,Ochee的地址是205.113.50.1,请注意,NAT地址池ISP1被修改为不包含该地址。从DNS2的角度来看,Ochee的地址是207.36.76.100,该地址取自207.36.76.0/23地址块的中间,而不是两端,从而使得地址池ISP2变得不连续。上例配置中的地址池经修改后指定了两段地址:Ochee地址之前的地址和Ochee地址之后的地址。

例4-23:让Montego能够将一个IL地址静态映射为多个IG地址。

img286a

在配置不连续的地址段时,首先要为该地址池命名,并指定前缀长度或网络掩码,之后出现的配置提示符要求输入地址段列表。例4-24显示了地址池ISP2的配置步骤(包括提示符)。

例4-24:为不连续的地址段配置NAT地址池。

img286b

4.3.5 端口地址转换

前面案例研究中多归属NAT路由器的反方向是将多台设备连接到Internet的SOHO路由器,这里不是为每台设备均配置独立的公有IP地址,而是采用了PAT(Port Address Translation,端口地址转换)机制,以便让所有的SOHO设备都能共享单个IG地址。

PAT可以实现地址超载(overloading),即将多个IL地址映射到同一个IG地址。为此,路由表中的NAT表项都必须是扩展(extended)表项,不但跟踪相关的IP地址信息,还要记录协议类型和端口号信息。通过同时转换数据包的IP地址和端口号,理论上最多可以将65535个IL地址转换到单个IG地址(基于16bit的端口号计算得到)。


注意: 每条NAT表项大约占用160字节的内存,65 535条表项则将消耗10MB左右的内存和大量的CPU资源,因而在实际的PAT配置中,几乎没有映射过这么多的地址。


Cisco的NAT设备试图保持BSD的语义,在可能的情况下都会将IL端口号映射到相同的IG端口号,只有当与IL地址相关联的端口号已经能够被其他映射占用的情况下,才会映射为不同的IG端口号。

图4-25显示了连接到ISP上的3台设备情况。

接入路由器的串行接口上有一个分配自ISP的公有IP地址,如例4-25中的配置所示。

img287a

图4-25 Barbado利用PAT技术将3个内部主机地址映射为单个串行接口地址

例4-25:在图4-25的路由器Barbado上启用PAT。

img287b

利用关键字overload就可以启用PAT机制,虽然命令ip nat inside source可以引用一个地址池,但本例仅引用了配置了IG地址的接口。与以前一样,访问列表用于标识IL地址。

例4-26给出了数据包穿越接入路由器之后的接入路由器的NAT表情况。大多数IG端口都与IL端口相匹配,但需要注意表中的两个实例,其IL套接字有一个端口号已经被使用(192.168.1.2:11000和192.168.1.2:11001),因而NAT为这些套接字选择了一个未被使用的端口号,该端口号与IL端口不匹配。

例4-26:不同IL地址被映射到同一IG地址的不同端口号。

img287c

4.3.6 案例研究:TCP 负载均衡

图4-26给出的拓扑结构与PAT案例研究中的类似,只是这里的3台内部设备不再是主机,而是3台拥有镜像内容的相同服务器,目的是创建一台地址为199.198.5.1的“虚拟服务器”,即被外部视为拥有IG地址的单台服务器。在实际应用中,路由器Barbados会将地址循环(round-robin)转换为这3个IL地址。

img288a

图4-26 3台内部设备是拥有镜像内容的相同服务器,从外部看来就是单台服务器

例4-27给出了路由器Barbados的配置情况。

例4-27:路由器Barbados的NAT配置将TCP负载平均分配到3台相同的服务器上,外部设备只能看见单个内部全局地址。

img288b

需要注意的是,前面大多数案例研究中都是转换IL地址,而本案例是转换IG地址。地址池V-Server包含了一个可用IL地址列表,关键字type rotary的作用是以轮询方式分配地址池中的地址。与往常一样,访问列表的作用是标识需要转换的地址,对本例来说就是单个目的地址199.198.5.1。

例4-28显示了4台外部设备都向虚拟服务器发送了TCP流量之后的NAT表情况。可以看出,从地址池中为前3条连接(从下往上看)由低到高地按序分配了IL地址,由于地址池中仅有3个可用IP地址,因而第4条连接又被映射到最小的IL地址。

例4-28:到虚拟服务器地址199.198.5.1的TCP连接在3个真实服务器地址之间进行了负载均衡。

img289a

4.3.7 案例研究:服务分发

可以利用NAT来创建虚拟服务器,通过TCP或UDP服务(而不是TCP连接)来分发连接。图4-27中的互联网络与图4-26中的互联网络非常相似,只是此时的服务器不再相同了,不同的服务器提供不同的服务。从外部来看,这3台服务器就是一个地址为199.198.5.1的单台服务器。

img289b

图4-27 提供不同服务的3台内部设备被外部网络视为单台服务器

例4-29给出了路由器Barbados的NAT配置情况。

例4-29:Barbados的NAT被配置成根据与IP地址相关的TCP或UDP端口号来转换虚拟IG地址。

img289c

img290a

本配置中没有地址池或访问列表,而是列出了一系列简单的IL-to-IG映射关系。这些语句与以前静态语句之间的不同之处是指定了TCP或UDP以及源端口和目的端口。由于多个语句中都出现了相同的IP地址(本次是IG地址),因而必须使用关键字extendable;由于Cisco IOS Software能够自动加入本关键字,因而无需手工输入。上述语句按顺序分别映射的是SMTP(TCP端口25)、syslog(UDP端口514)、TFTP(UDP端口69)、FTP(TCP端口20和21)和HTTP(TCP端口80)。

例4-30给出了刚配置完的Barbados的NAT表情况,表中只有静态映射表项。

例4-30:在出现动态转换之前,Barbados的NAT表中只包含IL套接字到IG套接字的静态映射表项。

img290b

例4-31给出了流量穿越Barbados之后的NAT表情况。请注意,所有动态映射表项中仅出现了两个OG地址,然而会话却被映射到不同的IL地址(依据与IG地址相关联的端口号)。

例4-31:UDP和TCP包依据相关联的端口号被映射到不同的IL地址。

img290c