如今,随着全球的IPv4地址已经分配完毕,再也没有新的空闲的IPv4地址可以分配了,这更加让IPv4地址的使用成为一种奢侈。NAT(Network Address Translation,网络地址转换)在IPv4地址严重不足的情况下提出缓解办法,是将IP数据报文头中的IP地址转换为另一个IP地址的过程。在实际应用中,NAT使一个局域网中的主机使用少量合法的IPv4地址就可以访问外部资源。这种通过使用少量的公网IP地址代表较多的私网IP地址的方式,将有助于减缓可用IP地址空间的枯竭。
不过,NAT不能永久的解决当今IP地址短缺的问题,因此IPv6的应用越来越显得重要。IPv6的应用是个循序渐进的过程,在很长时间内,IPv4网络和IPv6网络会同时存在且需要相互通信。基于这种情况,就需要一种技术,解决IPv4和IPv6网络的互通问题,所以NAT-PT技术应运而生。
NAT-PT(Network Address Translation-Protocol Translation,附带协议转换的网络地址转换)技术秉承NAT技术(RFC2663)的思想,但在原理方面大有不同,可以这样简单的理解,NAT技术是IPv4私网地址与公网地址之间的转换,它是为了解决IPv4公网地址缺乏问题;NAT-PT技术则是IPv6协议与IPv4协议之间的转换,在RFC 2765与RFC 2766中给出了其定义它是为了解决两者的互通问题。在IPv4网络完全过渡到IPv6网络之前,两种类型网络之间直接的通信可以通过NAT-PT来实现。
图1 NAT-PT示意图
如图1所示,NAT-PT作用于IPv4和IPv6网络边缘设备上,所有的地址转换过程都在该设备上实现,对IPv4和IPv6网络来说是透明的,即用户不必改变目前的IPv4网络中主机的配置就可实现IPv6网络与IPv4网络的通信。
NAT-PT和NAT本质的区别在于应用场合的不同。NAT是IPv4网络中公网、私网地址的相互转换,而NAT-PT则是IPv6和IPv4地址的相互转换,加入了IPv6和IPv4间协议的转换内容。比如对于ICMP报文的处理上,所有的ICMPv4报文向ICMPv6报文转换的时候都必须要重新计算校验和,因为ICMPv6像TCP和UDP一样有一个伪报头的检验和。另外所有Type字段都需要进行更新,如果是ICMP差错报文的话,那么差错信息中的IP头也同时需要转换。这些报文头转换的同时很可能引起报文长度的变化,因此IPv6报文最外层净载荷长度字段必须被更新。同样,ICMPv6向ICMPv4进行转换也是类似的流程。
NAT-PT和隧道都是IPv4向IPv6过渡的技术,但是它们之间的实现和适用范围都是有很大的不同的。
首先报文转换和转发的方式不同,这个是NAT-PT和隧道最根本的差别。NAT-PT是对报文的网络层内容进行转换修改,剥离原先的报文头,替换为转换之后的报文头(IPv4àIPv6或者IPv6àIPv4);而隧道是对初始报文作另一层报文封装,根据隧道的不同类型加上相应的报文头。
正是由于转换的方式不同,导致他们检查报文的方式也不同。NAT-PT会检查并且可以更改报文中的端口号;而隧道从来不会检查报文的传输层内容。
转换方式的不同同样致使了他们的使用范围不一样,NAT-PT一般适用于IPv4与IPv6不同网络中主机互相访问的环境中;而隧道一般用于实现一种网络协议跨越另一种网络协议之间的通讯。所以,形成NAT-PT的环境只需要有一台可以进行NAT-PT转换的设备即可;而构造一种隧道的环境就必须要两台设备形成一个隧道。
不论采用哪种NAT-PT机制,配置NAT-PT前缀都是必须的。NAT-PT前缀是长度为96位的IPv6地址前缀,它具有以下两个作用:
(1) 从IPv6网络发送到IPv4网络的报文到达NAT-PT设备后,设备会检测报文目的IPv6地址的前缀,只有与所配置的NAT-PT前缀相同的报文才允许进行IPv6到IPv4的转换。
(2) 从IPv4网络发送到IPv6网络的报文,经过NAT-PT转换后,源IPv6地址的前缀为配置的NAT-PT前缀。
类似于NAT,NAT-PT有几种机制可实现IPv4和IPv6地址之间的相互转换:
(一) 基本NAT-PT机制及原理
在基本NAT-PT机制的工作过程中,当IPv6主机向处于外部公网的IPv4主机发起连接请求时,一组IPv4的地址应该被提前设置好以用来作地址转换使用。从IPv6网络向外传输的IPv6数据包,其源IPv6地址及相关的字段如IP、TCP、UDP和ICMP的头部校验和都将被转换。同理,对于向IPv6网络传输的数据包,也要作类似的转换。采用手工配置或地址池映射,IPv6地址与IPv4地址通过一一对应关系来实现IPv6地址与IPv4地址的转换,可以是静态也可以是动态,提供一对一的IPv6地址和IPv4地址的映射。
图2 基本NAT-PT原理示意图
如图2所示,NAT-PT设备上配置了一个IPv4的地址池用来做地址转换,地址池中的地址为120.130.26.0/24。地址转换时采用的是静态地址转换,每个IPv6的地址对应一个地址池中IPv4的地址。如果地址池中的地址个数比IPv6网络中的节点数要少,那么NAT-PT地址转换中的动态分配是必须的,否则因为IPv4地址枯竭无法进行地址转换,从而不能建立连接。
假设IPv6网络中的节点A要与IPv4网络中的节点C建立连接进行通讯,节点A创建的数据包信息是:
源地址:SA=FEDC:BA98::7654:3210
目的地址:DA = PREFIX::132.146.243.30
注:前缀PREFIX::/96是由管理员选定的任何可以进行路由的前缀,已经被NAT-PT在IPv6网络中进行了通报,因此以此为前缀的数据包都被路由到NAT-PT设备进行处理。
该数据包到达NAT-PT后,其报文信息将被转换为IPv4版本。如果该数据包不是用来初始化连接的,那么NAT-PT一定保存着该数据包所从属的连接的状态信息,包括IPv6节点A被分配的IPv4地址及其它用于转换的信息。如果该数据包所从属连接的状态信息不存在,或者根本没有这个连接,那么该数据包将被丢弃。如果该数据包是用来初始化连接的,那么NAT-PT将从地址池中分配一个IPv4地址(比如120.130.26.10),并将其报文信息转换为IPv4版本。其传输在整个连接过程中会被存储于内存中,IPv6与IPv4之间的地址映射也将一直被维持着直到连接的结束。
转换后的IPv4报文信息如下:
源地址:SA=120.130.26.10
目的地址:DA=132.146.243.30
所有与此连接相关的从节点C返回的IPv4数据包,NAT-PT会根据所存储的连接信息进行信息转换如下:
源地址:SA=PREFIX::132.146.243.30
目的地址:DA=FEDC:BA98::7654:3210
然后,数据包就可以在IPv6网络中进行路由传输了。
(二) NAPT-PT机制及原理
NAPT-PT(Network Address Port Translation - Protocol Translation)把转换的概念做了进一步的扩展,对于传输标识(TCP、UDP的端口号,ICMP标识字段)也进行了转换。不同的IPv6地址转换时,可以对应同一个IPv4地址,通过不同的端口号来区分不同的IPv6主机,从而节省IPv4地址资源。这种机制提供一个IPv4地址和多个使用NAT-PT前缀格式的IPv6地址之间的一对多的动态映射(只有ICMP、TCP和UDP报文可以使用这种方式转换)。
NAPT-PT机制使得多个IPv6节点在与外网IPv4节点进行通讯时可以共用IPv4转换地址。在转换的过程中,IPv6节点的TCP/UDP端口号被转换成已经登记的IPv4的TCP/UDP端口号。传统NAT-PT只局限于TCP、UDP及使用了端口复用的其他应用程序(属于静态地址捆绑),而NAPT-PT解决了传统NAT-PT中存在的问题。例如,当地址池中的地址被耗尽后,NAT-PT将不再起作用,这时,IPv6节点将不能与外部的IPv4节点建立连接。然而,在应用了NAPT-PT后,一个IPv4的转换地址就可以建立63K的TCP和63k的UDP连接。通过修改图2,我们可以使用NAPT-PT进行地址转换,在转换的过程中我们只使用一个IPv4转换地址。
IPv6节点A要与IPv4节点C建立一个TCP连接,创建了如下的数据包地址信息。
源地址:SA=FEDC:BA98::7654:3210,源TCP端口:port= 3017
目的地址:DA = PREFIX::132.146.243.30,目的TCP端口:port = 23
当该数据包到达NAPT-PT后,将分配一个已经被应用到其他连接的IPv4地址用来建立连接,但是其TCP端口号是不同的。于是,上面的数据包地址信息被转换成:
源地址:SA=120.130.26.10,源TCP端口 port = 1025
目的地址:DA=132.146.243.30,目的TCP端口 port = 23
当数据从132.146.243.30返回时,根据五元组匹配,数据包被认为是从属于该会话连接,其信息将被转换回IPv6版本如下:
源地址:SA = PREFIX::132.146.243.30,源TCP端口 port = 23;
目的地址:DA = FEDC:BA98::7654:3210,目的TCP端口 port = 3017
对于从IPv4网络传向IPv6的连接,每一项服务,NAPT-PT只有一个server存在,server的标识是通过TCP/UDP端口号来实现的。例如,IPv6网络中的节点A可能被设置为网络中较少的HTTP server(端口号是80)。如果节点C发出如下的数据包信息:
源地址:SA=132.146.243.30,源TCP端口 port = 1025
目的地址:DA=120.130.26.10,目的TCP端口 port = 80
那么该数据包将在NAT-PT被转换为:
源地址:SA=PREFIX::132.146.243.30,源TCP端口 port = 1025
目的地址:DA=FEDC:BA98::7654:3210,目的TCP端口 port = 80
可以看出目的地址是节点A的IPv6地址。象上面的例子,如果传向NAPT-PT的数据包其目的端口号都是80,那么这些数据包将都被发送给同一个节点,那就是IPv6网络中的节点A。
(三) 双向NAT-PT
在双向NAT-PT工作过程中,连接的建立既可以从IPv6侧发起,也可以从IPv4侧发起(而传统的NAT-PT只能从IPv6侧发起)。不管是从IPv6侧还是从IPv4侧发起的连接,也不管其地址的转换机制是静态的还是动态的,经过NAT-PT后,IPv6的地址都要被转换成IPv4地址。 DNS-ALG在双向NAT-PT必须被应用以实现名字向IP地址的转换。IPv6和IPv4两端的DNS,其命名空间是独立且较少的。特别需要说明的是,当DNS数据包在IPv6和IPv4网络之间传输时,DNS-ALG能够把从IPv6网络中查询到的IPv6地址与地址池中的IPv4地址绑定起来。同样,对于从IPv4网络中查询到的IPv4地址(例如从IPv6端发起对IPv4网络中主机的连接),DNS-ALG同样能够进行类似绑定。
当建立IPv6网络与IPv4网络的连接时,无论是从哪端发起的连接,NAT-PT都将分配一个IPv4转换地址给一个IPv6节点。但是,当初始化一个连接时,从IPv4侧发起连接与从IPv6侧发起连接,其工作原理是不一样的,下面分别进行介绍
(1) 双向NAT-PT:从IPv4到IPv6
图3 双向NAT-PT原理示意图
如图3所示,当节点C的Name Resolver发出节点A的地址查询请求后,该请求将被传递到IPv6网络中的DNS服务器。因为NAT-PT被配置在IPv6与IPv4网络的交界处,因此查询数据包将会NAT-PT中来回穿梭。在NAT-PT上的DNS-ALG将会对欲进入IPv6网络进行“A”记录查询的请求进行如下修改(NAT-PT根据源或目的端口号是否是53来判断一个数据包是否是DNS数据包):
a)对于从节点名字到节点地址的查询请求:把查询类型从“A”改成“AAAA”或“A6”
b)对于从节点地址到节点名字的查询请求:把字符串“IN-ADDR.ARPA”改成“IP6.INT”,把“IN-ADDR.ARPA”前的IPv4地址改成相应的IPv6地址。
反之,当DNS的查询应答欲从IPv6网络进入IPv4网络时,DNS-ALG进行如下操作:
a)更改“AAAA”或“A6”为“A”
b)把查询到的IPv6地址用NAT-PT分配的IPv4转换地址进行替换。
如果没有提前分配一个IPv4的转换地址给这个IPv6节点,那么现在NAT-PT将分配一个给它。比如上面的例子,节点C要发起与节点A的连接,产生一个A节点名的查询。这个节点被送到本地的DNS,DNS-ALG截获该报文,并把“A”查询更改为“AAAA”查询或“A6”查询,然后把它发送给IPv6网络的DNS服务器。DNS服务器将做出如下应答:
Node-A AAAA FEDC:BA98::7654:3210
该应答仍然会被DNS-ALG捕获,并转换成如下IPv4形式:
Node-A A 120.130.26.1
在NAT-PT上,DNS-ALG将会维持FEDC:BA98::7654:3210和120.130.26.1的映射关系。现在这条“A”记录就可以返回给节点C了,从而节点C将发起如下的连接信息:
源地址:SA=132.146.243.30,源TCP端口 port = 1025
目的地址:DA=120.130.26.1,目的TCP端口 port = 80
带有此信息的数据包将被路由到NAT-PT,因为它维护着FEDC:BA98::7654:3210和120.130.26.1的映射关系,因此上述信息将被转换成:
源地址:SA=PREFIX::132.146.243.30,源TCP端口 port = 1025
目的地址:DA=FEDC:BA98::7654:3210,目的TCP端口 port = 80
连接由此建立了起来,通讯就可以进行了。
对于上面所描述的从IPv4到IPv6的连接建立过程,可能会导致服务攻击拒绝(denial of service attack)。因为一个节点可以发起多个查询,导致NAT-PT把IPv4的地址资源耗尽,从而阻止了后面的服务。因此对于此种连接的建立(从IPv4向IPv6发起的连接)应该有一个超时时间以降低服务拒绝的可能性。在从IPv6到IPv4的连接建立过程中,可以提前保存一个IPv4的地址(采取NAPT-PT)来减少在建立过程中服务拒绝的可能性。
(2) 双向NAT-PT:从IPv6到IPv4
IPv6节点通过IPv4网络中的或者是IPv6网络中的DNS服务器来获取IPv4节点的IP地址。建议IPv6网络上的DNS服务器能够维持IPv6节点名字与地址的映射关系,并能够缓存IPv6地址与外部IPv4地址的对应关系。如果IPv6网络中的DNS服务器包含与外部IPv4网络节点的地址映射,那么DNS查询就不会穿过IPv6网络,也不需要DNS-ALG的干预。否则,查询就要穿过IPv6网络,并需要DNS-ALG的协同工作。建议IPv4网络中的DNS Server只映射IPv4 节点与IPv4地址之间的映射关系,不推荐在其上进行跨IPv4网络和IPv6网络的转换。
对于从IPv6到IPv4的连接,在NAPT-PT模式下,一旦新的连接要建立,TCP/IP的源端口号将从已登记的IPv4地址进行分配。另外,在连接建立过程中,地址前缀(PREFIX ::/96)的使用,不会影响IPv4节点上的任何配置。
现在仍然以图3为例,假设节点A要与节点C建立一个连接,因此节点A要发起对节点C的名字查询(“AAAA”或“A6”)。因为节点C可能有IPv6地址,也可能有IPv4地址,NAT-PT上的DNS-ALG就把这个原始的AAAA/A6查询直接转发给外部的DNS系统,同时还发送了一个A查询。如果目的节点(节点C)的AAAA/A6记录存在,那么,信息将会被传回到NAT-PT,然后NAT-PT会直接把信息再传回到节点A。相反,如果节点C的A记录存在,那么,记录信息也会被传给NAT-PT,DNS-ALG就会添加上合适的前缀并把信息转发给发起查询的设备,即节点A。所以,如果A记录如下
节点C A 132.146.243.30,
那么就会被转换成
节点C AAAA PREFIX::132.146.243.30 或者
节点C A6 PREFIX::132.146.243.30
现在节点A就可以使用这个地址建立连接,就像它与其他IPv6的节点进行通讯一样。
有一个问题值得注意:那就是IPv6网络中的DNS服务器是如何与IPv4网络进行对话的,或者反过来,IPv4网络中的DNS服务器如何与IPv6网络进行对话,要知道在这儿没有双栈的节点。具体的实现是这样的,IPv6网络中的DNS服务器有一个映射的IPv4地址,该地址可能是NAT-PT地址池中的一个,对NAT-PT来说是可知的。NAT-PT维持着该IPv4地址与IPv6网络中的DNS服务器之间的一一映射关系。而另一个方向,IPv4网络中的DNS服务器有一个映射的IPv6地址,该IPv6地址由外部的IPv4 DNS服务器与前缀(PREFIX ::/96)构成。NAT-PT同样维持着该IPv6地址与IPv4网络中的DNS服务器之间的一一映射关系。通过这样的映射,实现了不同类型网络中DNS服务器与主机的互通。
SIIT(Stateless IP/ICMP Translation Algorithm)是NAT-PT的基础,指无状态IP/ICMP转换算法,在RFC2765中有详细描述,它解决了IPv6与IPv4节点之间进行通讯的问题。IPv6节点通过获取一个暂时的IPv4地址,为自己配置一个IPv4翻译地址,而作为IPv4网络侧的IPv4节点通过IPv4映射地址与IPv6节点之间进行通讯。在通讯的过程中,转换器将对报文头进行转换,使得报文在IPv6网络和IPv4网络中都能够被顺利的路由并建立和维持通讯。
当转换器收到从IPv4网络到IPv6网络的报文时候,就要把IPv4的报文头转换为IPv6的报文头,原先的IPv4报文头就被移走,用新的IPv6的报文头代替。除了ICMP包以外,传输协议报头和数据部分都保留不变。
图4 IPv4向IPv6报文转换
另外,由于IPv6协议和IPv4协议在处理报文分片方式上的不同,导致在处理分片报文时需要特别注意。对于IPv6来说,只有发送端可以对报文进行分段,而中间路由器不能进行分段。因此对于IPv6,path MTU discovery就是必须的了,而对于IPv4来说,中间路由器可以进行分段,所以path MTU discovery也就是可以选择的了。所以,如果IPv4的报文头中DF位没有设置,那么为了保证转换后的IPv6报文不会超过MTU,则需要数据净荷长度不能超过1232字节(最小MTU1280字节-40字节IPv6报头-8字节分段报头),如果DF位被设置了,同时报文不是一个分段报文的话,则转换后的IPv6报文不需要包含分片报头,此时IPv6报文头各个字段设置如下:
表1 IPv4向IPv6报头转换字段列表(无分片)
IPv6字段 | 设置 |
Version(版本) | 6 |
Traffic Class(业务流类别) | 直接从IPv4报头的Type Of Service and Precedence域中所有8字节copy过来 |
Flow Label(流标签) | 0 |
Payload Length(净荷长度) | IPv4报头中Total length值减去IPv4报头的长度和IPv4选项的大小 |
Next Header(下一报头) | 从IPv4报头中的Protocol域中copy过来 |
Hop Limit(跳极限) | 从IPv4报头中的TTL域中copy过来 |
Source Address(源IP地址) | 低32位是IPv4的源地址,高96位是IPv4-mapped前缀(::ffff:0:0/96) |
Destination Address(目的IP地址) | 低32位是IPv4的目的地址,高96位是IPv4-translated前缀(0::ffff:0:0:0/96) |
如果转换后的IPv6报文需要添加分片报文头(原始IPv4报文DF位没有被设置,或者本身就是一个分片),那么报文需要做如下修改:
表2 IPv4向IPv6报头转换列表(有分片)
IPv6字段 | 设置 |
Payload Length(载荷长度) | 在原来的IPv4基础上加上分段头长度8(IPv4报头中length域的值减去IPv4报头和选项的大小,再加上8字节的分段报头长度) |
Next Header(下一报头) | 分片头(44) |
分片报头字段 |
|
Next Header(下一报头) | 从IPv4报头的Protocol域中copy过来 |
Fragment Offset(分片偏移量) | 从IPv4的Fragment Offset中copy过来 |
M flag(M标记位) | 从IPv4报头的More Fragments域中copy过来 |
Identification(分片标识) | 低16位从IPv4报头的Identification域中copy过来,高16位为0 |
所有的ICMPv4报文向IPv6报文的转换都要重新计算其校验和,因为ICMPv6报文和UDP/TCP一样有一个伪报头的校验和。另外所有类型(Type)字段都需要更新。如果是ICMP错误报文,那么错误信息中的IP头也需要转换。最后,前面的调整也可能对报文长度产生影响,因此还需要对相应的域进行修改。
表3 ICMPv4向ICMPv6查询报文转换列表
| IPv4中Type值 | 转换处理 |
Echo and Echo Reply (请求回显和回显应答) | Type 8 and 0 | type to 128 and 129 |
Information Request/Reply (信息请求和信息应答) | Type 15 and 16 | Silently drop |
Timestamp and Timestamp Reply (时间戳请求和时间戳应答) | Type 13 and 14 | Silently drop |
Address Mask Request/Reply (地址掩码请求和应答) | Type 17 and 18 | Silently drop |
ICMP Router Advertisement (路由器通告) | Type 9 | Silently drop |
ICMP Router Solicitation (路由器请求) | Type 10 | Silently drop |
Unknown ICMPv4 types |
| Silently drop |
对于ICMPv4差错报文的转换(下表没有明确标出Type的,转换后Type值为1):
表4 ICMPv4向ICMPv6差错报文转换列表
Destination Unreachable (Type 3) 目的不可达 | Code值 | 转换处理或者对应ICMPv6中code值 |
net, host unreachable (网络、主机不可达) | Code 0, 1 | 0 (没有可达路由) |
protocol unreachable (协议不可达) | Code 2 | ICMPv6参数问题 (Type 4, Code 1) ,指针指向IPv6的下一个扩展头字段 |
port unreachable (端口不可达) | Code 3 | 4 (端口不可达) |
fragmentation needed and DF set (需要分片但DF为置位) | Code 4 | ICMPv6包过大(Type 2,code 0),如果包中的MTU域没有填充,则转换器需要自己去确定一个可能的path MTU来填充此域。 |
source route failed (源站选路失败) | Code 5 | 0 (没有可达路由) |
| Code 6,7,8 | 0 (没有可达路由) |
communication with destination host administratively prohibited (目的网络、主机被强制禁止) | Code 9, 10 | 1 (与非法主机通讯) |
| Code 11,12 | 0 (没有可达路由) |
Redirect (重定向) | Type 5 | Silently drop |
Source Quench (源端被关闭) | Type 4 | Silently drop |
Time Exceeded (超时) | Type 11 | Type 3,code部分不变 |
Parameter Problem (参数问题) | Type 12 | Type 4,相应域需要进行改变 |
当一个转换器收到一个IPv4映射地址的报文时,那么该IPv6报文将被转换成IPv4报文,然后基于该IPv4目的地址进行转发,从而将IPv6报文头转换成IPv4报文头。除了ICMP报文,其他的传输层报文头和数据部分不会发生任何变化。
图5 IPv6向IPv4报文转换
如果没有IPv6分片头,那么转换后的IPv4报文头的字段设置如下表
表5 IPv6向IPv4报头转换字段列表(无分片)
IPv4字段 | 设置 |
Version(版本) | 4 |
Internet Header Length(首部长度) | 5 (no IPv4 options) |
Type of Service and Precedence(服务类型) | 从IPv6的Traffic Class域中copy过来 |
Total Length(总长度) | IPv6报头中Payload length域的值加上IPv4报头大小 |
Identification(标识) | 0 |
Flags(标识位) | MF域置为0,DF域置为1 |
Fragment Offset(分片偏移) | 0 |
Time to Live(生存时间) | 从IPv6的Hop Limit域中copy过来 |
Protocol(协议) | 从IPv6中的Next Header域中copy过来 |
Header Checksum(首部检验和) | IPv4报头创建好重新计算 |
Source Address(源地址) | 如果IPv6源地址是IPv4-translated地址,则IPv6地址的低32位copy到IPv4源地址域。其他的情况源地址都设为0.0.0.0 |
Destination Address(目的地址) | IPv4-mapped地址的低32位 |
如果IPv6报文中含有分片头,那么除了下面的特殊字段变化不同以外,其他的仍然根据上面的叙述进行转换
表6 IPv4向IPv6报头转换字段列表(有分片)
IPv4字段 | 设置 |
Total Length | IPv6报头中的Payload length域的值加上IPv4报头的大小,减去8(Fragment header的大小) |
Identification | Copy IPv6中的分片头中的Identification域的低16位 |
Flags | MF值引用分片头中的M标志,DF设置成0,标识运行IPv4路由器进行分片。 |
Fragment Offset | 从分片头中的分片位移域copy过来 |
Protocol | 从分片头中Next Header域中copy过来 |
因为ICMPv6同TCP、UDP一样具有伪包头校验和,因此所有需要转换的ICMPv6的报文,其校验和字段必须被更新。另外ICMP的类型字段及包含IP报文头的ICMPv6错误报文的内容也需要同步更新。
表7 ICMPv6向ICMPv4查询报文转换列表
| IPv6中Type值 | 转换处理 |
Echo Request and Echo Reply (请求回显和回显应答) | 128 和 129 | type to 0 and 8 |
MLD Multicast Listener Query/Report/Done (MLD 多播侦听查询/汇报/完成) | Type 130, 131, 132 | Silently drop |
Neighbor Discover messages (邻居发现信息) | Type 133 through 137 | Silently drop |
Unknown informational messages (未知信息类型) |
| Silently drop |
差错报文目的不可达的Type值为1,转换后Type为3,转换code域方法如下:
表8 ICMPv6向ICMPv4差错报文转换列表
| Code值 | 转换处理或IPv4中对应的Code值 |
no route to destination (没有到达的路由) | Code 0 | Code 1 (host unreachable) (主机不可达) |
communication with destination administratively prohibited (与管理拒绝的目的主机的通讯) | Code 1 | Code 10 |
beyond scope of source address (超出源地址范围) | Code 2 | Code 1 (host unreachable) |
address unreachable(地址不可达) | Code 3 | Code 1 (host unreachable) |
port unreachable(端口不可达) | Code 4 | Code 3 (port unreachable) |
表9 ICMPv6向ICMPv4其他报文转换列表
| Type值 | 转换处理或对应IPv4中Type值 |
Packet Too Big (包过大) | Type 2 | 转换为ICMPv4中目的不可达(code 4),MTU域需要对报文是否有分段而进行更新。 |
Time Exceeded(超时) | Type 3 | Type为11,Code不变。 |
Code field is unchanged (Code问题) | Type 4 | 如果Code值是1转换为协议不可达 (Type 3, Code 2);其他情况Type为12,code为0。指针需要针对相应的域进行转换包括IP头。 |
Unknown error messages (未知错误报文) |
| Silently drop |
为了使IPv6与IPv4网络之间的端对端交流成为可能,NAT-PT需要把IPv6和IPv4的报文头进行转换。由于地址转换功能和端口复用的使用,NAT-PT还要对上层协议报文头做相应的调整。协议转换的详细介绍在SIIT中,但是因为NAT-PT也进行了地址转换,因此在NAT-PT上还有一些补充的修改。
在NAT-PT的具体应用中,除了下面的字段说明之外,其他字段的转换的过程和RFC2765(SIIT)中所描述几乎是一样的。
表10 NAT-PT中IPv4向IPv6报头转换
IPv6字段 | 设置 |
源地址 | 低32位是IPv4的32 位源地址,高96位是被指定的前缀(PREFIX ::/96)。符合此类地址格式的的数据包将被路由到NAT-PT网关 |
目的地址 | NAT-PT保持着IPv4目的地址和IPv6目的地址之间的映射关系,根据这种映射关系IPv4目的地址被IPv6地址所替代 |
在NAT-PT的具体应用中,除了下面所描述的源地址说明之外,其他的转换方式和RFC2765(SIIT)中所描述的一样。
表11 NAT-PT中IPv6向IPv4报头转换
IPv4字段 | 设置 |
源地址 | NAT-PT保持着地址池中的IPv4地址与IPv6源地址之间的映射关系,根据这种映射,IPv6源地址将被IPv4地址所替代 |
目的地址 | 被转换的IPv6数据包的目的地址将遵循如下格式:PREFIX ::IPv4/96,因此IPv6目的地址的低32位将被直接复制为IPv4的目的地址 |
UDP的校验和(当非零时)和TCP的校验和应该被重新计算,从而反映从IPv4到IPv6的地址变化。校验和的计算法则可以借鉴RFC1631(NAT)。在NAPT-PT的转换模式下,TCP/UDP校验和的变化除了包括地址的变化外,还有包括TCP/UDP端口号的变化。
如果发送到NAT-PT的IPv4 UDP数据包的校验和为0,NAT-PT在把它转换成IPv6数据包后要重新对该UDP报文做校验和计算。如果校验和为0的UDP报文是是以分片的形式发送过来的,那么NAT-PT需要做的是等待所有的报文到达,重新聚合成一个完整的报文后,进行IPv6的转换,然后进行校验和计算,最后再转发出去。
IPv6中的ICMP报文不同于IPv4中的ICMP报文,它采用了伪包头,对于校验和的计算类似于UDP和TCP的计算过程(此部分可参考RFC2460的8.1节)。需要注意的是,由于ICMP报文的载荷中也可能携带有地址信息,该部分同样要做地址转换,转换后才能够进行校验和的计算。
同从IPv4到IPv6的TCP/UDP/ICMP校验和一样,它的变化反映了从IPv6到IPv4的地址变化,计算法则也是一样的。在NAPT-PT的转换模式下,此变化还包括端口号的改变。对于UDP报文,因为其校验和是可选项,所以在进行转换后,校验和可以被简单的设置成0。而ICMP报文的校验和必须要重新计算,因为IPv4中无ICMP伪报头的概念(同样需要注意ICMP载荷中携带地址信息的情况)。
在RFC2663中描述的关于NAT的局限性同时也就是NAT-PT的局限性,下面所列举的是局限性中其中比较重要的,也有些是NAT-PT所独有的局限性。
使用NAT-PT是受局限的,所有与某进程有关的请求与应答都必须要经过同一NAT-PT路由器。实现这一点的一个方法就是把NAT-PT置于边界路由器上,该路由器对于一个局域网络来说是较少的,这样所有的IP数据包或者是从该网络发起的,或者是以该网络为目的的。对于NAT来说,这同样是个问题,并在RFC2663中进行了描述。
一些IPv4的数据报字段在IPv6中发生了改变,因此NAT-PT的转换是不很准确的。例如IPv4中的选项段在IPv6中语义上有很大的改变,就不能很好的进行转换。
因为NAT-PT需要对地址进行转换,那么当某个上层的应用程序,在其应用中包含了地址信息(或端口信息),如果NAT-PT不进行特殊处理,就会引起使用问题。在这种情况下,应用层网关(ALG:Application Layer Gateway)就需要为这类应用提供协调服务。这对于IPv4的NAT来说也是普遍的问题。
NAT-PT最大的局限性之一就是在端对端网络层上缺少安全性。另外,对于传输层及应用中携带IP地址的应用层也没有安全性可言。这是NAT的一个遗传问题。且不说NAT-PT,对于跨两个不同IP地址的网络来说,IPsec是不可能实现的。两个端点之间要实现网络层上的IPsec功能,必须都是IPv4节点或者都是IPv6节点。
前面给出了DNS信息转换的机制,但是很明显这种机制不能和安全DNS同时使用。例如,IPv6网络中的授权DNS服务器收到来自IPv4网络的查询时,它无法对回复进行签名,从而导致域名解析失败。