• 文章搜索:
  • 目录

        • 分享到...

        • 新浪微博
        • 腾讯微博
        • 推荐到豆瓣 豆瓣空间
        • 分享到搜狐微博 搜狐微博
        • 分享到QQ空间 QQ空间
        • 分享到腾讯朋友 腾讯朋友
        • 网易微博分享 网易微博
        • 添加到百度搜藏 百度搜藏
        • 转贴到开心网 开心网
        • 转发好友 告诉聊友
    • 推荐
    • 打印
    • 收藏

    NAT-PT介绍

    作者:  |  上传时间:2012-06-01  |  关键字:网络大爬虫5-NAT专题

    1      前言

    1.1    NAT-PTNAT的差别

    如今,随着全球的IPv4地址已经分配完毕,再也没有新的空闲的IPv4地址可以分配了,这更加让IPv4地址的使用成为一种奢侈。NATNetwork Address Translation,网络地址转换)在IPv4地址严重不足的情况下提出缓解办法,是将IP数据报文头中的IP地址转换为另一个IP地址的过程。在实际应用中,NAT使一个局域网中的主机使用少量合法的IPv4地址就可以访问外部资源。这种通过使用少量的公网IP地址代表较多的私网IP地址的方式,将有助于减缓可用IP地址空间的枯竭。

    不过,NAT不能永久的解决当今IP地址短缺的问题,因此IPv6的应用越来越显得重要。IPv6的应用是个循序渐进的过程,在很长时间内,IPv4网络和IPv6网络会同时存在且需要相互通信。基于这种情况,就需要一种技术,解决IPv4IPv6网络的互通问题,所以NAT-PT技术应运而生。

    NAT-PTNetwork Address Translation-Protocol Translation,附带协议转换的网络地址转换)技术秉承NAT技术(RFC2663)的思想,但在原理方面大有不同,可以这样简单的理解,NAT技术是IPv4私网地址与公网地址之间的转换,它是为了解决IPv4公网地址缺乏问题;NAT-PT技术则是IPv6协议与IPv4协议之间的转换,在RFC 2765RFC 2766中给出了其定义它是为了解决两者的互通问题。在IPv4网络完全过渡到IPv6网络之前,两种类型网络之间直接的通信可以通过NAT-PT来实现。

                                                                                                             图1 NAT-PT示意图

    如图1所示,NAT-PT作用于IPv4IPv6网络边缘设备上,所有的地址转换过程都在该设备上实现,对IPv4IPv6网络来说是透明的,即用户不必改变目前的IPv4网络中主机的配置就可实现IPv6网络与IPv4网络的通信。

    NAT-PTNAT本质的区别在于应用场合的不同。NATIPv4网络中公网、私网地址的相互转换,而NAT-PT则是IPv6IPv4地址的相互转换,加入了IPv6IPv4间协议的转换内容。比如对于ICMP报文的处理上,所有的ICMPv4报文向ICMPv6报文转换的时候都必须要重新计算校验和,因为ICMPv6TCPUDP一样有一个伪报头的检验和。另外所有Type字段都需要进行更新,如果是ICMP差错报文的话,那么差错信息中的IP头也同时需要转换。这些报文头转换的同时很可能引起报文长度的变化,因此IPv6报文最外层净载荷长度字段必须被更新。同样,ICMPv6ICMPv4进行转换也是类似的流程。

    1.2    NAT-PT和隧道的差别

    NAT-PT和隧道都是IPv4IPv6过渡的技术,但是它们之间的实现和适用范围都是有很大的不同的。

    首先报文转换和转发的方式不同,这个是NAT-PT和隧道最根本的差别。NAT-PT是对报文的网络层内容进行转换修改,剥离原先的报文头,替换为转换之后的报文头(IPv4àIPv6或者IPv6àIPv4);而隧道是对初始报文作另一层报文封装,根据隧道的不同类型加上相应的报文头。

    正是由于转换的方式不同,导致他们检查报文的方式也不同。NAT-PT会检查并且可以更改报文中的端口号;而隧道从来不会检查报文的传输层内容。

    转换方式的不同同样致使了他们的使用范围不一样,NAT-PT一般适用于IPv4IPv6不同网络中主机互相访问的环境中;而隧道一般用于实现一种网络协议跨越另一种网络协议之间的通讯。所以,形成NAT-PT的环境只需要有一台可以进行NAT-PT转换的设备即可;而构造一种隧道的环境就必须要两台设备形成一个隧道。

    2      NAT-PT的基本原理

    2.1    NAT-PT前缀

    不论采用哪种NAT-PT机制,配置NAT-PT前缀都是必须的。NAT-PT前缀是长度为96位的IPv6地址前缀,它具有以下两个作用:

    (1) IPv6网络发送到IPv4网络的报文到达NAT-PT设备后,设备会检测报文目的IPv6地址的前缀,只有与所配置的NAT-PT前缀相同的报文才允许进行IPv6IPv4的转换。

    (2) IPv4网络发送到IPv6网络的报文,经过NAT-PT转换后,源IPv6地址的前缀为配置的NAT-PT前缀。

    2.2    NAT-PT机制及原理

    类似于NATNAT-PT有几种机制可实现IPv4IPv6地址之间的相互转换:

    (一)  基本NAT-PT机制及原理

    在基本NAT-PT机制的工作过程中,当IPv6主机向处于外部公网的IPv4主机发起连接请求时,一组IPv4的地址应该被提前设置好以用来作地址转换使用。从IPv6网络向外传输的IPv6数据包,其源IPv6地址及相关的字段如IPTCPUDPICMP的头部校验和都将被转换。同理,对于向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-PTIPv6网络中进行了通报,因此以此为前缀的数据包都被路由到NAT-PT设备进行处理。

    该数据包到达NAT-PT后,其报文信息将被转换为IPv4版本。如果该数据包不是用来初始化连接的,那么NAT-PT一定保存着该数据包所从属的连接的状态信息,包括IPv6节点A被分配的IPv4地址及其它用于转换的信息。如果该数据包所从属连接的状态信息不存在,或者根本没有这个连接,那么该数据包将被丢弃。如果该数据包是用来初始化连接的,那么NAT-PT将从地址池中分配一个IPv4地址(比如120.130.26.10),并将其报文信息转换为IPv4版本。其传输在整个连接过程中会被存储于内存中,IPv6IPv4之间的地址映射也将一直被维持着直到连接的结束。

    转换后的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-PTNetwork Address Port Translation - Protocol Translation)把转换的概念做了进一步的扩展,对于传输标识(TCPUDP的端口号,ICMP标识字段)也进行了转换。不同的IPv6地址转换时,可以对应同一个IPv4地址,通过不同的端口号来区分不同的IPv6主机,从而节省IPv4地址资源。这种机制提供一个IPv4地址和多个使用NAT-PT前缀格式的IPv6地址之间的一对多的动态映射(只有ICMPTCPUDP报文可以使用这种方式转换)。

    NAPT-PT机制使得多个IPv6节点在与外网IPv4节点进行通讯时可以共用IPv4转换地址。在转换的过程中,IPv6节点的TCP/UDP端口号被转换成已经登记的IPv4TCP/UDP端口号。传统NAT-PT只局限于TCPUDP及使用了端口复用的其他应用程序(属于静态地址捆绑),而NAPT-PT解决了传统NAT-PT中存在的问题。例如,当地址池中的地址被耗尽后,NAT-PT将不再起作用,这时,IPv6节点将不能与外部的IPv4节点建立连接。然而,在应用了NAPT-PT后,一个IPv4的转换地址就可以建立63KTCP63kUDP连接。通过修改图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

    可以看出目的地址是节点AIPv6地址。象上面的例子,如果传向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地址的转换。IPv6IPv4两端的DNS,其命名空间是独立且较少的。特别需要说明的是,当DNS数据包在IPv6IPv4网络之间传输时,DNS-ALG能够把从IPv6网络中查询到的IPv6地址与地址池中的IPv4地址绑定起来。同样,对于从IPv4网络中查询到的IPv4地址(例如从IPv6端发起对IPv4网络中主机的连接),DNS-ALG同样能够进行类似绑定。

    当建立IPv6网络与IPv4网络的连接时,无论是从哪端发起的连接,NAT-PT都将分配一个IPv4转换地址给一个IPv6节点。但是,当初始化一个连接时,从IPv4侧发起连接与从IPv6侧发起连接,其工作原理是不一样的,下面分别进行介绍

    (1)    双向NAT-PT:从IPv4IPv6

     

                                                                                                    图3  双向NAT-PT原理示意图

    如图3所示,当节点CName Resolver发出节点A的地址查询请求后,该请求将被传递到IPv6网络中的DNS服务器。因为NAT-PT被配置在IPv6IPv4网络的交界处,因此查询数据包将会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节点名的查询。这个节点被送到本地的DNSDNS-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:3210120.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:3210120.130.26.1的映射关系,因此上述信息将被转换成:

    源地址:SA=PREFIX::132.146.243.30,源TCP端口 port = 1025

    目的地址:DA=FEDC:BA98::7654:3210,目的TCP端口 port = 80

    连接由此建立了起来,通讯就可以进行了。

    对于上面所描述的从IPv4IPv6的连接建立过程,可能会导致服务攻击拒绝(denial of service attack)。因为一个节点可以发起多个查询,导致NAT-PTIPv4的地址资源耗尽,从而阻止了后面的服务。因此对于此种连接的建立(从IPv4IPv6发起的连接)应该有一个超时时间以降低服务拒绝的可能性。在从IPv6IPv4的连接建立过程中,可以提前保存一个IPv4的地址(采取NAPT-PT)来减少在建立过程中服务拒绝的可能性。

    (2)    双向NAT-PT:从IPv6IPv4

    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网络的转换。

    对于从IPv6IPv4的连接,在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。相反,如果节点CA记录存在,那么,记录信息也会被传给NAT-PTDNS-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服务器与主机的互通。

    3      NAT-PT转换细节

    3.1    SIIT-无状态IP/ICMP转换

    SIITStateless IP/ICMP Translation Algorithm)是NAT-PT的基础,指无状态IP/ICMP转换算法,在RFC2765中有详细描述,它解决了IPv6IPv4节点之间进行通讯的问题。IPv6节点通过获取一个暂时的IPv4地址,为自己配置一个IPv4翻译地址,而作为IPv4网络侧的IPv4节点通过IPv4映射地址与IPv6节点之间进行通讯。在通讯的过程中,转换器将对报文头进行转换,使得报文在IPv6网络和IPv4网络中都能够被顺利的路由并建立和维持通讯。

    3.1.1     IPv4IPv6报文头转换

    当转换器收到从IPv4网络到IPv6网络的报文时候,就要把IPv4的报文头转换为IPv6的报文头,原先的IPv4报文头就被移走,用新的IPv6的报文头代替。除了ICMP包以外,传输协议报头和数据部分都保留不变。

                                                                                                       图4 IPv4IPv6报文转换

    另外,由于IPv6协议和IPv4协议在处理报文分片方式上的不同,导致在处理分片报文时需要特别注意。对于IPv6来说,只有发送端可以对报文进行分段,而中间路由器不能进行分段。因此对于IPv6path MTU discovery就是必须的了,而对于IPv4来说,中间路由器可以进行分段,所以path MTU discovery也就是可以选择的了。所以,如果IPv4的报文头中DF位没有设置,那么为了保证转换后的IPv6报文不会超过MTU,则需要数据净荷长度不能超过1232字节(最小MTU1280字节-40字节IPv6报头-8字节分段报头),如果DF位被设置了,同时报文不是一个分段报文的话,则转换后的IPv6报文不需要包含分片报头,此时IPv6报文头各个字段设置如下:

                                                                                     表1 IPv4IPv6报头转换字段列表(无分片)

    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 IPv4IPv6报头转换列表(有分片)

    IPv6字段

    设置

    Payload Length(载荷长度)

    在原来的IPv4基础上加上分段头长度8IPv4报头中length域的值减去IPv4报头和选项的大小,再加上8字节的分段报头长度)

    Next Header(下一报头)

    分片头(44

    分片报头字段

     

    Next Header(下一报头)

    IPv4报头的Protocol域中copy过来

    Fragment Offset(分片偏移量)

    IPv4Fragment Offsetcopy过来

    M flagM标记位)

    IPv4报头的More Fragments域中copy过来

    Identification(分片标识)

    16位从IPv4报头的Identification域中copy过来,高16位为0

     

    3.1.2     ICMPv4ICMPv6报文头转换

    所有的ICMPv4报文向IPv6报文的转换都要重新计算其校验和,因为ICMPv6报文和UDP/TCP一样有一个伪报头的校验和。另外所有类型(Type)字段都需要更新。如果是ICMP错误报文,那么错误信息中的IP头也需要转换。最后,前面的调整也可能对报文长度产生影响,因此还需要对相应的域进行修改。

                                                                                                 表3 ICMPv4ICMPv6查询报文转换列表

     

    IPv4Type

    转换处理

    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 ICMPv4ICMPv6差错报文转换列表

    Destination Unreachable (Type 3)

    目的不可达

    Code

    转换处理或者对应ICMPv6code

    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 3code部分不变

    Parameter Problem

    (参数问题)

    Type 12

    Type 4,相应域需要进行改变

     

    3.1.3     IPv6IPv4报文头转换

    当一个转换器收到一个IPv4映射地址的报文时,那么该IPv6报文将被转换成IPv4报文,然后基于该IPv4目的地址进行转发,从而将IPv6报文头转换成IPv4报文头。除了ICMP报文,其他的传输层报文头和数据部分不会发生任何变化。

     

                                                                                                               图5 IPv6IPv4报文转换

    如果没有IPv6分片头,那么转换后的IPv4报文头的字段设置如下表

                                                                                             表5 IPv6IPv4报头转换字段列表(无分片)

    IPv4字段

    设置

    Version(版本)

    4

    Internet Header Length(首部长度)

    5 (no IPv4 options)

    Type of Service and Precedence(服务类型)

    IPv6Traffic Class域中copy过来

    Total Length(总长度)

    IPv6报头中Payload length域的值加上IPv4报头大小

    Identification(标识)

    0

    Flags(标识位)

    MF域置为0DF域置为1

    Fragment Offset(分片偏移)

    0

    Time to Live(生存时间)

    IPv6Hop Limit域中copy过来

    Protocol(协议)

    IPv6中的Next Header域中copy过来

    Header Checksum(首部检验和)

    IPv4报头创建好重新计算

    Source Address(源地址)

    如果IPv6源地址是IPv4-translated地址,则IPv6地址的低32copyIPv4源地址域。其他的情况源地址都设为0.0.0.0

    Destination Address(目的地址)

    IPv4-mapped地址的低32

    如果IPv6报文中含有分片头,那么除了下面的特殊字段变化不同以外,其他的仍然根据上面的叙述进行转换

                                                                                             表6 IPv4IPv6报头转换字段列表(有分片)

    IPv4字段

    设置

    Total Length

    IPv6报头中的Payload length域的值加上IPv4报头的大小,减去8Fragment header的大小)

    Identification

    Copy IPv6中的分片头中的Identification域的低16

    Flags

    MF值引用分片头中的M标志,DF设置成0,标识运行IPv4路由器进行分片。

    Fragment Offset

    从分片头中的分片位移域copy过来

    Protocol

    从分片头中Next Header域中copy过来

     

    3.1.4     ICMPv6ICMPv4报文头转换

    因为ICMPv6TCPUDP一样具有伪包头校验和,因此所有需要转换的ICMPv6的报文,其校验和字段必须被更新。另外ICMP的类型字段及包含IP报文头的ICMPv6错误报文的内容也需要同步更新。

                                                                                                 表7 ICMPv6ICMPv4查询报文转换列表

     

    IPv6Type

    转换处理

    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,转换后Type3,转换code域方法如下:

                                                                                                 表8 ICMPv6ICMPv4差错报文转换列表

     

    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 ICMPv6ICMPv4其他报文转换列表

     

    Type

    转换处理或对应IPv4Type

    Packet Too Big

    (包过大)

    Type 2

    转换为ICMPv4中目的不可达(code 4),MTU域需要对报文是否有分段而进行更新。

    Time Exceeded(超时)

    Type 3

    Type11Code不变。

    Code field is unchanged

    Code问题)

    Type 4

    如果Code值是1转换为协议不可达 (Type 3, Code 2);其他情况Type12code0。指针需要针对相应的域进行转换包括IP头。

    Unknown error messages

    (未知错误报文)

     

    Silently drop

     

    3.2    NAT-PT转换细节

    为了使IPv6IPv4网络之间的端对端交流成为可能,NAT-PT需要把IPv6IPv4的报文头进行转换。由于地址转换功能和端口复用的使用,NAT-PT还要对上层协议报文头做相应的调整。协议转换的详细介绍在SIIT中,但是因为NAT-PT也进行了地址转换,因此在NAT-PT上还有一些补充的修改。

    3.2.1     IPv4 报头向IPv6报头的转换

    NAT-PT的具体应用中,除了下面的字段说明之外,其他字段的转换的过程和RFC2765SIIT)中所描述几乎是一样的。

                                                                                                   表10 NAT-PTIPv4IPv6报头转换

    IPv6字段

    设置

    源地址

    32位是IPv432 位源地址,高96位是被指定的前缀(PREFIX ::/96)。符合此类地址格式的的数据包将被路由到NAT-PT网关

    目的地址

    NAT-PT保持着IPv4目的地址和IPv6目的地址之间的映射关系,根据这种映射关系IPv4目的地址被IPv6地址所替代

     

    3.2.2     IPv6报头向IPv4 报头的转换

    NAT-PT的具体应用中,除了下面所描述的源地址说明之外,其他的转换方式和RFC2765SIIT)中所描述的一样。

                                                                                                   表11 NAT-PTIPv6IPv4报头转换

    IPv4字段

    设置

    源地址

    NAT-PT保持着地址池中的IPv4地址与IPv6源地址之间的映射关系,根据这种映射,IPv6源地址将被IPv4地址所替代

    目的地址

    被转换的IPv6数据包的目的地址将遵循如下格式:PREFIX ::IPv4/96,因此IPv6目的地址的低32位将被直接复制为IPv4的目的地址

     

    3.2.3     IPv4IPv6校验和的更新

    UDP的校验和(当非零时)和TCP的校验和应该被重新计算,从而反映从IPv4IPv6的地址变化。校验和的计算法则可以借鉴RFC1631NAT)。在NAPT-PT的转换模式下,TCP/UDP校验和的变化除了包括地址的变化外,还有包括TCP/UDP端口号的变化。

    如果发送到NAT-PTIPv4 UDP数据包的校验和为0NAT-PT在把它转换成IPv6数据包后要重新对该UDP报文做校验和计算。如果校验和为0UDP报文是是以分片的形式发送过来的,那么NAT-PT需要做的是等待所有的报文到达,重新聚合成一个完整的报文后,进行IPv6的转换,然后进行校验和计算,最后再转发出去。

    IPv6中的ICMP报文不同于IPv4中的ICMP报文,它采用了伪包头,对于校验和的计算类似于UDPTCP的计算过程(此部分可参考RFC24608.1节)。需要注意的是,由于ICMP报文的载荷中也可能携带有地址信息,该部分同样要做地址转换,转换后才能够进行校验和的计算。

    3.2.4     IPv6IPv4校验和的更新

    同从IPv4IPv6TCP/UDP/ICMP校验和一样,它的变化反映了从IPv6IPv4的地址变化,计算法则也是一样的。在NAPT-PT的转换模式下,此变化还包括端口号的改变。对于UDP报文,因为其校验和是可选项,所以在进行转换后,校验和可以被简单的设置成0。而ICMP报文的校验和必须要重新计算,因为IPv4中无ICMP伪报头的概念(同样需要注意ICMP载荷中携带地址信息的情况)。

    4      NAT-PT的局限

    RFC2663中描述的关于NAT的局限性同时也就是NAT-PT的局限性,下面所列举的是局限性中其中比较重要的,也有些是NAT-PT所独有的局限性。

    4.1        拓扑局限性

    使用NAT-PT是受局限的,所有与某进程有关的请求与应答都必须要经过同一NAT-PT路由器。实现这一点的一个方法就是把NAT-PT置于边界路由器上,该路由器对于一个局域网络来说是较少的,这样所有的IP数据包或者是从该网络发起的,或者是以该网络为目的的。对于NAT来说,这同样是个问题,并在RFC2663中进行了描述。

    4.2        协议转换限制

    一些IPv4的数据报字段在IPv6中发生了改变,因此NAT-PT的转换是不很准确的。例如IPv4中的选项段在IPv6中语义上有很大的改变,就不能很好的进行转换。

    4.3        需要ALG的协调工作

    因为NAT-PT需要对地址进行转换,那么当某个上层的应用程序,在其应用中包含了地址信息(或端口信息),如果NAT-PT不进行特殊处理,就会引起使用问题。在这种情况下,应用层网关(ALGApplication Layer Gateway)就需要为这类应用提供协调服务。这对于IPv4NAT来说也是普遍的问题。

    4.4        缺少端对端的安全性

    NAT-PT最大的局限性之一就是在端对端网络层上缺少安全性。另外,对于传输层及应用中携带IP地址的应用层也没有安全性可言。这是NAT的一个遗传问题。且不说NAT-PT,对于跨两个不同IP地址的网络来说,IPsec是不可能实现的。两个端点之间要实现网络层上的IPsec功能,必须都是IPv4节点或者都是IPv6节点。

    4.5        DNS转换和DNS-SEC

    前面给出了DNS信息转换的机制,但是很明显这种机制不能和安全DNS同时使用。例如,IPv6网络中的授权DNS服务器收到来自IPv4网络的查询时,它无法对回复进行签名,从而导致域名解析失败。