8.5 从 IPv4向 IPv6 的迁移

如果没有明确的迁移方法的话,将无法实施一种新的路由协议,迁移过程越简单,就越可能实施新协议。IPv6与IPv4之间的互操作性是势在必行的,IPv6节点需要与IPv4节点进行通信,至少在初始阶段是这样,而且在互通时间上还可能非常不确定。NGTRANS IETF工作组制定了多种迁移方法来推动从IPv4向IPv6的迁移工作,并确保IPv4与IPv6之间的兼容性。

与IPv4保持兼容的方式有多种,运行双栈的节点能够完全支持IPv4和IPv6,可以使用IPv4和IPv6进行通信。这样的节点可以将IPv6包封装到IPv头部中,从而在现有的IPv4网络中创建一条隧道,使得两个IPv6节点可以经IPv4网络进行通信。目前定义了以下两种隧道机制。

• 自动隧道(Automatic Tunnels)

• 配置隧道(Configured tunnels)

IPv6中定义了与IPv4兼容的IPv6地址,该IPv6地址的前96个bit为全0,剩余的32bit构成一个IPv4地址,如::172.69.1.1就是一个与IPv4兼容的IPv6地址。如果节点配置了与IPv4兼容的地址,那么就可以使用自动隧道机制。

如果IPv4和IPv6共存于同一个网络之中,那么就必须规定相应的机制来正确解决名字与IP地址的解析问题。为了确保DNS服务器能够正确返回IPv4地址、IPv6地址或IPv和IPv6地址,对DNS做了一定的修改,这也是协议共存的一个关键能力要求。

也可以在IPv6网络和IPv4网络之间部署NAT-PT(Network Address Translation Protocol Translation,网络地址转换一协议转换)设备。下面将首选讨论双栈机制。

8.5.1 双栈

对一个节点来说,如果希望既实现IPv6,又能与IPv4节点保持兼容,可以采取的一种方法就是在该节点上同时实现IPv4和IPv6。同时实现了IPv4和IPv6两种协议栈的节点被称为IPv6/IPv4节点,IPv6/IPv4节点可以使用IPv6数据包与IPv6节点进行通信,并使用IPv4数据包与IPv4节点进行通信。

每个IPv6/IPv4节点都必须同时配置IPv6地址和IPv4地址,这两种地址可能相关也可能毫无关系。可以将与IPv4兼容的IPv6地址视为单个地址,其既可以被用作IPv6地址,也可以被用作IPv4地址,完整的128bit就代表IPv6地址,低32bit则代表IPv4地址。

可以采取以下方式来配置地址。

• 使用无状态或状态化(IPv6 DHCP)自动配置方式来配置IPv6地址,该地址既可以是与IPv4兼容的地址,也可以是一个单纯的IPv6地址。

• 采用任何IPv4机制来分配节点的IPv4地址。

• 在配置与IPv4兼容的IPv6地址时,使用IPv4地址配置机制来分配该地址的IPv4部分,通过在IPv4地址前附加96bit前缀0:0:0:0:0:0,节点即可将IPv4地址映射到与IPv4兼容的IPv6地址。如果网络中存在IPv6/IPv4节点,但暂时没有IPv6路由器或地址配置服务器时,这种地址配置方法特别有用。

同时配置了IPv4地址和IPv6地址的节点必须拥有相应的机制来确定应该使用哪个地址,这样的工作就由DNS来完成。

8.5.2 DNS

在DNS中为IPv6定义了一种新的资源记录类型——AAAA记录,该记录可以提供名字到IPv6地址的映射关系。IPv6/IPv4节点上的DNS解析器必须能够同时处理IPv4的A资源记录和IPv6的AAAA资源记录,当节点向DNS服务器查询某个地址时,DNS就可以返回一条A记录或一条AAAA记录。返回的地址类型决定了所使用的协议类型,如果返回的是A记录,则该节点应该使用IPv4地址和IPv4协议来与所请求的目的地进行通信;如果返回的是AAAA记录,则应该使用IPv6。

为IPv6/IPv4主机分配了与IPv4兼容的IPv6地址之后,就在DNS中定义了AAAA记录和A记录,AAAA记录列出了完整的128bit IPv6地址,A记录则列出32bit的IPv4地址。由于列出了两种类型的IP地址,因而纯IPv6(IPv6-only)节点可以查询服务器并接收IPv6地址,而纯IPv4(IPv4-only)节点则可以接收IPv4地址。

如果AAAA记录和A记录中都列出了与IPv4兼容的地址,那么DNS解析器在返回哪种地址以及返回哪种地址会影响通信中所使用的协议类型上存在以下选择。

• 仅向应用返回IPv6地址;

• 仅向应用返回IPv4地址;

• 同时向应用返回IPv4和IPv6地址

DNS服务器返回的地址类型或地址返回的顺序将影响所生成的IP流量的类型。

8.5.3 在 IPv4中隧道化 IPv6

大多数IPv6实现都要沿着IPv4网络进行建设,IPv6主机可能主要通过IPv4网络进行通信,将IPv6包封装到IPv4包中即可支持该功能。目前可以创建以下4类隧道。

• 路由器到路由器;

• 主机到路由器;

• 主机到主机;

• 路由器到主机。

IPv6/IPv4路由器可以封装IPv6流量以通过IPv4网络基础设施进行传送,该方法既适用于位于路由器任一侧的纯IPv6节点,也适用于端到端的IPv6路径穿越IPv4网络进行通信的应用场合。源节点向IPv6路由器发送IPv6包后,该路由器充当隧道的源点,负责将IPv6包封装到IPv4包中,并将IPv4发送到隧道端点,由隧道远端的路由器负责解封装数据包并将其转发至IPv6目的地。

IPv6/IPv4节点可以发起一条去往IPv6/IPv4路由器的隧道,从而为IPv6路径的第一个网段创建隧道。隧道发起节点负责将IPv6包封装到IPv4包中,并将IPv4包发送到隧道端点路由器,由端点路由器解封装数据包,并将IPv6包转发到最终目的地。

IPv6/IPv4主机可以创建去往其他IPv6/IPv4主机的隧道,这完全是一条端到端的隧道。IPv6/IPv4源节点将IPv6包封装到IPv4包中,并通过纯IPv4网络将IPv4包发送到目的地,由目的主机负责解封装该数据包并处理IPv6包。

路由器到主机隧道创建在IPv6路径的最后一个网段,路由器接收到IPv6包之后就创建一个隧道,以便通过其所连接的IPv4网络将该数据包转发给目的主机,目的主机接收到该IPv4包之后,负责解封装该数据包并处理IPv6包。

路由器到路由器隧道以及主机到路由器隧道这两种方法并没有将隧道建立到最终的目的地,远端隧道端点与数据包的最终目的地是不同的,也与最终目的地址不同。虽然需要知道隧道远端的IPv4地址,但无法从真实的IPv6目的地址中得到该信息。这两种方法需要使用配置隧道。

对其余两种隧道方法(主机到主机隧道和路由器到主机隧道)来说,远端隧道端点与数据包的最终目的地相同,因而可以从与IPv4兼容的IPv6目的地址的低32bit中获得远端隧道端点的IPv4地址,从而可以为这两种隧道方法创建自动隧道。

1. 配置隧道

通过在分隔IPv4与IPv6网络的Cisco路由器上创建隧道接口即可在路由器之间创建隧道。需要在两端路由器上定义隧道端点,为该隧道创建一个IPv6子网,并为两端路由器分配IPv6地址;如果使用了某种IPv6动态路由协议(如RIPng或BGP),那么还需要在隧道接口上启用该协议。如图8-26所示,两个IPv6网络连接在一个IPv4网络上,在这两个IPv6网络之间创建了一条隧道以进行通信。

img523a

图8-26 IPv6网络经IPv4网络创建隧道

路由器Tulip和Lily是纯IPv6路由器,它们通过Daisy和Rose之间的IPv6-over-IPv4隧道进行通信。

例8-10显示了路由器Daisy和Rose的配置情况。

例8-10:配置隧道的路由器配置。

img523b

img524a

上例中所示的隧道接口是一个通用隧道,配置在ipv6ip模式下。

如例8-11所示,从Tulip到Lily应用命令traceroute,可以看出IPv6包穿越隧道的情况。

例8-11:显示IPv6包穿越从Tulip到Lily的隧道的情况。

img524b

第1个地址是Daisy的IPv6以太网地址,第2个地址是Rose的隧道接口地址,第3个地址是Lily的以太网地址。

配置隧道可以提供一种直观的通过IPv4网络连接两个IPv6网络的实现方式。

2. 自动隧道

配置了自动隧道的封装主机可以从目的地的与IPv4兼容的IPv6地址中提取出IPv4地址,而封装主机必须拥有去往该IPv4地址的IPv4连接。源主机将数据包封装到IPv4头部中,将提取出来的IPv4地址作为目的地址,并将从自身IPv4兼容地址中提取出来的IPv4地址作为源地址,而主机间的路由器则根本不知道IPv6净荷的存在。

8.5.4 NAT-PT

另一种允许IPv6与IPv4网络及主机共存的方法是使用NAT-PT(Network Address Translation-Protocol Translation,网络地址转换一协议转换)。IPv6/IPv4路由器为纯IPv6和纯IPv4主机进行地址和协议转换,当这些主机进行通信时,都不需要知道它们正在运行的是不同版本的IP协议,完全由NAT-PT路由器来完成所有的转换工作,包括源地址和目的地址的IPv6与IPv4转换。

IPv4 NAT中存在的问题也依然存在于IPv6-to- IPv4 NAT-PAT中,被转换的入站流量和出站流量都必须穿越同一台地址转换器,地址转换器维护了被转换会话的状态信息。请注意,端到端的安全性是不可能的,这是因为IPSec无法穿越NAT设备。除非在转换路由器上运行应用转换网关,否则在IP头部之外任何位置携带IP地址的应用程序都将无法正常工作。穿越协议域的DNS查询消息中必须要在被转换的DNS包(在IPv4与IPv6之间进行转换)中包含请求和响应信息。

除了地址之外,IPv4与IPv6之间的转换存在的另一个特殊问题就是头部信息。通过本章的学习已经知道,IPv6头部与IPv4头部字段是不同的,在选项的处理上也完全不同,因而除非迫不得已,不要使用这种共存方式。