1
计算机网络技术理论与实践
1.7.3.1 6.3.1 NAT工作原理

6.3.1 NAT工作原理

在NAT术语中,内部网络指的是需要地址转换的网络,其中使用了私有IP地址,外部网络指的是使用其他非私有IP地址的网络。根据位于私有网络还是在公有网络中以及数据流是进入还是离开,IP地址有不同的称谓。

图6-2说明了各种NAT术语。对路由器R2进行配置,使其能够提供NAT功能。R2中有一个可供内部主机使用的公有IP地址池。下面介绍NAT中经常使用的术语。

img167

图6-2 NAT术语解释

内部本地地址:通常不是RIR或ISP分配的IP地址,而是RFC 1918中规定的私有IP地址。在图6-2中,主机PC1所分配的IP地址192.168.1.100就是内部本地地址。

内部全局地址:指的是内部主机发送的数据包从NAT路由器向外发送时,分配给它们做为源IP地址的公有IP地址。PC1将数据包发送到Web服务器100.1.1.100时,路由器R2必须对数据包中的源IP的地址进行转换。例如,PC1从地址池中获取到的做为数据包源IP地址200.1.1.100就是内部全局地址。

外部全局地址:分配给Internet上主机的可达IP地址。例如,Web服务器的可达IP地址100.1.1.100就是外部全局地址。

外部本地地址:给外部网络中的主机分配的本地IP地址。在大多数情况下,该地址与外部设备的外部全局地址相同。

在NAT中,术语“内部”与RFC1918定义的私有地址并不是同义词。这里所说的“不可路由”地址也不是指在任何情况下都不能路由,管理员可配置路由器使这些地址在私有子网中可以进行路由,只有当使用私有IP地址的数据包传输给ISP时,ISP的边界路由器会将其丢弃,也就是说ISP的路由器上是不能路由私有IP地址的,即不能在Internet中路由。

NAT有很多优点:

·NAT让内部网络可使用私有IP地址以节省注册的公有IP地址。NAT通过端口级多路复用节省了公有IP地址。使用NAT重载时,多个内部主机可使用单个公有IP地址与Internet进行通信。这样只需少数几个公有IP地址就可支持大量内部主机连入Internet。

·NAT提高了连接到公有网络的灵活性。为确保可靠的公有网络连接,可使用多个地址池、备用地址池和负载均衡地址池。

·NAT提供了一致的内部网络编址方案。在没有使用私有IP地址和NAT的网络中,要修改公有IP地址,必须给网络中所有的主机重新编址,代价非常高。使用NAT后,可在保留现有私有IP地址编址方案的同时,支持新的公有IP地址编址方案,当更换ISP时无须对网络内部主机做任何修改。

·NAT提供了网络安全性。由于私有网络不对外通告其内部编址方案和拓扑结构,因此使用NAT提供受控的外部访问时,内部网络的安全性较高。NAT也存在了一些缺陷:

·NAT增加了延迟(latency)。延迟是由数据包的地址转换处理引起的,因为需要转换包含在每个数据包报头中的IP地址,从而增加了处理器的开销。路由器的CPU必须对每个数据包进行处理,以决定是否需要对IP报头中的IP地址进行转换。

·NAT隐藏了端到端的IP地址,使一些应用程序不可用。因为NAT转换的是IP报头中的IP地址,而不是数据包有效载荷内部的IP地址,一些使用数据包有效载荷内部IP地址的应用程序将无法正常工作。

·NAT改动IP地址,失去了跟踪端到端IP流量的能力。一方面从安全角度看,它防止了黑客识别数据包的真实来源。但是另一方面,它牺牲了端到端的可说明性(责任明确性)。

·当出现恶意流量时,NAT使故障排除或追踪更加困难,这是因为流量可以来自使用不同IP地址的单个用户,这些IP地址取决于流量所经过的NAT路由器。这使得追踪恶意的连接更加困难。

·由于需要从外部网络访问的主机将有两个IP地址:一个内部地址,一个外部地址,这就产生了分裂DNS问题。用户需要设置两个DNS服务器,一个用于外部地址,一个用于内部地址。如果内部主机指向外部DNS服务器,就会出现严重后果。

1.转换内部本地地址

运行NAT进程的路由器通常连接了两个网络,并且将本地私有IP地址转换为全局已注册的公有IP地址,这些IP地址在Internet上是可路由的。NAT的处理过程主要有6步,如图6-3所示。

img168

图6-3 转换内部本地地址的过程

(1)IP地址为10.1.1.101的主机发送数据包到100.1.1.100的主机。

(2)当第一个数据包到达NAT边界路由器时,它首先检查NAT表,看数据包的源IP地址项是否能与NAT表中的内部本地地址字段相匹配。

(3)如果在NAT表中找到了一个匹配项,就执行第4步。如果没有找到匹配项,NAT路由器就在其可用的公有IP地址池中选择一个地址。在NAT表中创建一个新的表项,填入这个内部本地地址与所选公有IP地址的匹配关系。在本例中,NAT路由器将内部本地地址10.1.1.101与公有IP地址200.1.1.100对应起来,并将对应关系保存到NAT表中。

(4)NAT边界路由器用公有IP地址200.1.1.100代替数据包中的内部本地地址10.1.1.101,这样数据包中的源IP地址变成了在Internet上已注册的公有IP地址。

(5)当Internet上IP地址为100.1.1.100的主机对数据包进行应答时,它使用由NAT路由器分配的公有IP地址200.1.1.100作为目的IP地址。

(6)当NAT边界路由器接收到来自100.1.1.100的应答,发现它的目的地址为200.1.1.100时,NAT路由器将查询NAT表,找到与200.1.1.100相对应的内部本地地址10.1.1.101,并将数据包中的目的IP地址改为10.1.1.101,然后将其发送给对应的内部主机。

外部网络的目的主机也可以在NAT设备之后,而且很可能与发送数据包的主机使用同样的私有IP地址空间。但是对于发送方主机来说这些是不可知的,因为NAT对于主机是透明的。

2.重载内部全局地址

通过允许NAT边界路由器为多个内部本地地址使用单个内部全局地址,就可以减少内部全局地址池中公有IP地址的数量,这种方法称为“重载”。当启用NAT重载时,路由器会在NAT表中维护进程级别的映射。重载是利用进程标识完成的,在Internet上每个进程都使用“IP地址+TCP/UDP端口号”的方式进行唯一标识,而端口号是16位,可以有65 535×2=131 070个,这样每个IP地址就可以标识出10万多个进程。通常网络通信的终端为进程,所以将多个内部本地地址上的进程映射到同一个内部全局地址上的不同进程,就可以实现内部本地地址上的进程与Internet上进程的通信,这就是重载。这时在NAT表中每条表项不再是IP地址,而是“IP地址+TCP/UDP端口号”。也就是说NAT表中的映射不再是以主机为单位,而是以进程为单位。

在使用重载时,每个内部本地地址和TCP/UDP端口号,可以映射到一个唯一的内部全局地址和TCP/UDP端口号上,这样通过内部全局地址和TCP/UDP端口号就可以唯一确定一个内部本地地址上的通信进程,从而能够区别开从不同内部本地地址上的进程发送的数据。当NAT路由器上使用IP地址池时,地址池中会有多个IP地址,重载可以使大量的内部主机私有IP地址被转换到规模较小的公有IP地址的地址池中。

图6-4中显示了当一个内部全局IP地址代表多个内部本地IP地址时,NAT是如何工作的。当NAT路由器将多个不可路由的内部本地IP地址转换为单个可路由的内部全局IP地址时,它执行下面的步骤,以重载内部全局IP地址。

img169

图6-4 内部全局IP地址的NAT重载

(1)内部IP地址为10.1.1.101的设备PC1试图与外部网络上IP地址为100.1.1.100的服务器Server 1进行连接。

(2)NAT边界路由器接收到来自主机PC1的第1个数据包,检查自己的NAT表,在NAT表中没有查到PC1主机内部本地IP地址的映射项,路由器就在NAT表中创建一项。由于启用了重载,路由器NAT表中需要采用扩展项,包括“IP地址+协议号+TCP/UDP端口号”。路由器选择一个可路由内部全局IP地址、协议号、没有使用的TCP/UDP端口号,将其与发送来的数据包中的内部本地IP地址、协议号和TCP/UDP端口号进行映射,并填入NAT表。

(3)路由器用所选择的可路由内部全局IP地址和TCP/UDP端口号取代数据包中的源IP地址和源端口号,然后转发该数据包。在本例中,源IP地址为内部本地IP地址10.1.1.101,源端口号为5000,修改为内部全局IP地址200.1.1.100,端口号为5000。

(4)Internet上的主机Server 1接收到数据包后,使用内部全局IP地址200.1.1.100和端口号5000作为应答数据包中的目的IP地址和目的端口号。

(5)NAT边界路由器接收到来自Server 1的数据包后,它按照数据包中的目的IP地址、协议和端口号在NAT表中进行查找,得到映射的内部本地IP地址10.1.1.101和端口号5000,并将数据包中的目的IP地址和目的端口号转换为10.1.1.101和5000,并将其发送到内部网络中,这样内部网络中的主机PC1上的进程就可以收到Server 1的响应了。

后续的数据包将反复执行上述过程,直到连接被关闭为止。如果采用的是TCP端口,一旦关闭了TCP连接,NAT路由器就删除NAT表中的相应表项;如果采用的是UDP端口,由于UDP连接中不包含状态信息,因此,当在规定时间内不活动时,NAT中相应表项就将被删除。

当PC2同时与Server2通信时,IP地址为100.1.1.100和101.1.1.100的服务器都认为它们在与IP地址为200.1.1.100的主机上的进程进行通信。但是实际上它们是与不同的主机10.1.1.101和10.1.1.102上的进程进行端到端的通信。由于重载的端口号是不同的,NAT边界路由器就可以将数据包转发到内部网络中正确的主机上。

3.使用TCP负载分配

TCP负载分配(TCP Load Distribution)是对目的IP地址进行转换的一种动态方式,当从外部网络建立到内部网络的连接时,外部网络需要向NAT边界路由器上的内部全局IP地址发起连接请求,由NAT路由器将连接请求转发给内部网络上具有内部本地IP地址的多台主机,以实现负载分配。图6-5显示了TCP负载分配步骤,NAT的处理过程如下。

(1)在图6-5中,外部网络中的主机PC1使用外部全局IP地址100.1.1.100,试图建立到IP地址为200.1.1.100的虚拟服务器的80端口的TCP连接。

img170

图6-5 TCP负载分配步骤

(2)NAT边界路由器接收到这个新的连接请求,会根据数据包中的源IP地址和端口号查找NAT表,如果没有查找到映射表项,则会建立一个新的映射,将一个实际的内部本地IP地址10.1.1.101和端口号80作为内部全局IP地址200.1.1.100和80端口的映射,并与源IP地址和端口号一起填入NAT表中。

(3)NAT边界路由器用所选择的实际内部本地IP地址10.1.1.101和端口号80取代数据包中的目的IP地址和目的端口号,并将数据包转发到内部网络中。

(4)内部网络中本地内部IP地址为10.1.1.101的主机Server 1会接收到数据包,并对PC1进行应答。

(5)NAT边界路由器接收到来自服务器Server 1的数据包时,使用内部本地IP地址10.1.1.101和端口号80及外部IP地址100.1.1.100和端口号5000作为关键词在NAT表中进行查找。查找到相应本地全局IP地址200.1.1.100和端口号80后,NAT边界路由器将应答数据包中的源IP地址和源端口号转换为本地全局IP地址200.1.1.100和端口号80,并将数据包转发到外部网络中。

(6)到虚拟服务器的下一个连接请求会导致NAT边界路由器将具有内部本地IP地址10.1.1.102和端口号80的Server 2分配为内部全局IP地址200.1.1.100,端口号80的映射,然后继续执行上述过程,当所有的内部本地IP地址都用完后,NAT边界路由器会从内部本地IP地址池的开始处再重新进行映射。