`
810364804
  • 浏览: 788213 次
文章分类
社区版块
存档分类
最新评论

NAT-PT介绍

 
阅读更多

1前言

1.1NAT-PT和NAT的差别

如今,随着全球的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来实现。

图1NAT-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进行转换也是类似的流程。

1.2NAT-PT和隧道的差别

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

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

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

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

2NAT-PT的基本原理

2.1NAT-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前缀。

2.2NAT-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服务器与主机的互通。

3NAT-PT转换细节

3.1SIIT-无状态IP/ICMP转换

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

3.1.1IPv4向IPv6报文头转换

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

图4IPv4向IPv6报文转换

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

表1IPv4向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位没有被设置,或者本身就是一个分片),那么报文需要做如下修改:

表2IPv4向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

3.1.2ICMPv4向ICMPv6报文头转换

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

表3ICMPv4向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):

表4ICMPv4向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,相应域需要进行改变

3.1.3IPv6向IPv4报文头转换

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

图5IPv6向IPv4报文转换

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

表5IPv6向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报文中含有分片头,那么除了下面的特殊字段变化不同以外,其他的仍然根据上面的叙述进行转换

表6IPv4向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过来

3.1.4ICMPv6向ICMPv4报文头转换

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

表7ICMPv6向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域方法如下:

表8ICMPv6向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)

表9ICMPv6向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

3.2NAT-PT转换细节

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

3.2.1IPv4报头向IPv6报头的转换

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

表10NAT-PT中IPv4向IPv6报头转换

IPv6字段

设置

源地址

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

目的地址

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

3.2.2IPv6报头向IPv4报头的转换

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

表11NAT-PT中IPv6向IPv4报头转换

IPv4字段

设置

源地址

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

目的地址

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

3.2.3从IPv4到IPv6校验和的更新

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报文的载荷中也可能携带有地址信息,该部分同样要做地址转换,转换后才能够进行校验和的计算。

3.2.4从IPv6到IPv4校验和的更新

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

4NAT-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不进行特殊处理,就会引起使用问题。在这种情况下,应用层网关(ALG:Application Layer Gateway)就需要为这类应用提供协调服务。这对于IPv4的NAT来说也是普遍的问题。

4.4缺少端对端的安全性

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

4.5DNS转换和DNS-SEC

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics