NAT地址转换原理
ANTIBili_MC
2018年04月09日 00:19

以下内容摘自正在全面热销的最新网络设备图书“豪华四件套”之一《Cisco路由器配置与管理完全手册》(第二版(其余三本分别是:《Cisco交换机配置与管理完全手册》(第二版《H3C交换机配置与管理完全手册》(第二版《H3C路由器配置与管理完全手册》(第二版 ) 在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 sourcestatic,或者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地址转换的反过程

另外,经过细心分析我们可以发现,在由内部网络发往外部网络的数据包中所进行的地址转换都是由本地地址转换为全局地址,也就是都是由内部网络一侧的地址向外部网络一侧的地址转换;相反,在由外部网络发往内部网络的数据包中所进行的地址转换都是由全局地址转换为本地地址,也就是都是由外部网络一侧的地址向内部网络一侧的地址转换。

网络地址转换NAT原理及其作用

1 概述

1.1 简介

NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。

1.2 分类

NAT有三种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)

其中,网络地址端口转换NAPT(Network Address Port Translation)则是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。

NAPT是使用最普遍的一种转换方式,在HomeGW中也主要使用该方式。它又包含两种转换方式:SNAT和DNAT。

(1)源NAT(Source NAT,SNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成数据包伪装就是一具SNAT的例子。

(2)目的NAT(Destination NAT,DNAT):修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据懈的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。

我们在没有理解NAT原理前当然理解不了上面所说的功能,我们先看下NAT的原理。

 

2 原理

2.1 地址转换

NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。

如下图所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共 IP,为202.20.65.5;私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机202.20.65.4发送了1个IP包(Dst=202.20.65.4,Src=192.168.1.2)。

当IP包经过NAT网关时,NAT Gateway会将IP包的源IP转换为NAT Gateway的公共IP并转发到公共网,此时IP包(Dst=202.20.65.4,Src=202.20.65.5)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT Gateway的公共IP,Web Server发出的响应IP包(Dst= 202.20.65.5,Src=202.20.65.4)将被发送到NAT Gateway。

这时,NAT Gateway会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=202.20.65.4)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。转换示意图如下。

如果内网主机发出的请求包未经过NAT,那么当Web Server收到请求包,回复的响应包中的目的地址就是私网IP地址,在Internet上无法正确送达,导致连接失败。

2.2 连接跟踪

在上述过程中,NAT Gateway在收到响应包后,就需要判断将数据包转发给谁。此时如果子网内仅有少量客户机,可以用静态NAT手工指定;但如果内网有多台客户机,并且各自访问不同网站,这时候就需要连接跟踪(connection track)。如下图所示:

在NAT Gateway收到客户机发来的请求包后,做源地址转换,并且将该连接记录保存下来,当NAT Gateway收到服务器来的响应包后,查找Track Table,确定转发目标,做目的地址转换,转发给客户机。

2.3 端口转换

以上述客户机访问服务器为例,当仅有一台客户机访问服务器时,NAT Gateway只须更改数据包的源IP或目的IP即可正常通讯。但是如果Client A和Client B同时访问Web Server,那么当NAT Gateway收到响应包的时候,就无法判断将数据包转发给哪台客户机,如下图所示。

此时,NAT Gateway会在Connection Track中加入端口信息加以区分。如果两客户机访问同一服务器的源端口不同,那么在Track Table里加入端口信息即可区分,如果源端口正好相同,那么在执行SNAT和DNAT的同时对源端口也要做相应的转换,如下图所示。(这里的理解灰常重要)

现在就可以理解NAT协议的应用了吧。

3.NAT协议的应用

NAT主要可以实现以下几个功能:数据包伪装、平衡负载、端口转发和透明代理。

数据伪装: 可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网。

端口转发: 当内网主机对外提供服务时,由于使用的是内部私有IP地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。

负载平衡: 目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。(不是很明白)

失效终结: 目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。(如何转移的?)

透明代理: NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。(如何重定向的?)

海阔天空 在勇敢以后 要拿执着 把命运的锁打破 冷漠的人 谢谢你们曾经看轻我 让我不低头 更精彩的活 海阔天空 狂风暴雨以后 转过头 对旧心酸一笑而过 最懂我的人 谢谢一路默默的陪我 让我拥有 好故事可以说 看未来 一步步来了

目的地址转换,源地址转换,重定向,地址映射,NAT,你能区别他们之间的区别吗?举个例子来说明吧。现假设有这样一个环境: Web服务器---------NAT路由器---------内部客户机 220.97.167.5 外:218.13.4.2 192.168.7.8 内:192.168.7.1 如上图(实在画得不好),内部客户机向Web服务器发送一个请求时,本来源地址是192.168.7.8,而目标地址应该是220.97.167.5。但经过NAT路由器的转换之后,原地址就变成了218.13.4.2,目标地址仍会是220.97.167.5。 反过来,Web服务器会回应我们的请求,那么这时源地址将会是220.97.167.5,目标地址是192.168.7.8。同样地,NAT路由器会处理这一请求,变成了源地址是192.168.7.1,目标地址是192.168.7.8 实际上,网络中数据的传输总是双向的,那么NAT路由器会同时转换请求与应答设备的源地址,以达到路由目的。地址转换(NAT)就是:路由器将私有地址转换为公有地址使数据包能够发到因特网上,同时从因特网上接收数据包时,将公用地址转换为私有地址。 在计算机网络中,网络地址转换(Network Address Translation或简称NAT,也叫做网络掩蔽或者IP掩蔽)是一种在IP数据包通过路由器或防火墙时重写源IP地址或/和目的IP地址的技术

地址转换NAT(Network Address Translation)又称地址代理,它实现了私有网络访问外部网络的功能。

这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。根据规范,路由器是不能这样工作的,但它的确是一个方便并得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致通信效率的降低

Réseau sans NAT

Réseau avec NAT开始,NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的。网络地址转换的在很多国家都有很广泛的使用,除了美国,因为历史的原因美国每个人几乎都得到了地址。所以NAT就成了家庭和小型办公室网络连接上的路由器的一个标准特征,因为对他们来说,申请多余的IP地址的代价要高于所带来的效益。

在一个典型的配置中,一个本地网络使用一个专有网络的指定子网(比如192.168.x.x或10.x.x.x)和连在这个网络上的一个路由器。这个路由器占有这个网络地址空间的一个专有地址(比如 192.168.0.1),同时它还通过一个或多个因特网服务提供商提供的公有的IP地址(叫做“过载” NAT)连接到因特网上。当信息由本地网络向因特网传递时,源地址被立即从专有地址转换为公用地址。由路由器跟踪每个连接上的基本数据,主要是目的地址和端口。 当有回复返回路由器时,它通过输出阶段记录的连接跟踪数据来决定该转发给内部网的哪个主机;如果有多个公用地址可用,当数据包返回时,TCP或UDP客户机的端口号可以用来分解数据包。对于因特网上的一个系统,路由器本身充当通信的源和目的地址。

有人一直认为,IPv6的广泛采用将使得NAT不再需要,因为NAT只是一个处理IPv4的地址空间不足的方法。

在一个具有NAT功能的路由器下的主机并没有建立真正的端对端连接,并且不能参与一些因特网协议。一些需要初始化从外部网络建立的TCP连接和使用无状态协议,比如UDP的服务将被中断。除非NAT路由器作一些具体的努力,否则送来的数据包将不能到达正确的目的地址。一些协议有时可以在应用层网关(见下)的辅助下,在参与NAT的主机之间容纳一个NAT的实例,比如FTP。NAT也会使安全协议变的复杂,比如IPsec。

端对端连接是被IAB委员会(Internet Architecture Board)支持的核心因特网协议之一,因此有些人据此认为NAT是对公用因特网的一个破坏。一些因特网服务提供商只向他们的客户提供本地IP地址,所以他们必须通过NAT来访问ISP网络以外的服务,并且这些公司能不能算的上真正的提供了因特网服务的话题也被谈起。

NAT除了带来方便和代价之外,对全双工连接支持的缺少在一些情况下可以看作是一个有好处的特征而不是一个限制。在一定程度上,NAT依赖于本地网络上的一台机器来初始化和路由器另一边的主机的任何连接,它可以阻止外部网络上的主机的恶意活动。这样就可以阻止网络蠕虫病毒来提高本地系统的可靠性,阻挡恶意浏览来提高本地系统的私密性。很多具有NAT功能的防火墙都是使用这种功能来提供核心保护的。另外,它也为UDP的跨局域网的传输提供了方便。

目前存在三种地址转换方式。一种是经常被简记为"NAT"的网络地址转换(有时也叫做“网络地址端口转换”,记做NAPT),这种方式支持端口的映射并允许多台主机共享一个公用IP地址。

第二种也可以称作NAT或“基本NAT”,“静态NAT",但在技术上更简单一点,仅支持地址转换,不支持端口映射,这就需要对每一个当前连接都要对应一个IP地址。宽带(broadband)路由器通常使用这种方式来允许一台指定的计算机去接收所有的外部连接,甚至当路由器本身只有一个可用外部IP时也如此,这台路由器有时也被标记为DMZ主机。

第三种称作动态NAT(pooledNAT)是在外部网络中定义了一系列的合法地址,采用动态分配的方式映射到内部网络。 [3] 

支持端口转换的NAT又可以分为两类:源地址转换和目的地址转换NAT 。前一种情形下发起连接的计算机的IP地址将会被重写,后一种情况下被连接计算机的IP地址将被重写。实际上,以上两种方式通常会一起使用以支持双向通信。

受到NAT影响的应用程序

一些高层协议(比如FTP,Quake,SIP)是在IP包的有效数据内发送网络层(第三层)信息的。比如,主动模式的FTP使用单独的端口分别来控制命令传输和数据传输。当请求一个文件传输时,主机在发送请求的同时也通知对方自己想要在哪个端口接受数据。但是,如果主机是在一个简单的NAT防火墙后发送的请求,那么由于端口的映射将会使对方接收到的信息无效。

一个应用层网关(Application Layer Gateway或ALG)可以修正这个问题。运行在NAT防火墙设备上的ALG软件模块可以更新任何由地址转换而导致无效的信息。显然,ALG需要明白它所要修正的上层协议,所以每个有这种问题的协议都需要有一个单独的ALG。

但是,除FTP外的大多数传统的客户机-服务器协议不需要发送网络层(第三层)信息,也就不需要ALG。

这个问题的另一个可能的解决方法是使用象STUN这样的技术,但是这只针对建立在UDP上的高层协议,并且需要它内建这中技术。这种技术对对称NAT也是无效的。还有一种可能的方案是UPnP,但它需要和NAT设备配合起来使用

负载平衡:目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。

失效终结: 目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。

透明代理:NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接

源网络地址转换

源地址转换是基于源地址的地址转换,主要用于内网访问外网,减少公有地址的数目,隐藏内部地址。

如IP地址为192.168.1.2,192.168.1.3,192.168.1.4的3台PC机,通过源地址转换后,共用119.75.213.61的公网IP地址和互联网连接。

目的地址转换

目的地址转换可分为目标地址映射、目标端口映射、服务器负载均衡等。目的地址转换也称为反向地址转换或地址映射。目的地址转换是一种单向的针对目标地址的映射,主要用于内部服务器向外部提供服务的情况,它与静态地址转换的区别在于它是单向的。外部可以主动访问内部,内部却不可以主动访问外部。另外,可使用目的地址转换实现负载均衡的功能,即可以将一个目标地址转换为多个内部服务器地址。也可以通过端口的映射将不同的端口映射到不同的机器上。

如互联网上的PC(218.92.1.2)通过访问互联网地址119.75.213.61,经过路由器的目的地址转换,成为访问置于内网的服务器192.168.1.100.