私有地址和NAT合理使用 提高整个因特网进行通信效率

作者: 2011/4/29 11:34:13

  在这条技巧中,我们看到了NAT是如何使一个网络在为其内部主机使用一块私有网络地址的同时,还能与整个因特网进行通信的。特别值得一提的是,对只有一个全局可达IP地址的小网络来说,PAT非常有用。但是,由于PAT修改了输出分组的源端口号,可能会给那些将与端口号有关的信息放在报文主体中传输的非标准协议带来一些问题。

  在便宜且无处不在的因特网连接出现之前,一个组织为其网络任意选择一段IP地址的情形非常普遍。毕竟网络没有而且"永远不会"连接到任何外部网络上去,因此人们并不认为IP地址的选择是什么问题。不过,世事难料,现在没有因特网连接的网络数量可能只占一小部分了。

  人们不再需要为私有网络去任选一块IP地址了。RFC1918[Rekhter et al., 1996]指定了三块永远不会被分配的保留IP地址。这三个地址块是:

  10.0.0.0--10.255.255.255 (前缀10/8);

  172.16.0.0--172.31.255.255(前缀172.16/12);

  192.168.0.0--192.168.255.255(前缀192.168/16)。

  网络使用这三块地址中的任意一块时,网络中的任意一台主机都可以访问此网络中的所有其他主机,而无须担心与全局分配的IP地址产生冲突。当然,只要与外部网络没有连接,分配什么样的地址都是无所谓的,那就不妨使用上述某个私有地址块了,这样还可以预防以后需要连接到其他网络的情况。

  如果网络真的和外部相连会发生什么情况呢?使用私有IP地址的主机如何跟因特网或其他外网上的主机进行通信呢?这个问题最常见的答案就是使用NAT(Network Address Translation,网络地址翻译)。支持NAT的设备类型包括路由器、防火墙和独立的NAT产品。NAT负责在私有网络地址和一个或多个全局分配的IP地址之间进行翻译。我们来简要地看看它的工作原理。大部分NAT设备都可以配置为支持以下三种模式。

  (1)静态--将私有网络上的部分或所有主机的私有IP地址都映射为一个固定的、全局分配的地址。

  (2)地址池--NAT设备有一组全局分配的IP地址可用,它会将其中之一动态地分配给需要与外部网络中的对等实体进行通信的主机。

  (3)PAT--也称为PAT(Port Address Translation,端口地址转换),只有一个全局分配地址时可以使用这种方法,比如图2-12所示的情况。使用PAT时,所有私有地址都映射为同样的外部地址,但输出分组的源端口会被修改成唯一的值,通过它可以将输入分组与私有网络地址相关联。

  图2-12显示了一个带有三台主机的小型网络,此网络使用的是10/8地址块。还有一台标识为NAT的路由器,它拥有一个私有网络地址和一个因特网地址。

  这里只显示了一个与NAT相关的全局地址,因此我们假设在后继讨论中,配置为使用PAT方式。静态NAT和地址池情况与此类似,但更复杂一些,因为它们除了管理外部端口之外,还要管理外部地址。

  假设主机H2要向204.71.200.69,www.yahoo.com的Web服务器之一,发送一个TCP SYN段,以便打开一个连接。在图2-13A中可以看到这个段离开H2时目的地址为204.71.200.69.80,源地址为10.0.0.2.9600。

 
图2-12 带有NAT路由器的私有网络

  这里使用的是标准记法,IP地址以A.B.C.D.P的形式书写,其中A.B.C.D是IP地址,P是端口号。

  这里除了源地址是个私有网络地址之外,没什么特别的。这个段抵达路由器时,NAT必须将其源地址转换成205.184.151.171,这样Yahoo的Web服务器才会知道应该把它的SYN/ACK和其他应答送到哪里去。所有来自或发往私有网络中其他主机的因特网流量也都会将其地址转换成205.184.151.171,所以NAT也必须将源端口转换成一个唯一的端口号,这样它才能将那条连接上的输入流量发送给正确的主机。我们看到,源端口9600被映射成了5555。因此传送给Yahoo的段,目的地址为204.71.200.69.80,源地址为205.184.151.171.5555。

  如图2-13B所示,Yahoo的应答到达路由器时,会被发送给205.184.151.171.5555。NAT在其内部状态表中查找这个端口,并发现端口5555与地址10.0.0.2.9600相关,因此,会将应答从路由器传送给H2,其源地址为204.71.200.69.80,目的地址为10.0.0.2.9600。

 
图2-13 端口地址转换

  尽管从前面的讨论来看PAT好像简单易懂,但有很多细节问题使它比看起来要复杂一些。比如,修改源地址和端口号会改变IP的首部校验和以及TCP段的校验和,因此这些值都要进行调整。

  FTP(File Transfer Protocol,文件传输协议)[Reynolds and Postel, 1985]是另外一个可以说明其复杂性的例子。一个FTP客户端要向FTP服务器发送文件,或接收来自FTP服务器的文件时,会向服务器发送一条PORT命令,命令中包含了它监听服务器(数据)连接的地址和端口号。这就意味着,首先,NAT要能够识别出这个TCP段是一条FTP PORT命令,而且必须对地址和端口进行转换。而且,PORT命令中的地址和端口号是作为ASCII字符串传送的,对它们的修改可能会改变段的长度。这又意味着序列号(参见技巧1)的改变,NAT还要记录这种变化,以便对ACK中的序列号进行调整,而且来自私有网络主机的后续段也要依次对其序列号进行调整。

  除了这些难点之外,NAT工作得很好,并被广泛应用。尤其是在只有一条因特网连接可用时,用PAT将一个小网络连接到因特网上去是种很自然的方式。

特别推荐

玩家留言 跟帖评论
查看更多评论