以下内容摘自正在全面热销的最新网络设备图书“豪华四件套”之一《Cisco路由器配置与管理完全手册》(第二版)(其余三本分别是:《Cisco交换机配置与管理完全手册》(第二版)、《H3C交换机配置与管理完全手册》(第二版)和《H3C路由器配置与管理完全手册》(第二版) )。目前在京东网、当当网、卓越网、互动出版网等书店全面热销中,购买该套装将直减30元:http://book.dangdang.com/20130730_aife、http://item.jd.com/11299332.html http://www.china-pub.com/STATIC/zt_mb/zt_huodong_2013_1.asp?filename=2013_slwd_0801
在NAT进行IP地址转换中,许多读者朋友对几种IP地址转换方式所对应的转换原理总是搞不清楚,更不清分不清内/外部地址转换的区别,在读者QQ群中经常有人提出有方面的问题,为此笔者这次从最新的“四件套”图书中全面摘出这部分内容供大家分享。至于其中所涉及的网络通信原理方面大家可通过广受好评的《深入理解计算机网络》一书全面得到深入理解,可在这里查看本书相关信息:http://product.dangdang.com/23166396.html
6.2 NAT转换方式及原理
在NAT的应用中,可以仅需要转换内部地址(就是“内部本地址”转换成“内部全局地址”),这是最典型的应用,如内部网络用户通过NAT转换共享上网;也可以是仅需要转换外部地址(就是“外部全局地址”转换“外部本地地址”之间的转换),如外部用户要访问位于内部网络中的服务器;当然还可以同时转换内部地址和外部地址。
为了方便理解本节后面所介绍的一些配置,现简单介绍NAT的基本配置思路:
(1)使用ip nat inside source(定义内部本地地址到内部全局地址的映射),或者ip nat outside source(定义外部全局地址到外部本地地址的映射),或者ip nat pool(定义一个内部全局地址池,或者一个外部本地地址池)命令定义一个IP地址映射。具体要使用哪个命令,如何配置地址映射要视所就用的NAT类型和地址转换类型而定。可以是静态地址映射,也可以是动态地址映射,或者端口地址映射(PAT);可以是内部地址转换,也可以是外部地址转换,或者内、外部地址同时转换。
本节为了方便介绍,仅以静态NAT转换为例进行介绍,所以在下面各小节中仅使用了ip nat inside source static,或者ip nat outside source static命令。
(2)使用ip nat inside命令指定内部接口,使用ip nat outside命令指定外部网络接口。
6.2.1 NAT基本IP地址转换原理
总体来说,NAT进行地址转换的过程就是“本地地址”与“全局地址”之间的转换过程,无论数据包是从内部网络发往外部网络,还是从外部网络发往内部网络。不同的只是本地地址和全局地址所对应的网络不同,以及数据包重新封装的源和目的地址不同。具体如图6-8所示。这个过程是通过NAT中的本地址与全局地址映射条目来实现的,所以事先要在NAT路由器上配置这样的映射条目。
图6-8 NAT基本地址转换原理
当内部网络用户访问外部网络时,所进行的是“内部本地地址”和“内部全局地址”之间的转换。
在NAT路由器接收到来自内部网络主机发送的数据包时,其源IP地址(SA)为“内部本地地址”,目的IP地址(DA)为“外部本地地址”。当数据包被转发到外部网络时,数据包的源IP地址(SA)就会转变为“内部全局地址”,而目的IP地址(DA)被转变为“外部全局地址”。也就是把数据包的所有源IP地址(SA)和目的IP地址(DA)全部由本地地址转换为全局地址。如图6-9上部分数据包IP地址转换示意图。
相反,当外部网络用户访问内部网络时,所进行的是“外部本地地址”和“外部全局地址”之间的转换。
在NAT路由器接收到来自外部网络主机发送的数据包时,其源IP地址(SA)就是“外部全局地址”,目的IP地址(DA)就是“内部全局地址”。相当于由内部网络向外部网络发送数据包时数据包中的源IP地址(SA)和目的IP地址(DA)的互换。而当数据包被路由器转发到本地网络时,源IP地址(SA)被转变为“外部本地地址”,目的IP地址(DA)被转变为“内部本地地址”,也相当于由内部网络向外部网络发送数据包时数据包中的源IP地址(SA)和目的IP地址(DA)的互换。如图6-9下部分数据包IP地址转换示意图。
图6-9 NAT基本IP地址转换原理
以上是从总体上介绍NAT的IP地址转换原理的,实际NAT应用有时并不需要对源IP地址和IP地址进行全面替换,仅需要对源IP地址或者仅需要对目的IP地址进行转换即可达到所需的目的。下面予以介绍。
6.2.2 内部地址NAT转换原理
多数情况下使用NAT的目的就是为了使内部网络中的多个用户能使用一个注册IP地址访问外部网络,所以仅需要配置内部地址NAT转换。即通过ip nat inside source命令实现“内部本地地址”到“内部全局地址”之间的转换(既可以采用静态NAT方式实现,也可以采取动态NAT方式实现),只需要定义内部本地址与内部本局地址的映射。
图6-10是一个简单的NAT转换示例。要实现以下目的:当NAT路由器的内部网络s0接口上接收到一个源地址为内部本地地址10.10.10.1,目的IP地址为外部本地地址171.16.68.1的数据包时,在转发到s1接口时,原来数据包源地址的内部本地地址10.10.10.1被转换成内部全局地址171.16.68.5,但目的地址不变,然后继续发送。在这个过程中,所进行的只是数据包中源IP地址的转换,由内部本地地址向内部全局地址转换,且只是内部地址之间的转换。
图6-10 简单的NAT转换示例
相反,当在NAT路由器的外部网络接口s1上接收源地址为172.16.68.1外部本地地址,目的地址为内部全局地址172.16.68.5的外部服务器响应数据包时,目的地址将被转换成10.10.10.1这个内部本地地址,然后继续发送。在这个过程中,所进行的只是数据包中目的IP地址的转换,由内部全局地址向内部本地地址转换,也只是内部地址之间的转换。
下面仅以静态NAT转换方式为例介绍内部地址转换的配置步骤,详细的NAT配置方法将在本章后面具体介绍。
(1)使用“ip nat inside source static”全局配置命令启用基于内部源IP地址的静态NAT IP地址转换。也就是定义内部本地地址和内部全局地址,使它们之间形成一一对应的映射关系。
Router(config)#ip nat inside source static 10.10.10.1 171.16.68.5 !--- 在内部本地地址10.10.10.1与内部全局地址171.16.68.5之间建立静态NAT映射关系,使内部网络主机知道要以171.16.68.5这个地址到达外部网络主机
(2)使用以下两条语句配置路由器的s0为NAT的内部网络接口。
Router(config)#interface s0 !--- 进入s0串口配置模式
Router(config-if)#ip nat inside !--- 把s0串口指定为内部网络接口
(3)使用以下两条语句配置路由器的s1为NAT的外部网络接口。
Router(config)#interface s1 !--- 进入s1串口配置模式
Router(config-if)#ip nat outside !--- 把s1串口指定为外部网络接口
(4)使用show ip nat translations特权模式命令验证上述进行的路由器NAT配置。输出信息中显示以上配置的NAT条目配置为:内部本地地址为10.10.10.1,内部全局地址为171.16.68.5。这与上面的配置是一致的,证明配置是成功的。
Router#show ip nat translations !--- 在特权模式下显示当前路由器NAT配置
Pro Inside global Inside local Outside local Outside global
--- 171.16.68.5 10.10.10.1 --- ---
此时如果对外部网络目的主机进行ping操作,就会有数据包从内部网络转发到外部网络。然后再在路由器特权模式下执行“show ip nat translations”命令,显示的NAT信息如下。多了一条icmp协议类型数据包(执行ping操作后加的)显示,但因为此时没有配置外部网络的本地地址和全局地址,所以显示的外部本地地址和外部全局地址都是一样的,都是ping操作目的主机地址171.16.68.1。
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 171.16.68.5:15 10.10.10.1:15 171.16.68.1:15 171.16.68.1:15
--- 171.16.68.5 10.10.10.1 --- ---
通过以上配置后,从内部网络发往外部网络的数据包只是源地址(SA)将在经过路由器后进行转换(由内部本地地址10.10.10.1转换成内部全局地址171.16.68.5),但目标地址(DA)不变,但从外部网络发往内部网络的应答数据包的源地址没有改变,只是经过路由器后的数据包目的地址发生了转换(由内部全局地址172.16.68.5转换成内部本地地址10.10.10.1),但源地址(SA)不变。因为此时还没有为NAT路由器配置外部网络的本地地址和全局地址转换。
此时,数据包在内、外部网络中的源地址、目的地址的转换方式参如图6-11所示。
图6-11内部地址NAT转换示例
【经验之谈】在内部地址的NAT转换中,无论数据包来自哪里,数据包中地址变化的只是内部地址之间的转换。但要注意,地址变化所对应的是源地址,还是目的地址是要看数据包是来自内部网络,还是来自外部网络:如果是来自内部网络,转换是源地址;如果是来自外部网络,转换的是目的地址。
6.2.3 外部地址NAT转换原理
当公司服务器位于内部网络,使用内部网络私有IP地址,为了方便外部网络用户对内部网络服务器进行访问,则需要使用ip nat outside source命令配置“外部全局地址”与“外部本地地址”之间的转换(既可以采用静态NAT方式实现,也可以采取动态NAT方式实现)。外部地址NAT转换与上节介绍的内部地址NAT转换是相反的,它仅需要定义外部地址(包括外部本地地址和外部全局地址)。
下面同样以图6-10所示的示例进行介绍。本示例要实现的目的是:当NAT路由器外部网络接口s1接收到来自外部网络用户发送的源IP地址为外部全局地址171.16.68.1,目的地址为外部本地地址10.10.10.1的数据包在被路由器转发到s0接口时,数据包中的源IP地址转变为外部本地地址10.10.10.5(即由外部全局地址转换成外部本地地址),目的IP地址不变,即也只是源IP地址的转换;而由内部网络用户发送的响应数据包中,却只是目的IP地址(即由外部本地地址转换为外部全局地址)的转换,源IP地址不变。
下面仅以静态NAT转换方式为例介绍外部地址NAT转换的配置步骤,详细的NAT配置方法将在本章后面具体介绍。
(1)使用ip nat outside source static全局配置命令启用基于外部源IP地址的静态NAT IP地址转换。也就是定义外部全局地址和外部本地地址之间的映射关系。
Router(config)#ip nat outside source static 171.16.68.1 10.10.10.5 !--- 在外部全局地址171.16.68.1与外部本地地址10.10.10.5之间建立静态NAT转换关系,使外部网络主机知道要以10.10.10.1这个地址到达内部网络主机
(2)使用以下两条语句配置路由器的s0作为NAT的内部网络接口。
Router(config)#interface s0
Router(config-if)#ip nat inside
(3)使用以下两条语句配置路由器的s1作为NAT的外部网络接口。
Router(config)#interface s1
Router(config-if)#ip nat outside
【注意】对于特定的NAT网络来说,路由器上的内、外部网络接口是固定的,不会随着通信方向的改变而改变。如在上节介绍的内部地址的NAT转换示例中,我们同样是把s0接口作为内部网络接口,s1接口作为外部网络接口。
(4)使用show ip nat translations特权模式命令验证上述进行的路由器NAT配置。从中可以看出,此时NAT的外部本地地址为10.10.10.5,外部全局地址为171.16.68.1。这与上面的配置是一致的,证明配置是成功的。
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- --- --- 10.10.10.5 171.16.68.1
同样,如果此时执行一个从外部网络主机(171.16.68.1)到内部网络主机(10.10.10.1)的ping操作,然后再在路由器特权模式下执行“show ip nat translations”命令,则显示如下结果。因为此时仅配置了外部本地地址和外部全局地址,所以结果中显示的内部本地地址和全局地址都是一样的,都是ping操作目的主机地址10.10.10.1。
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- --- --- 10.10.10.5 171.16.68.1
icmp 10.10.10.1:37 10.10.10.1:37 10.10.10.5:37 171.16.68.1:37
与上节介绍的仅配置内部地址相反,此处从外部网络发往内部网络的数据包的源IP地址(SA)将在经过路由器后进行转换(由外部全局地址171.16.68.1转换成外部本地地址10.10.10.5),但目标地址(DA)不变;但从内部网络发往外部网络的响应数据包的源IP地址没有改变,只是经过路由器后的数据目的IP地址发生了改变(由外部本地地址10.10.10.5转换成外部全局地址171.16.68.1)。因为此时还没有为NAT路由器配置内部本地地址和内部全局地址转换。此时,数据包在内、外部网络中的源IP地址、目的IP地址的转换方式如图6-12所示。
【经验之谈】在仅进行外部地址NAT转换时,无论数据包来自哪里,数据包中地址变化的只是外部地址之间的转换。同样也需注意,地址变化所对应的是源IP地址,还是目的IP地址是要看数据包是来自内部网络,还是来自外部网络:如果来自内部网络,转换是目的IP地址;如果来自外部网络,转换的是源IP地址。这与前面的内部地址NAT转换是对应相反的。
图6-12外部地址NAT转换示例
6.2.4 内/外部地址NAT转换原理
下面介绍同时进行内、外部地址NAT转换原理及基本配置步骤。它需要同时使用ip nat inside source命令定义“内部全局地址”与“内部本地地址”之间的转换,及使用ip nat outside source命令定义“外部全局地址”和“外部本地地址”之间的转换(既可以采用静态NAT方式实现,也可以采取动态NAT方式实现)。这样,无论数据包是从哪个方向发送的,数据包中的源地址和目的地址都将同时发生变化。主要应用于重叠网络(Overloading Network)中的NAT应用中。具体配置方法将在本章6.6节介绍。
同样以图6-10所示的基本网络结构为例进行介绍。在下面的示例中,通过配置可以实现:当NAT路由器内部网络接口s0接收到来自内部网络,源IP地址为内部本地地址10.10.10.1,目的IP地址为外部本地地址10.10.10.5的数据包,在转发到s1接口前,将这个数据包中的源IP地址将转换成内部全局地址171.16.68.5,目的IP地址将被转换成外部全局地址171.16.68.1。
当NAT路由器外部接口s1接收到来自外部网络,源IP地址为外部全局地址171.16.68.1,目的地址为内部全局地址172.16.68.5的数据包时,将源IP地址转换成外部本地地址10.10.10.5,将目的IP地址将被转换成内部本地址10.10.10.1。
下面仅以静态NAT转换方式(可以采用动态NAT转换方式)为例介绍内、外部地址同时转换的配置步骤,详细的静态,或者动态NAT转换配置方法将在本章后面具体介绍。
Router(config)#ip nat inside source static 10.10.10.1 171.16.68.5 !--- 在内部本地地址10.10.10.1与内部全局地址171.16.68.5之间建立静态NAT映射关系,使内部网络主机知道要以171.16.68.5这个地址到达外部网络主机
Router(config)#ip nat outside source static 171.16.68.1 10.10.10.5 !--- 在外部全局地址171.16.68.1与外部本地地址10.10.10.5之间建立静态NAT映射关系,使外部网络主机知道要以10.10.10.5这个地址到达内部网络主机
Router(config)#interface s 0
Router(config-if)#ip nat inside
Router(config-if)#end
Router(config)#interface s 1
Router(config-if)#ip nat outside
Router(config-if)#end
Router(config)# end
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- --- --- 10.10.10.5 171.16.68.1
171.16.68.5 10.10.10.1 --- ---
同样,如果此时分别执行一个从内部主机到外部主机,以及从外部主机到内部主机的ping操作,然后再在路由器特权模式下执行“show ip nat translations”命令,则显示如下结果。因为此时同时配置了内、外部本地地址和全局地址,所以结果中显示了两条NAT配置项,分别显示了与外部网络和内部网络中的本地地址和全局地址转换对应的ping操作icmp消息:与外部本地地址和全局地址对应的Ping操作ICMP消息中显示内部网络中的本地地址和全局地址是一样的,而与内部网络本地地睛和全局地址对应的Ping操作ICMP消息中显示外部网络中的本地地址和全局地址是一样的,都是对应的Ping操作目的主机地址。
Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- --- --- 10.10.10.5 171.16.68.1
icmp 10.10.10.1:4 10.10.10.1:4 10.10.10.5:4 171.16.68.1:4
icmp 171.16.68.5:39 10.10.10.1:39 171.16.68.1:39 171.16.68.1:39
--- 171.16.68.5 10.10.10.1 --- ---
经过以上配置后,数据包发送(无论是从哪个方面发送的)时不仅源IP地址会发生变化,目标IP地址也会同时发生变化,如图6-13所示。
在由内部网络向外部网络发送的数据包中,源IP地址是由内部本地地址(10.10.10.1)转换成内部全局地址(172.16.68.5),目的IP地址由外部本地地址(10.10.0.5)转换成外部全局地址(171.16.68.1);在由外部网络向内部网络发送的数据包中,源IP地址是由外部全局地址(171.16.68.1)转换成外部本地地址(10.10.0.5),目的IP地址由内部全局地址(172.16.68.5)转换成内部本地地址(10.10.10.1)。两个方向的数据包中的源IP地址和目的IP地址的转换分别如图6-14和图6-15所示。
图6-13 同时配置了内、外部地址转换后的NAT转换示例
图6-14 数据包从内部网络发到外部网络时的地址转换方式 图6-15 数据包从外部网络发到内部网络时的地址转换方式
从图6-14和图6-15可以看出,图6-14中的源IP地址转换过程恰好是图6-15中的目的地址转换的反过程。同理,图6-14中的目的IP地址转换过程恰好是图6-15中的源IP地址转换的反过程。
另外,经过细心分析我们可以发现,在由内部网络发往外部网络的数据包中所进行的地址转换都是由本地地址转换为全局地址,也就是都是由内部网络一侧的地址向外部网络一侧的地址转换;相反,在由外部网络发往内部网络的数据包中所进行的地址转换都是由全局地址转换为本地地址,也就是都是由外部网络一侧的地址向内部网络一侧的地址转换。