大家都知道。NAT是位于内、外网之间,用来进行内、外网地址转换的,在当前仍是IPv4为主流协议的IP网络,NAT技术的应用非常广,因为它可以节约紧缺的公网IP地址。但是千万别以为NAT技术很简单,认为只是把内部(或者外部)地址转换成外部(或者内部)地址。在具体的应用中,NAT的应用方式,或者说NAT类型非常多,本文以Cisco设备中的NAT技术从专业角度进行一些基础知识和应用配置方面的介绍,全面的NAT配置与应用到时大家参见本人于编写的《金牌网管师——大中型企业网络组建、配置与管理》一书,或者明年将出版的《Cisco/H3C路由器配置与管理完全手册》一书。

一、NAT类型

NAT路由器是被配置为转换内部网络(inside network)中的非注册内部本地IP地址(inside local addresses)为注册IP地址(registered IP addresses)。当内部网络中使用非注册IP地址的设备要与外部公用网络(public network)进行通信时,就会使用NAT。在Cisco设备(包括防火墙、路由器,或者包含相关Cisco软件的计算机)中,NAT有多种形式和工作方式。这是在Cisco设备上配置NAT应用之前必须要掌握的。

n 静态NAT(Static NAT)

静态NAT是把非注册IP地址(如本地局域网IP地址)一对一地映射到注册IP地址(如公网IP地址)。这在网络设备需要以公网IP地址访问外网时特别有用。但一定要注意,这里仅例举了单一的正方向的IP地址转换,实际上是可以反方向,或者双方向进行IP地址转换的,下面动态NAT和复用NAT也一样可以有正向、反向、或者双向转换方式。

如图1显示的是一个静态NAT应用示例(注意箭头方向)。内部网络中的192.168.32.10、192.168.32.12和192.168.32.15这三个专网IP地址设备在通过路由器访问公网时,对应转换成213.18.123.110、213.18.123.11和213.18.123.12这三个公网IP地址,让对方看到的也是这三个公网IP地址。

clip_image002

图1 静态NAT应用示例

n 动态NAT(Dynamic NAT)

动态NAT是把非注册IP地址映射到一组注册IP地址,具体映射是哪两组IP地址之间的映射关系,还要看所配置的具体公用IP地址池和通信时间。但最终非注册IP地址与注册IP地址还是一对一地进行映射。

图2是一个动态NAT应用的示例。内网中的三个IP地址与一个范围为213.18.123.100 到213.18.123.150的公网IP地址池进行映射。最终的结果是,192.168.32.10映射为213.18.123.116,192.168.32.12映射为213.18.123.112,而192.168.32.15映射为213.18.123.125,……。

clip_image004

图2 动态NAT应用示例

n 复用转换(Overloading)NAT

复用NAT是动态NAT的一种形式。它是通过与IP地址的不同端口组合,把多个非注册IP地址映射到一个注册IP地址。图3是一个复用转换NAT的应用示例。示例中本地网络中的所有用户通过路由器访问公用网络时,都将映射成同一个公网IP地址——213.18.123.100,只是所使用的端口不同而已(分别为101、102、103号端口)。这对于公网IP地址比较紧张,而内网中又部署了多种应用服务器时特别有用,可以通过一个公网IP地址配置多个应用服务器。

clip_image006

图3 复用转换NAT应用示例

n 交迭转换NAT(Overlapping NAT)

交换转换NAT是内、外部网络IP地址的相互转换方式。这种NAT方式出现在内、外网都是使用公网注册IP地址时。当你的内部网络主机使用的是注册IP地址时,路由器必须维护一张映射表,以便路由器能够对内、外网的两个注册IP地址进行交迭转换。这两方面的作用:一是可以避免内部主机真实的公网IP地址暴露在外网用户,另一方面又可以在内网使用非专网络IP地址与外网相同IP地址的用户造成冲突。这种NAT既可以通过静态NAT,又可以通过使用DNS和执行动态NAT来实现。

图4显示了一个交迭转换NAT的应用示例。在私有网络中,某主机分配了一个公网注册的IP地址237.16.32.16,连接公网时通过路由器转换成为另一个公网注册IP地址213.18.123.103。同时来自外网IP地址服务器上返回的消息又会通过路由器转换成内网中分配的固定公网注册IP地址237.16.32.10。

clip_image008

图4 交迭转换NAT应用示例

二、NAT术语

下面是与Cisco NAT技术密切相关的几个术语描述,这对理解NAT技术工作原理非常重要。

n 内部网络(Internal Network)

通常是指一个局域网,也称残余域(stub domain)。残余域使用的是内部网络IP地址,但可以是注册的IP地址,也可以是非注册的IP地址。使用非注册IP地址的所有计算机都必须使用NAT转换后再与其他网络进行通信。

n 外部网络(External Network)

将本地私有网络以外的所有网络都可看成是外部网络。当然,外部网络也可以是其他私有网络,也可以是公用网络,如互联网。所以外部网络上的用户使用IP地址同样既可以是注册的,也可以是非注册的。

n 本地地址(Local address)

在IP地址中,可以根据IP地址的作用范围分为本地地址和全局地址两大类。本地地址就是只有本地网络用户才可以访问,并仅作用于本地网络的IP地址。这属于非注册类型的IP,不能在互联网等公网中使用。

n 全局地址(Global address)

与本地地址相对应的IP地址。它是可以供全球用户访问的IP地址,当然是在公网中注册了的IP合法地址。

n 内部本地地址(Inside local address)

这是本地地址的一种,是指分配给内部网络主机的IP地址。这个IP地址是计算机操作系统或诸如DHCP之类的服务进行分配的,不是由NIC(Network Information Center,网络信息中心)或者服务提供商统一分配的注册IP地址。

n 外部本地地址(Outside local address)

这也是本地地址的另一种,是与内部本地地址性质一样的外部网络主机IP地址,也不是合法的互联网IP地址。它是由外部网络计算机操作系统或诸如DHCP之类的服务进行分配的。

n 内部全局地址(Inside global address)

这是全局地址的一种,是由NIC或服务提供商分配的注册IP地址。对于外界网络来说,它们扮演的是一个或多个内部本地址IP地址。

n 外部全局地址(Outside global address)

这也是全局地址的另一种,是与内部全局地址址性质一样的外部网络主机全局地址。对于外界网络来说,它们扮演的也是一个或多个本地址IP地址。

三、NAT地址转换原理

在残余域中的多数计算机是使用内部本地地址(Inside local addresses)进行通信的。在残余域中有些计算机需要与外部网络进行频繁通信时,就需要为他们配置内部全局地址(Inside global addresses),这样无需转换就可以直接与外部网络通信。

总体来说,NAT进行地址转换的过程就是把本地地址转换成全局地址的过程,无论数据包是从内部网络发往外部网络,还是从外部网络发往内部网络。不同的只是本地地址和全局地址所对应的网络不同。具体如图5所示。

clip_image010

图5 NAT基本地址转换原理

在以上转换过程中,当数据包还在内部网络位置时有一个作为源地址的内部本地地址和一个作为目的地址的外部本地地址;而当数据包被交换到外部网络时,数据包的源地址就会转变为内部全局地址,而目的地址被转变为外部全局地址。

相反,当数据包是从外部网络位置发来,并且仍位于外部网络中时,则它的源地址就是外部全局地址,目的地址就是内部本局地址;而当数据包被交换到本地网络时,源地址被转变为外部本地地址,目的地址被转变为内部本地地址。

如图6所示的是以上详细的地址转换方式。

clip_image012

图6 NAT的详细地址转换原理

数据包由内部网络发往外部网络时的基本转换原理如下:

(1)当配置了内部本地地地址的残余域计算机要与外部网络通信时,数据包到达NAT路由器后,经过普通的路由到达网关。数据包采用内部本地地址为源地址,外部本地地址为目的地址进行封装。

(2)NAT路由器先检查在路由表中是否有包含数据包目的地址的路由表项。如果没有与目的地址相匹配的路由表顶,则该数据包被丢弃。如果有与目的地址相匹配的路由表项,则路由器检验数据包是否是从内部网络发往外部网络的,并且检验数据包是否与已配置的NAT匹配。然后,路由器检查地址转换表,看是否有包含内部本地地址和内部全局地址的NAT表项。如果找到了,则把数据包的源地址用内部本地全局地址替换;如果仅配置了静态NAT,而没有与数据包匹配的静态NAT表项,则数据包不被转换,而直接被路由转发。

(3)路由器使用内部全局地址,把数据包发往目的地址。

当数据包是从公用网络发往内部网络时,NAT的基本转换原理如下:

(1)公用网络上的计算机发送数据包到私用网络时,采用源地址是外部全局地址,目的地址为内部全局地址进行封装。

(2)当数据包到达内部网络中,NAT路由器查找地址转换表和目的地址,映射到残余域(私有内部网络)中的计算机。

(2)如果存在匹配的NAT表项,则路由器把内部全局地址转换成内部本地地址,然后在发往目的计算机前检查路由表。如果没有发现与之匹配的NAT表项,数据包不被转换而直接检查与目的地址匹配的路由表。如果没有发现与目的地址路由表项,则数据包将被丢弃。