1.1、概述
RFC1631、RFC3022以及相关RFC定义的NAT(Network Address Translator)是一种将IP地址从一个编址域映射到另一个编址域的方法,典型的应用是把RFC1918定义的私有IP地址映射到Internet所使用的公有IP地址。NAT与网络中其它计算设备的关系如图1.1。虽然NAT技术已经得到广泛应用,但它是一把双刃剑,在带来节省IPv4地址空间等好处的同时,破坏了Internet最基本的“端到端的透明性”的设计理念,增加了网络的复杂性,阻碍了业务的创新。
IETF一直主张利用IPv6技术解决地址短缺问题,因此IETF虽然出版了几个与NAT相关的RFC,但对NAT技术(尤其是穿越问题)一直没有系统的标准工作,如SIP和Mobile IP就是NAT出现后设计的一些协议,都未考虑到NAT的穿越问题。现在业界意识到Internet在短期内不可能过渡到IPv6,IPv4和IPv6将长期共存,NAT以及NAT-PT(Network Address Translation - Protocol Translation)将继续得到长期应用,因此NAT相关问题开始引起IETF(Internet Engineering Task Force)和ITU-T(International Telecommunication Union)等相关国际标准化组织的关注。中国通信标准化协会IP与多媒体工作委员会也正在积极参与ITU-T SG16组的相关活动,加紧制定中国多媒体业务NAT穿越标准[1]。
1.2、分类
从功能上看,主要有以下几种典型的NAT(RFC2663),如图1.2)。
1.2.1、传统NAT
在多数情况下,传统NAT(Traditional NAT)允许位于内部网络的主机(采用RFC1918地址)透明地访问外部网络中的主机,把从外部网络到内部网络的访问作为一种特例。有关传统NAT的详细描述见RFC1631和RFC3022。传统NAT包括基本NAT和NAPT两大类。
(1)基本NAT
基本NAT可以分为两类:静态NAT和动态NAT。静态NAT的工作原理是将内部网络中的每个IP地址(可以是私有IP地址、公有IP地址)永久映射成外部网络中的某个IP地址。动态NAT的工作原理则是在外部网络中定义了一系列的IP地址,采用动态分配的方法映射到内部网络中的IP地址。
采用动态NAT意味着可以在内部网中定义很多的内部用户,通过动态分配的办法,共享很少的几个外部IP地址。而静态NAT则只能形成一一对应的固定映射方式。需要注意的是,动态NAT中动态分配的外部IP地址全部被占用后,后续的NAT申请将会失败,不过许多NAT有超时配置功能,可以在一定程度上提高外部IP的利用率和用户满意度。
(2)NAPT
NAPT(Network Address Port Translation)把基本NAT的概念延伸了一步,在翻译IP地址的同时也翻译传输层标识(如TCP/UDP的端口号,ICMP的查询ID),从而把多个内网主机的传输层标识映射到一个外部IP地址。NAPT可以使一组主机共享一个外部IP地址。在实际使用中可以把NAPT和基本NAT结合起来。
对于从内部网络向外的数据包,NAPT翻译源IP地址、源传输层标识以及相关字段,如IP、TCP、UDP和ICMP头校验和。对于进入内部网络的数据包,翻译目的IP地址、目的传输层标识以及相关字段。传输层标识可以是TCP/UDP端口号或ICMP查询ID中的任意一种。
1.2.2、双向NAT
双向NAT(Bi-directional Nat、Two-way NAT)支持从内部网络向外部网络发起会话请求,也支持从外部网络向内部网络发起会话请求。当在外出或进入任何一个方向上建立连接时,把内部网络IP地址静态或动态地映射到一个外部IP地址上。这里假设位于内部网络和外部网络之间的名字空间(FQDN,Fully Qualified Domain Names)是端到端唯一的,因为只有这样才能使得位于外部编址域的主机能利用域名系统(DNS)访问内部网络的主机。在双向NAT上必须部署DNS-ALG(DNS-Application Level Gateway,参阅RFC2694),以处理名字到地址的映射。当一个DNS包需要穿越内部和外部编址域时,DNS-ALG必须能够将DNS查询和响应消息中的内部地址翻译成外部地址,或把外部地址翻译成内部地址。
1.2.3、两次NAT
两次NAT(Twice NAT)是NAT的一个变种,它同时修改源和目的IP地址。这与传统NAT和双向NAT不同(二者仅翻译源或目的地址/端口)。当位于同一NAT之后的两台内网主机之间以各自的公网地址进行连接时,这时NAT要做两次转换,先将包中来源主机的内网地址转换为公网地址,再将包中目的主机的公网地址转换为内网地址,最后将包转发给目的主机,上述的NAT转换过程也称之为回环转换(Loopback Translation)。
两次NAT在内部编址域和外部编址域存在冲突时非常有用。典型例子之一是当一个站点(不恰当地)使用已分配给其它机构的公有IP地址对其内网主机进行编址时;例子之二是当一个站点从一家运营商换到另一家运营商,同时希望在内部保留前一家运营商分配的地址时(而前一家运营商可能在一段时间后将这些地址重新分配给其它人使用)。在这些情况下,非常关键的一点就是外部网络的主机可能会分配得到以前已经分配给内网主机的同一地址。如果该地址碰巧出现在某个数据包中,则应该将它转发给内网主机,而不是通过NAT转发给外部编址域。两次NAT通过同时翻译IP包的源和目的地址,试图桥接这些编址域,解决了地址冲突的问题。
1.2.4、多宿主NAT
使用NAT会带来很多问题(RFC2993)。如,NAT设备要为经过它的会话维护状态信息,而一个会话的请求和响应必须通过同一NAT设备做路由,因此通常要求支持NAT的域边界路由器必须是唯一的,所有的IP包发起自或终结在该域。但这种配置将NAT设备变成了可能的单点故障点。
为了让一个内部网络能够在某个NAT链路出故障的情况下也可以保持与外部网络的连通性,通常希望内部到相同或不同的ISP具有多条连接(多宿主的,Multihomed NAT),希望经过相同或不同的NAT设备。共享相同的NAT配置能够为多个NAT相互之间提供故障备份。在这种情况下,有必要让备份NAT设备交换状态信息,以便当主NAT出现故障时,备份NAT能够担负起透明地保持会话的能力。
1.3、工作机理
目前市场上使用最多的是传统NAT设备,尤其是NAPT设备,基本NAT可以看成NAPT的特例,下面以NAPT为例子论述NAT的工作机理。NAPT的映射方式主要有以下几种典型类型(RFC34)[2],如图1.3。
1.3.1、Full Cone NAT
这种NAT的特点是由内网同一地址及端口发出的数据包,不论目的地是的哪个主机,在NAT设备的出口均映射到相同的地址和端口;而的任何主机发送到此地址和端口的数据包,也都会被转发到内网相同的地址和端口,具体过程如图1.4所示。
内网主机向主机A发送数据包,数据包的源地址(192.168.12.2:1111)被NAT改为地址(202.117.15.5:2222)并转发到主机A,此后不仅主机A,其它主机(B)发往地址(202.117.15.5:2222)的数据包也都可以被转发给内网主机(192.168.12.2:1111)。
1.3.2、Restricted Cone NAT
此NAT与Full Cone NAT相似,唯一的区别是只有收到内网主机发出的数据包的主机才可以返回数据包到此内网主机。如图1.5,NAT仅将主机A发往NAT入口点(202.117.15.5:2222)的数据包转发给内网主机,而将主机B的数据包丢弃。
1.3.3、Port Restricted Cone NAT
此NAT比Restricted Cone NAT更为严格,只有收到内网主机发出的数据包的主机端口才可以返回数据包到此内网主机。如图1.6,NAT仅将主机A(端口为3333)发往NAT入口点(202.117.15.5:2222)的数据包转发给内网主机,而将主机A的其它端口(非3333)和主机B的数据包丢弃。
1.3.4、Symmetric NAT
Cone类型的NAT映射与目的地址无关,即内网中同一主机IP地址和端口发出的数据包均会被NAT设备映射到相同的地址和端口,而Symmetric NAT(对称NAT)发往不同目的主机或端口的数据包会被映射到不同的地址和端口。图1.7说明了这种情况,发往主机A和主机B的数据包被映射到不同的地址和端口,主机A返回给内网主机的数据包不能由关联主机B的NAT入口进入,同样,主机B的数据包不能由关联主机A的NAT入口进入。
1.3.5、抽象原理
从上述分析可以抽象出NAT的一般原理,NAT的工作基础在于建立内网主机地址(端口)和主机地址(端口)映射表,数据包的转发均依赖于此映射表,映射表的一行是9元组:{协议,持续时间,描述,内网主机IP,内网主机Port,NATIP,NATPort,主机IP,主机Port},其中协议指TCP、UDP等,持续时间指映射存活时间,描述是对映射的文字解释,而后6项是此9元组的核心,它们决定了NAT的类型,在后面的论述中主要参考6元组:{内网主机IP,内网主机Port,NATIP,NATPort,主机IP,主机Port},如表1.1。NAT的穿越实际上就围绕9元组的构造、内容展开。
表1.1 6元组与传统NAT类型的关系
NAT类型 | 数据方向 | 内网主机IP | 内网主机Port | NATIP | NATPort | 主机IP | 主机Port |
基本NAT | 自内向外 | √ | * | √ | * | * | * |
自外向内 | √ | * | √ | * | * | * | |
Full Cone NAT | 自内向外 | √ | √ | √ | √ | * | * |
自外向内 | √ | √ | √ | √ | * | * | |
Restricted Cone NAT | 自内向外 | √ | √ | √ | √ | * | * |
自外向内 | √ | √ | √ | √ | √ | * | |
Port Restricted Cone NAT | 自内向外 | √ | √ | √ | √ | * | * |
自外向内 | √ | √ | √ | √ | √ | √ | |
Symmetric NAT | 自内向外 | √ | √ | √ | √ | √ | √ |
自外向内 | √ | √ | √ | √ | √ | √ |
√:进行地址(端口)转换时需要核对的项目
*:进行地址(端口)转换时不需要核对的项目
1.4、应用
●解决IP地址紧缺的问题,将私有地址翻译成公有地址,提供透明的端到端通信,这是最主要的应用之一;
●隔离内络,提供一定的网络安全保障;
●虚拟服务器(负载平衡),虚拟服务器设备可由NAT实现,客户连接到虚拟服务器上,NAT 设备把目的IP 地址转换为实际的服务器IP地址。NAT设备根据各种算法来选择某一个真实的服务器,如根据每个服务器的负载来分配选择,从而实现负载平衡,如应用到HTTP服务器群;
●单目的多路由器。