【网工必看】IPv4地址不足的解决方案,建议收藏!
在什么情况下使用NAT
与无类域间路由选择(CIDR)一样,最初开发NAT也旨在推迟可用IP地址空间耗尽的时间,这是通过使用少量公有IP地址表示众多私有IP地址实现的。
但随后人们发现,在网络迁移和合并、服务器负载均衡以及创建虚拟服务器方面,NAT 也是很有用的工具。因此,小编将简要描述NAT的功能和常见术语。
NAT确实可减少联网环境所需的公有IP 地址数;在两家使用相同内部编址方案的公司合并时,NAT也提供了便利的解决方案;在公司更换因特网服务提供商(ISP ),而网络管理员又不想修改内部编址方案时,NAT也能提供很好的解决方案。
下面是NAT可提供帮助的各种情形:
需要连接到因特网,但主机没有全局唯一的 IP 地址;
更换的ISP要求对网络进行重新编址;
需要合并两个使用相同编址方案的内联网。
NAT通常用于边界路由器。例如,在图13-1中,NAT用于连接到因特网的路由器Corporate(公司)。
你可能这样想,NAT确实很酷,它是最佳的网络工具,必须使用它。但且慢, NAT也有缺陷。我的意思是说,NAT有时候确实可以解救你,但它也有缺点。表13-1说明了NAT的优缺点。
注意
NAT最明显的优点是,能够节省合法的注册地址。这也是IPv4地址至今还未耗尽的原因。
网络地址转换类型
下面小编介绍NAT的3种类型。
静态NAT 这种NAT能够在本地地址和全局地址之间进行一对一的映射。请记住,使用静态NAT时,必须为网络中的每台主机提供一个公有因特网IP地址。
动态NAT 它能够将未注册的IP地址映射到注册IP地址池中的一个地址。不像使用静态NAT那样,你无需静态地配置路由器,使其将每个内部地址映射到-个外部地址,但必须有足够的公有因特网IP 地址,让连接到因特网的主机都能够同时发送和接收分组。
NAT重载 这是最常用的NAT类型。NAT重载也是动态NAT,它利用源端口将多个非注册IP地址映射到一个注册IP地址(多对一)。那么,它的独特之处何在呢?它也被称为端口地址转换(PAT)。通过使用PAT (NAT重载),只需使用一个全局IP地址,就可将数千名用户连接到因特网,这是不是很酷?因特网IP地址之所以还未耗尽,真正的原因就在于使用了NAT重载。
NAT术语
对于用于NAT的地址,我们使用的术语很简单。NAT转换后的地址称为全局地址,这通常是因特网公有地址;但如果无需连接到因特网,则不需要公有地址。
进行NAT转换前的地址称为本地地址。因此,内部本地地址是试图连接到因特网的主机的私有地址;而外部本地地址通常是与ISP相连的路由器接口的地址。后者通常是公有地址,主机发送的分组的源地址通常会转换为这种地址。
内部本地地址将被转换为内部全局地址,而外部全局地址将成为目标地址。表13-2列出了各种NAT术语。
NAT的工作原理
下面介绍NAT的工作原理。首先,使用图13-2介绍基本的NAT转换。
在图13-2 所示的示例中,为向因特网发送分组,主机10.1.1.1 将其发送给配置了NAT的边界路由器。该路由器发现分组的源IP 地址为内部本地IP地址,且是前往外部网络的,因此对源地址进行转换,并将这种转换记录到NAT表中。
然后,该分组被转发到外部接口,它包含转换后的源地址。收到外部主机返回的分组后, NAT路由器根据NAT表将分组包含的内部全局IP地址转换为内部本地IP地址。
下面来看一个更复杂的示例,它使用了NAT重载(也叫端口地址转换, PAT )。这里将使用图13-3来说明PAT的工作原理。
使用重载时,转换后的所有内部主机都使用同一个IP地址,术语重载因此而得名。这里再重申一次,可用的因特网IP地址之所以没有耗尽,都是拜NAT重载(PAT)所赐。
请看图13-3 所示的NAT表,除内部本地IP地址和外部全局IP 地址外,它还包含端口号。这些端口号让路由器能够确定应该将返回的数据流转发给哪台主机。
在这个示例中,使用传输层端口号来标识本地主机。如果必须使用注册IP地址来标识本地主机,则称为静态NAT,而可用IP地址早就耗尽了。PAT能够使用传输层端口号来标识主机,因此,从理论上说,最多可让大约65 000台主机共用一个公有IP地址。
配置静态NAT
下面是一种简单的静态NAT配置:
在上面的路由器输出中,命令ip nat inside source 指定要对哪些IP地址进行转换。这里使用该命令配置了一个静态转换:将内部本地IP地址10.1.1.1 静态地转换为内部全局IP地址170.46.2.2。
如果你往下查看该配置,将发现每个接口都配置了命令ip nat。命令ip nat inside将接口指定为内部接口,而命令ip nat outside 将接口指定为外部接口。命令ip nat inside source 将内部接口指定为源,即转换的起点,也可将该命令改为ip nat outside source, 从而将外部接口指定为源,即转换的起点。
配置动态NAT
要使用动态NAT,需要有一个地址池,用于给内部用户提供公有IP地址。动态NAT不使用端口号,因此对于同时试图访问外部网络的每位用户,都需要有一个公有IP地址。
下面是一个动态NAT配置示例:
命令ip nat inside source 1ist 1 poo1 todd 让路由器这样做:将与access-1ist 1匹配的IP地址转换为IP NAT地址池todd中的一个可用地址。在这里,不同于出于安全考虑而过滤数据流,访问控制列表并非用来禁止或允许数据流通过,而用于指定感兴趣的数据流。如果数据流与访问控制列表匹配(即为感兴趣的数据流),则将其交给NAT进程进行转换。这是访问控制列表的一种常见用途,访问控制列表并非总是用于在接口处阻断数据流。
命令ip nat pool todd 170.168.2.3 192.168.2.254 netmask 255.255.255.0 创建一个地址池,用于将全局地址分配给主机。
配置 PAT (NAT重载)
这个示例将演示如何配置内部全局地址重载,这是当今使用的典型NAT。除非需要进行静态映射(如映射到服务器), 否则很少使用静态NAT和动态NAT。
下面是一个PAT配置示例:
相比于前面的动态NAT配置,该配置唯一不同的地方是, 地址池只包含一个IP地址,且命令ip nat inside source末尾包含关键字overload。
在这个示例中,注意到地址池只包含一个 IP地址,它是外部接口的IP地址。这适合只从ISP获取一个IP地址的家庭或小型办公室配置NAT重载。然而,如果有其他地址,如170.168.2.2, 也可使用它,这适合大型网络,在这种环境中,可能有很多内部用户需要同时访向因特网,必须重载多个公有IP地址。
NAT的简单验证
配置完成要使用的NAT类型后一通常是 NAT重载(PAT),需要对配置进行验证。要查看基本的IP地址转换信息,可使用如下命令:
Router#show ip nat trans lations
查看IP NAT转换条目时,可能看到很多包含同一个目标地址的转换条目,这通常是由于有很多到同一台服务器的连接。
另外,还可使用命令debug ip nat来验证NAT配置。在该命令的每个调试输出行中,都包含发送地址、转换条目和目标地址:
Router#debug ip nat
如何将NAT表中的转换条目清除呢?可使用命令clear ip nat translation。要清除NAT表中的所有转换条目,可在该命令末尾加上星号(*)。
NAT 的测试和故障排除
思科NAT功能强大,无需为此做太多工作,因为其配置非常简单。但你知道,任何东西都不是完美的,如果出现故障,可根据下述清单找出常见的原因:
检查动态地址池,看它包含的地址范围是否正确;
检查不同动态地址池包含的地址是否重复; ;
检查用于静态映射的地址和动态地址池中的地址是否重复;
确保访问控制列表正确地指定了要转换的地址;
确保包含了应包含的地址,且没有包含不应包含的地址;
确保正确地指定了内部接口和外部接口。
需要牢记于心的是,新的NAT配置有一种常见的问题,这种问题与NAT毫无关系,而与路由选择相关。因此,使用NAT修改分组的源地址或目标地址后,务必确保路由器知道如何处理转换后的地址。
通常,应首先使用命令show ip nat translations, 如下所示:
根据上述输出,你能判断路由器配置的要么是静态NAT要么是动态NAT吗?能够判断,因为内部本地地址和内部全局地址之间为一对一的映射关系。下面来看另一个例子:
从上述输出可知,使用的是NAT重载( PAT )。上述输出表明,协议为TCP,且两个转换条目中包含的内部全局地址相同。
有人说,NAT表可存储的转换条目数没有限制,但实际上,内存、CPU以及可用地址和端口范围限制了可包含的转换条目数。每个转换条目都需要占用大约160 B的内存。有时候,出于性能考虑或受策略的限制,必须限制包含的转换条目数,不过这种情况也不多见。这时,可使用命令ip nat translation max-entries 。
另一个方便的故障排除命令是show ip nat statistics。该命令显示NAT配置摘要,并计算活动的转换条目数。另外,它还显示命中现有转换条目的次数以及未找到现有条目的次数,在后一种情况下,将试图创建新的转换条目。该命令还显示过期的转换条目。如果要查看动态地址池一它包含的地址总数(其中有多少分配出去了,还有多少可用)以及执行的转换次数,可在该命令中使用关键字poo1。
下面是这个NAT调试命令的输出:
注意到在最后一行输出中, 开头有一个星号(* )。这表示分组在转换后被快速交换到目的地。你可能会问:什么是快速交换呢?下面简要地解释一下。快速交换有很多名称,也被称为基于缓存的交换,而另一个更准确的名称是"路由一次,交换多次”。在思科路由器上,使用快速交换进程来缓存第3层路由选择信息,供第2层进程使用,这旨在避免每次转发分组时都对路由选择表进行分析,让路由器能够快速转发分组。以进程方式交换分组(在路由选择表中查找)时,将相关的信息存储在缓存中,供以后使用,以提高路由选择速度。
回到验证NAT的主题。前面说过,可手工清除NAT表中的转换条目。如果需要删除无用的转换条目,以免它们等待过期,这将很方便。另外,如果要清空整个NAT表,以便重新配置地址池,这也很有用。
还需知道的是,只要NAT表中有包含地址池中地址的转换条目,思科IOS就不会允许修改或删除相应的地址池。命令clear ip nat translations 清除转换条目一你可使用全局地址、 本地地址和TCP (UDP)端口指定要清除特定的转换条目,也可使用星号(* )清除所有的转换条目。然而,该命令只清除动态转换条目,而不会清除静态转换条目。
另外,外部设备返回分组时,使用的目标地址称为内部全局(IG )地址。这意昧着必须将最初创建的转换条目保存在NAT表中,确保对特定连接返回的所有分组进行-致的转换。通过将转换条目保存在NAT表中,还可减少同一台内部主机定期向同一台外部主机发送分组时,每次执行的重复转换操作。
进一步解释下我想表达的意思。转换条目首次被加入NAT表时,将启动-一个定时器,该定时器的时间称为转换条目超时时间。每当有穿越路由器的分组用到该转换条目时,都将重置其定时器。如果定时器到期,相应的转换条目将从NAT表中删除,而动态分配给它的地址将归还给地址池。思科路由器的转换条目超时时间默认为86 400秒(24小时),但可使用命令ip nat translation timeout修改。
下面来看一个NAT示例,看看你能否确定所需的配置。首先,请看图13-4,并回答如下两个问题:在哪里实现NAT?配置哪种类型的NAT?
在图13-4中, 应在路由器Corporate上配置NAT,并使用NAT重载( PAT )。下面的配置使用的是哪种类型的NAT呢?
ip nat pool todd-nat 170. 168.10.10170.168.10.20 netmask 255.255.255.0
ip nat inside source list 1 poo1 todd-nat
它使用的是动态NAT。这是因为命令ip nat inside source 中包含关键字pool,而指定的地址池包含多个地址,且该命令末尾没有关键字overload (这表明没有使用PAT )。
接下来,请看图13-5,你能确定应该使用哪种配置吗?
在图13-5所示的示例中,需要在边界路由器上配置NAT,并将内部本地地址转换为6个公有IP地址( 192.1.2.109~ 192.1.2.114)之一。然而,内部网络有62台主机,它们使用私有地址192.168.10.65~192. 168.10.126。在边界路由器上,应如何配置NAT呢?
有两种可行的解决方案,但笔者优先选择下面的解决方案:
命令ip nat pool Todd 192.1.2.109 192.1.2.109 netmask 255.255.255.248 创建一个只包含一个地址( 192.1.2.109 )的动态地址池,并将其命名为Todd。在这个命令中,也可以使用prefix-1ength 29,而不使用关键字netmask,只不过要多敲几次键盘而已。
第二个解决方案是使用ip nat poo1 Todd 192.1.2.109 192.1.2.114 netmask 255.255.255.248,其效果与只将192.1.2.109 用作内部全局地址相同,但这会浪费地址,因为仅当TCP端口号发生冲突时,才会使用第2~6个地址。仅当数万台主机共享一条因特网连接时,才应使用这种解决方案,这有助于解决TCP-Reset问题(即两台主机试图使用相同的源端口号)。但在这个示例中,只有62台主机同时连接到因特网,因此使用多个内部全局地址不会带来任何额外的好处。
如果你不明白创建访问控制列表的第二行代码,请参阅第12章。在这行代码中,使用了网络号和通配符掩码。我常说“每个问题都是子网问题”,这里也不例外。在这个示例中,内部本地地址为192.168.10.65~ 192.168.10.126,其块大小为64,因此子网掩码为255.255.255.192。我几乎在每章都要强调一下,你必须能够快速进行子网划分!
命令ip nat inside source list 1 poo1 Todd over load指定使用该动态地址池进行端口地址转换( PAT),关键字overload表明了这一点。
请务必在合适的接口上配置命令ip nat inside 和ip nat outside。
下面再介绍一个示例,然后你就可以去完成书面实验、动手实验和复习题了。
在图13-6所示的网络中,配置的IP地址如图所示,且只配置了一台主机。然而,你需要在LAN中再添加25台主机,而这26台主机必须能够同时连接到因特网。
在该网络中,请使用下面的内部地址在路由器Corp上配置NAT,让所有主机都能够连接到因特网:
内部全局地址: 198.18.41.129~ 198.18.41.134。
内部本地地址: 192.168.76.65~ 192.168.76.94。
这个示例需要你深人思考,因为只知道内部全局地址和内部本地地址,但根据这些信息以及路由器接口的IP地址,完全可以确定配置。
首先需要知道块大小,以确定配置NAT地址池时应使用的子网掩码以及配置访问控制列表时应使用的通配符掩码。内部全局地址对应的块大小为8,而内部本地地址对应的块大小为32,这很容易看出。这些信息很重要,你必须能够轻松地确定它们。确定块大小后,便可以配置NAT了:
ip nat pool Corp 198.18.41.129 198.18.41.134 netmask 255.255.255.248
ip nat inside source 1ist 1 pool Corp overload
access-list 1 permit 192.168.76.64 0.0.0.31
由于地址池只包含8个地址,为确保全部26台主机都能够同时连接到因特网,必须使用关键字overload。
还有另一种配置NAT的简单方式,笔者在自己的家庭办公室使用的就是这种方式。它只需一行,如下所示:
ip nat inside source list 1 int s0/0/0 overload
只需一行命令即可。这行命令的意思是,将我的外部本地地址用作内部全局地址,并重载它。当然,还必须创建ACL 1,并指定内部接口和外部接口。在没有地址池可用时,这是一种配置NAT的快捷可行的方式。