1、IPv6过渡技术

1.1、IPv6过渡的障碍

从IPv4过渡到IPv6就像是“打破一个旧世界,开创一个新未来”,注定要经历一个长期的过程,但终究会实现。后面我们主要对双栈技术、多种隧道技术和协议转换技术进行介绍,并通过实验演示各种网络过渡技术的实现。目前互联网上还是以IPv4设备为主,不可能迅速过渡到IPv6,这主要受制于以下几个方面:

1、网络中仍有些设备尚不支持IPv6,短时间内无法全部更换;

2、网络的升级换代会中断现有的业务;

3、有些传统的应用基于IPv4开发,不支持IPv6;

4、缺乏技术人才,很多技术人员缺乏足够的IPv6知识;

5、IPv6安全相关的规范、等保测评等成熟度不够;主观惰性,得过且过的思想。

针对上述的这些问题、我们在日常的网络规划和实施中该怎么做呢?

1、目前的操作系统基本支持IPv6,近几年的三层及三层以上的网络设备(比如三层交换机、路由器、防火墙等)基本支持IPv6。网络中使用最多的是二层交换机,当前的新旧二层交换机都支持IPv6。这样看来,设备对IPv6的制约有限。

2、合理的网络规划,比如采用双栈同时支持IPv4和IPv6访问,或者使用NAT64临时转换等,这样业务中断的时间完全可控。

3、针对应用不支持IPv6的情况(这一点是最难解决的),可以采用多种方案:修改应用程序代码或重新开发,使之支持IPv6(尽管费时费力,但一劳永逸);采用NAT-PT(Network Address Translation-Protocol Translation,网络地址转换—协议转换)技术,通过硬件或软件实现IPv4和IPv6地址之间的转换(应用不需做任何调整,但本质上仍是基于IPv4,将来终将被淘汰)。

4、安全设备厂家也在加紧IPv6相关产品的研制和开发,相关的安全产品和安全规范也正在被不断完善。

5、加强学习,做好知识储备。

6、据权威数据显示,截至2019年6月,我国IPv6地址数量已跃居全球第一。

1.2、IPv6发展的各个阶段

从IPv4过渡到IPv6需要经历多个阶段,大致如下。

IPv6发展的初期阶段:如下图中的阶段①所示,这时IPv4网络仍占据主要地位,IPv6网络多是一些孤岛,多数应用仍是基于IPv4。

IPv6发展的中期阶段:如下图中的阶段②所示,此时已经建成了IPv6互联网,IPv6平台上已运行了大量的业务,但IPv4互联网仍然存在,且仍然存在着一些IPv6孤岛。

IPv6发展的后期阶段:如下图中的阶段③所示,此时IPv6互联网已经普及,IPv4互联网不复存在,但一些IPv4孤岛继续存在。

20220319200919

1.3、IPv4和IPv6互通问题

IPv4和IPv6相互间不兼容,在IPv6发展的不同阶段,需要解决IPv4和IPv6网络之间的互联互通问题,具体有下面几类:

IPv6孤岛之间的互通;
通过IPv4网络访问IPv6网络;
通过IPv6网络访问IPv4网络;
IPv4孤岛之间的互通;

上图中的各个阶段都存在着IPv4网络与IPv6网络互连互通的问题,其中阶段①和阶段②还存在IPv6孤岛之间的互通问题;阶段③还存在IPv4孤岛之间的互通问题。

1.4、IPv6过渡技术

IPv6过渡技术大体上可以分为三类:

双栈技术;
隧道技术;
协议转换技术;

1、双栈技术

双栈技术(dual-stack)是使网络中的节点同时支持IPv4和IPv6协议栈的技术,其中源节点根据目的节点的不同选用不同的协议栈,而网络设备根据报文的协议类型选择不同的协议栈进行处理和转发。连接双栈网络的接口必须同时配置IPv4地址和IPv6地址。双栈技术是IPv6过渡技术中应用最广泛的一种,隧道技术和协议转换技术的实现也需要双栈技术的支持。

2、隧道技术

隧道技术(tunnel)是一种封装技术。它利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议,将其他协议产生的数据报文封装在自身的报文中,然后在网络中传输。隧道是一个虚拟的点对点连接。一个隧道提供了一条使封装的数据报文能够传输的通路,并且在一个隧道的两端可以分别对数据报文进行封装及解封装。隧道技术就是指包括数据封装、传输和解封装在内的全过程。隧道技
术是IPv4向IPv6过渡的一个重要手段。

3、协议转换技术

协议转换技术也称为地址转换技术,在以往的IPv4网络中,可通过NAT技术把内网中的私有IPv4地址转换成公网IPv4地址。正是因为NAT使用得太成功,导致IPv4地址短缺显得没那么迫切,由此延缓了IPv6的实现步伐。本章要介绍的是网络地址转换-协议转换(Network Address Translation-Protocol Translation,NAT-PT),这是一种可以让纯IPv6网络和纯IPv4网络相互通信的过渡机制。NAT-PT主要是利用NAT进行IPv4地址和IPv6地址的相互转换。通过使用NAT-PT,用户无须对现有的IPv4网络进行任何改变,就能实现IPv6网络和IPv4网络的相互通信。

NAT-PT和NAT64都是有状态的协议转换技术,后面要介绍的IVI(IV是罗马数字4,VI是罗马数字6,IVI即是IPv4和IPv6转换技术)是无状态的协议转换技术。所谓的有状态和无状态,用通俗的话解释就是,在无状态地址转换时,IPv4地址和IPv6地址存在紧密关系,通过某种映射算法来唯一确定,同一个地址在任何时间转换后的结果都是一样的,转换设备(防火墙或路由器等协议转换设备)不需要记录任何会话信息(会话映射表),仅需要维护映射算法即可。在有状态地址转换时,IPv4地址和IPv6地址不存在固定关系,需要根据目前的使用状态选择可用地址和端口进行映射,同一个地址在不同时间转换后的结果不一定相同,转换设备需要记录用户转换时的会话信息。简而言之,如果转换设备需要记录地址转换前后的映射情况即为有状态转换,反之为无状态转换。

下面我们将通过实验一个个来详细的讲解IPv6的三大过渡技术。

2、双栈技术

双栈技术是IPv4向IPv6过渡时使用的一种常见技术。网络中的节点可同时支持IPv4和IPv6协议栈,源节点根据目的节点的不同选用不同的协议栈,而网络设备根据报文的协议类型选择不同的协议栈进行处理和转发。双栈可以在一个单一的设备上实现,也可以存在一个双栈骨干网。对于双栈骨干网,其中的所有设备必须同时支持IPv4/IPv6协议栈,连接双栈网络的接口必须同时配置IPv4地址和IPv6地址。

2.1、配置IPv6双栈

image-20220319225648342

实验拓扑如上、我们按照拓扑图上面规划的地址进行配置;使所有网络设备都支持双栈。然后启用Windows计算机的IPv6协议,使计算机也支持IPv6。上图中的2台DNS服务器WinServer2016-DNS-Web和WinServer016-DNS-Web2,分别配置A记录和AAAA记录。这里我们先把IPv4网络配置完成:

Switch-1交换机配置如下:

Switch>en
Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#hostname Switch-1
Switch-1(config)#vlan 2
Switch-1(config-vlan)#int eth0/1
Switch-1(config-if)#sw acc vlan 2
Switch-1(config)#int eth0/2
Switch-1(config-if)#no sw
Switch-1(config-if)#ip add 10.255.1.1 255.255.255.0
Switch-1(config-if)#int eth0/3
Switch-1(config-if)#no sw
Switch-1(config-if)#ip add 10.255.2.1 255.255.255.0 
Switch-1(config-if)#int vlan 1
Switch-1(config-if)#ip add 10.1.1.1 255.255.255.0
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#int vlan 2
Switch-1(config-if)#ip add 10.1.2.1 255.255.255.0
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#ip route 0.0.0.0 0.0.0.0 10.255.1.2
Switch-1(config)#ip route 0.0.0.0 0.0.0.0 10.255.2.2 2
Switch-1(config)#
Switch-1(config)#end
Switch-1#wr

Switch-2交换机配置如下:

Switch>en
Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#hostname Switch-2
Switch-2(config)#vlan 2
Switch-2(config-vlan)#exit
Switch-2(config)#int eth0/1
Switch-2(config-if)#sw acc vlan 2
Switch-2(config-if)#int eth0/2
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ip add 10.255.1.2 255.255.255.0
Switch-2(config-if)#int eth0/3
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ip add 10.255.2.2 255.255.255.0
Switch-2(config-if)#int eth1/0
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ip add 10.255.3.1 255.255.255.0
Switch-2(config-if)#int eth1/1
Switch-2(config-if)#sw acc vlan 2
Switch-2(config-if)#int vlan 1
Switch-2(config-if)#ip add 10.2.1.1 255.255.255.0
Switch-2(config-if)#no shutdown 
Switch-2(config-if)#int vlan 2
Switch-2(config-if)#ip add 10.2.2.1 255.255.255.0
Switch-2(config-if)#no shutdown 
Switch-2(config-if)#exit
Switch-2(config)#ip route 0.0.0.0 0.0.0.0 10.255.3.2
Switch-2(config)#ip route 10.1.0.0 255.255.0.0 10.255.1.1
Switch-2(config)#ip route 10.1.0.0 255.255.0.0 10.255.2.1 2
Switch-2(config)#end
Switch-2#wr

ISP路由器配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname ISP
ISP(config)#int eth0/0
ISP(config-if)#ip add 218.1.1.1 255.255.255.0
ISP(config-if)#no shutdown 
ISP(config-if)#int eth0/1
ISP(config-if)#ip add 218.1.2.1 255.255.255.0
ISP(config-if)#no shutdown 
ISP(config-if)#end
ISP#wr
Building configuration...
[OK]

HillStone防火墙配置如下:

login: hillstone
password: 
SG-6000# conf 
SG-6000(config)# interface ethernet0/0
SG-6000(config-if-eth0/0)# no ip add dhcp 
SG-6000(config-if-eth0/0)# ip add 172.16.200.20 255.255.255.0
SG-6000(config-if-eth0/0)# manage http
SG-6000(config-if-eth0/0)# exit
SG-6000(config)# service "remote-desktop"
SG-6000(config-service)# tcp dst-port 3389
SG-6000(config-service)# exit
SG-6000(config)# interface ethernet0/1
SG-6000(config-if-eth0/1)# zone "untrust"
SG-6000(config-if-eth0/1)# ip add 218.1.1.2 255.255.255.0
SG-6000(config-if-eth0/1)# manage ping
SG-6000(config-if-eth0/1)# exit        
SG-6000(config)# interface ethernet0/2
SG-6000(config-if-eth0/2)# zone "trust"
SG-6000(config-if-eth0/2)# ip add 10.255.3.2 255.255.255.0
SG-6000(config-if-eth0/2)# manage ping
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# ip vrouter "trust-vr"
SG-6000(config-vrouter)# snatrule from "Any" to "Any" service "Any" trans-to eif-ip mode dynamicport 
rule ID=1
SG-6000(config-vrouter)# dnatrule from "Any" to "218.1.1.2" service "HTTP" trans-to "10.2.2.2" port 80 
rule ID=1
SG-6000(config-vrouter)# dnatrule from "Any" to "218.1.1.2" service "DNS" trans-to "10.2.2.2" port 53 
rule ID=2
SG-6000(config-vrouter)# ip route 10.0.0.0/8 10.255.3.1
SG-6000(config-vrouter)# ip route 0.0.0.0/0 218.1.1.1
SG-6000(config-vrouter)# exit
SG-6000(config)# rule id 1
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "untrust"
SG-6000(config-policy-rule)# src-addr "Any"
SG-6000(config-policy-rule)# dst-addr "Any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-untrust ipv4" 
SG-6000(config-policy-rule)# exit
SG-6000(config)# rule id 2
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "untrust"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "Any"
SG-6000(config-policy-rule)# dst-addr "Any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "untrust-to-trust ipv4" 
SG-6000(config-policy-rule)# exit
SG-6000(config)# rule id 3
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "Any"
SG-6000(config-policy-rule)# dst-addr "Any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-trust ipv4" 
SG-6000(config-policy-rule)# exit
SG-6000(config)# 
SG-6000(config)# exit
SG-6000# sa
Save configuration, are you sure? [y]/n: y

Building configuration.
Saving configuration is finished
2016-03-19 20:23:08, Event CRIT@MGMT: hillstone save system configuration via Console.
SG-6000# 

IPv4网络配置完成以后,我们开始配置IPv6网络;使实验拓扑的整个网络可以支持双栈协议。

Switch-1交换机配置如下:

Switch-1>en
Switch-1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch-1(config)#ipv6 unicast-routing 
Switch-1(config)#int eth0/2
Switch-1(config-if)#no switchport 
# 该接口原来配置了IPv4地址,现在又配置了IPv6地址,相当于Switch-1和Switch-2交换机之间的互联网络既支持IPv4也支持IPv6
Switch-1(config-if)#ipv6 add 2001:da8:1011:f001::1/64
Switch-1(config-if)#ipv6 enable 
Switch-1(config-if)#int eth0/3
Switch-1(config-if)#no switchport 
Switch-1(config-if)#ipv6 enable 
Switch-1(config-if)#ipv6 add 2001:da8:1011:f002::1/64
Switch-1(config-if)#int vlan 1
Switch-1(config-if)#ipv6 enable 
# 该VLAN接口原来配置了IPv4地址,现在又配置了IPv6地址
# 该VLAN中的终端设备既可以是IPv4,也可以是IPv6(也可以同时配置IPv4和IPv6地址)
Switch-1(config-if)#ipv6 add 2001:da8:1011:1001::1/64
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#int vlan 2
Switch-1(config-if)#ipv6 add 2001:da8:1011:1002::1/64
Switch-1(config-if)#ipv6 enable 
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#exit
Switch-1(config)#ipv6 route ::/0 2001:da8:1011:f001::2
Switch-1(config)#ipv6 route ::/0 2001:da8:1011:f002::2 2
Switch-1(config)#end
Switch-1#wr

Switch-2交换机配置如下:

Switch-2>en
Switch-2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch-2(config)#ipv6 unicast-routing 
Switch-2(config)#int eth0/2
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ipv6 add 2001:da8:1011:f001::2/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#int eth0/3
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ipv6 add 2001:da8:1011:f002::2/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#int eth1/0
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ipv6 add 2001:da8:1011:f003::1/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#int eth1/1
Switch-2(config-if)#sw acc vlan 2
Switch-2(config-if)#int vlan 1
Switch-2(config-if)#ipv6 add 2001:da8:1011:2001::1/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#no shutdown 
Switch-2(config-if)#int vlan 2
Switch-2(config-if)#ipv6 add 2001:da8:1011:2002::1/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#no shutdown 
Switch-2(config-if)#ipv6 route 2001:da8:1011:1000::/52 2001:da8:1011:f001::1
Switch-2(config)#ipv6 route 2001:da8:1011:1000::/52 2001:da8:1011:f002::1 2
Switch-2(config)#ipv6 route ::/0 2001:da8:1011:f003::2
Switch-2(config)#end
Switch-2#wr
Building configuration...
Compressed configuration from 1735 bytes to 989 bytes[OK]

ISP路由器配置如下:

ISP>en
ISP#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
ISP(config)#ipv6 unicast-routing 
ISP(config)#int eth0/0
ISP(config-if)#ipv6 add 2001:1::1/64
ISP(config-if)#ipv6 enable 
ISP(config-if)#no shutdown 
ISP(config-if)#int eth0/1
ISP(config-if)#ipv6
*Mar 19 21:18:42.200: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to up
*Mar 19 21:18:43.204: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to up
ISP(config-if)#ipv6 add 2001:2::1/64
ISP(config-if)#ipv6 enable 
ISP(config-if)#no shutdown 
ISP(config-if)#ipv6 route 2001:da8:1011::/48 2001:1::2
ISP(config)#end
ISP#wr

Hillstone防火墙配置如下:

SG-6000# conf 
SG-6000(config)# interface ethernet0/2
SG-6000(config-if-eth0/2)# ipv6 enable 
# 防火墙接口配置IPv6地址
SG-6000(config-if-eth0/2)# ipv6 add 2001:da8:1011:f003::2/64
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# interface ethernet0/1            
SG-6000(config-if-eth0/1)# ipv6 enable 
SG-6000(config-if-eth0/1)# ipv6 add 2001:1::2/64
SG-6000(config-if-eth0/1)# exit
SG-6000(config)# ip vrouter trust-vr 
SG-6000(config-vrouter)# ipv6 route 2001:da8:1011::/48 2001:da8:1011:f003::1
SG-6000(config-vrouter)# ipv6 route ::/0 2001:1::1
SG-6000(config-vrouter)# exit
# 这条规则会放行所有从内网到外网的IPv6流量
SG-6000(config)# rule id 4
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "untrust"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-trust ipv6" 
SG-6000(config-policy-rule)# exit
# 这条规则会放行所有从外网到内网2001:DA8:1011:2002::2的访问。
# 根据实验要求,需放开HTTP和DNS,这里直接放开了所有服务,出于安全考虑,在生产环境中需严格限定放开的端口
SG-6000(config)# rule id 5
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "untrust"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-ip 2001:da8:1011:2002::2/128 
SG-6000(config-policy-rule)# name "permit-all" 
SG-6000(config-policy-rule)# exit
# 这条规则会放行所有从外网到内网2001:DA8:1011:1001::2的远程桌面访问
SG-6000(config)# rule id 6
SG-6000(config-policy-rule)# action permit 
SG-6000(config-policy-rule)# src-zone untrust 
SG-6000(config-policy-rule)# dst-zone trust 
SG-6000(config-policy-rule)# src-addr IPv6-any 
SG-6000(config-policy-rule)# dst-ip 2001:da8:1011:1001::2/128
SG-6000(config-policy-rule)# service "remote-desktop"
SG-6000(config-policy-rule)# name "permit-win10-remote-desktop"
SG-6000(config)# exit
SG-6000# sa
Save configuration, are you sure? [y]/n: y
Backup start configuration file, are you sure? y/[n]: n

Building configuration.
Saving configuration is finished
2016-03-19 21:08:42, Event CRIT@MGMT: hillstone save system configuration via Console.
SG-6000# 

注:这里需要特别说明一下;内网网关的地址是每个网络中第一个可用的IP地址,内网计算机的DNS地址配置为10.2.2.2,外网计算机的DNS地址配置为218.1.2.3。

数通部分配置完成以后我们开始配置服务器。给两台Windows Server 2016服务器Winserver2016- DNS-Web和Winserver2016-DNS-Web2配置静态IPv6地址。配置完成以后在Winserver2016- DNS-Web服务器上添加一条A记录www.ntedu.cn,指向的IPv4地址是218.1.1.2;添加一条AAAA记录www.ntedu.cn,指向的IPv6地址是2001:DA8:1011: 2002::2。在Winserver2016- DNS-Web2服务器上添加一条A记录www.edu.cn,指向的IPv4地址是218.1.2.3;添加一条AAAA记录www.edu.cn,指向的IPv6地址是2001:2::8。

在两台DNS服务器上配置DNS转发器,使它们能够把彼此未知的域名转发给对方。这里需要注意下一下Winserver2016- DNS-Web2向Winserver2016-DNS-Web转发未知的域名时,要填对应的公网IP地址,即218.1.1.2。

Winserver2016-DNS-Web服务器配置完成以后如下图:

image-20220319224814901

Winserver2016-DNS-Web2服务器配置完成以后如下图:

image-20220319224850104

DNS配置完成以后我们开始配置WEB服务器,在两台WindowsServer 2016服务器上添加Web服务器。这里将搭建一个通讯录登记的网站,我们把程序文件夹复制到Winserver2016-DNSWeb服务器的C盘根目录下。然后在Winserver2016-DNS-Web服务器的“服务器管理”窗口中,单击菜单“工具”→“Internet Information Services(IIS)管理器”,打开“Internet Information Services(IIS)管理器”窗口,然后展开左侧的各项,可以看到Default Web Site选项,如下图所示:

image-20220320185608056

我们在Default Web Site上单击鼠标右键,从弹出的快捷菜单中选择“删除”,删除默认的Default Web Site站点。在上图所示的IIS管理器窗口中右键单击“网站”,从快捷菜单中选择“添加网站”,“添加网站”对话框弹出。在“网站名称”中填入网站的描述性名称,如果一台服务器运行了多个网站,通过添加描述可以很容易地区别每个站点的用途。单击“物理路径”右侧的浏览按钮(…),定位到“C:\通讯录登记”(这里也可以直接输入该路径)。“绑定”区域的“类型”中保持默认的http,http对应的默认端口是TCP的80。这里也可以从“类型”下拉列表中选择https,采用https的网站称为安全套接层(Secure Socket Layer,SSL)网站,默认的端口是TCP的443;“IP地址”字段保留默认的“全部未分配”,也就是通过本机配置的所有IP地址(包括IPv4地址和IPv6地址)都可以访问该站点。如果为计算机分配了多个IP地址(若一台服务器上运行多个Web站点,就可以为此服务器配置多个IP地址),那么在“IP地址”下拉列表中选择要指定给此Web站点的IP地址,只有访问该IP地址才能对应到该网站。“主机名”字段暂且保持为空。单击“确定”按钮完成网站的添加,如下图所示:

image-20220320185926956

单击下图中间栏下方的“默认文档”,打开“默认文档”页面,如下图2所示。可以看到访问该网站时,首先寻找的文档是Default.htm。如果找到就打开该网页,如果找不到,则继续找Default.asp,如果仍找不到,继续往下找。若所有文件都没有找到,且又没有启用网站“目录浏览”,将提示错误“403 – 禁止访问: 访问被拒绝”。在这里添加index.asp文档,并将其上移到最上面。

image-20220320190021184

image-20220320190050104

启用Access支持。通讯录登记的后台数据库是Access,要在应用程序池中设置使其支持32位应用程序,这样才能支持Access数据库。单击图8-3中左侧列表栏中的“应用程序池”,在中间栏中可看到“通讯录登记”应用程序池,如图8-6所示。右键单击“通讯录登记”,选择“高级设置”。弹出“高级设置”对话框后,从“常规”项中找到“启用32位应用程序”,把值从False改成True,如图8-7所示。

image-20220320190411576

此时在内网计算机的IE浏览器中输入网址http://www.ntedu.com,即可打开通讯录登记网页,如下图所示。单击“查看已经提交的通讯录”,可以看到所有已经登记的用户。

image-20220322171055292

Winserver2016-DNS-Web2服务器上保持默认的Web页设置,即IIS的开始页。下面我们在10-1、Win10-2、Win10-3中的任一台计算机都可访问http://www.edu.cn和http://www.ntedu.cn。打开DOS命令窗口,分别ping这两个域名,输出信息如下所示:

image-20220324113215188

为Win10-1计算机配置静态的IPv6地址2001:DA8:1011:1001::2,然后启用“远程桌面”,在Win10-3计算机上通过远程桌面程序连接2001:DA8:1011:1001::2,然后输入用户名和密码,即可打开远程桌面,如下图所示。通过IPv6访问内网时,不需要做NAT静态映射,因此相当方便。

image-20220324113744317

这里我们还可以测试一下IPv4,在Win7、Win10-1、Win10-2、Win10-3中的任一台计算机上禁用IPv6协议,仍然可以访问http://www.edu.cn和http://www.ntedu.cn。打开DOS命令窗口,分别ping这两个域名,发现显示的是IPv4地址。

image-20220326103654745

至此,双栈配置完成。

3、隧道技术

隧道(Tunnel)是一种封装技术,它利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议;将其他协议产生的数据报文封装在自身的报文中,然后在网络中传输。隧道是一个虚拟的点对点的连接,一个Tunnel提供了一条使封装的数据报文能够传输的通路,并且在一个Tunnel的两端可以分别对数据报文进行封装及解封装。隧道技术就是指包括数据封装、传输和解封装在内的全过程,隧道技术是IPv6向IPv4过渡的一个重要手段。

前面我们讲过了,由于IPv4地址的枯竭和IPv6的先进性,IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性,所以需要对原有的IPv4设备进行替换。但是IPv4设备大量替换所需成本会非常巨大,且现网运行的业务也会中断,显然并不可行。所以,IPv4向IPv6过渡是一个渐进的过程。在过渡初期,IPv4网络已经大量部署,而IPv6网络只是散落在各地的“孤岛”,IPv6 over IPv4隧道就是通过隧道技术,使IPv6报文在IPv4网络中传输,实现IPv6网络之间的孤岛互连。隧道的技术种类是多样性的、下面我们一起来看一看:
通用路由封装(Generic Routing Encapsulation,GRE)隧道;
IPv6 in IPv4手动隧道;
IPv4兼容IPv6自动隧道;
6to4隧道;
ISATAP隧道;
6PE;
6over4;

3.1、GRE隧道

3.1.1、GRE Over IPv4(自动隧道)

在IPv6发展的初期阶段,存在被IPv4互联网分隔的IPv6孤岛;我们可以借助于GRE隧道来连通IPv6孤岛,如下图所示:

image-20220326105618591

GRE隧道分为手动隧道和自动隧道两种模式。GRE隧道虽然通用性好,易于理解。但是GRE隧道是手动隧道,每个隧道都需要手动配置。试想一下,如果一个IPv6孤岛要与很多IPv6孤岛相连,就需要手动建立多条隧道。如果多个IPv6孤岛彼此间都要互连,那么管理员配置和维护GRE隧道的难度将陡增。

手动隧道:手动隧道即边界设备不能自动获得隧道终点的IPv4地址,需要手工配置隧道终点的IPv4地址,报文才能正确发送至隧道终点。
自动隧道:自动隧道即边界设备可以自动获得隧道终点的IPv4地址,所以不需要手工配置终点的IPv4地址,一般的做法是隧道的两个接口的IPv6地址采用内嵌IPv4地址的特殊IPv6地址形式,这样路由设备可以从IPv6报文中的目的IPv6地址中提取出IPv4地址。

image-20220328200741969

下面我们来测试一下在GRE隧道上实现IPv6孤岛互联。测试拓扑如上图,我们可以看到R1和R2之间是纯IPv6网络;R2、R3和R4之间是纯IPv4网络,R4和R5之间是纯IPv6网络。R1和R5是纯IPv6路由器,R3是纯IPv4路由器,R2和R4是双栈路由器。在R2和R4之间建立一条GRE隧道,R1和R5之间的纯IPv6流量被封装在IPv4协议中,数据包流经路由器R3时,R3只查看最外层的IPv4报头,并转发数据包到下一跳路由器,由此实现了IPv6流量跨IPv4网络的传输。基础配置信息如下:

R1路由器的配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R1
R1(config)#ipv6 unicast-routing 
R1(config)#int eth0/0
R1(config-if)#ipv6 add 2001:1::1/64
R1(config-if)#no shutdown 
R1(config-if)#exit
R1(config)#ipv6 route ::/0 2001:1::2
R1(config)#end
R1#wr

R2路由器的配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R2
R2(config)#ipv6 unicast-routing 
R2(config)#int eth0/0
R2(config-if)#ipv6 add 2001:1::2/64
R2(config-if)#no shutdown 
R2(config-if)#int eth0/1
R2(config-if)#ip add 23.1.1.2 255.255.255.0
R2(config-if)#no shutdown 
R2(config-if)#exit
R2(config)#ip route 34.1.1.0 255.255.255.0 23.1.1.3
R2(config)#end
R2#wr

R3路由器的配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R3
R3(config)#int eth0/0
R3(config-if)#ip add 23.1.1.3 255.255.255.0
R3(config-if)#no shutdown 
R3(config-if)#int eth0/1
R3(config-if)#ip add 34.1.1.3 255.255.255.0
R3(config-if)#no shutdown 
R3(config-if)#end
R3#wr

R4路由器的配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R4
R4(config)#ipv6 unicast-routing 
R4(config)#int eth0/0
R4(config-if)#ip add 34.1.1.4 255.255.255.0
R4(config-if)#no shutdown 
R4(config-if)#int eth0/1
R4(config-if)#ipv6 add 2001:2::1/64
R4(config-if)#no shutdown 
R4(config-if)#exit
R4(config)#ip route 23.1.1.0 255.255.255.0 34.1.1.3 
R4(config)#end
R4#wr

R5路由器的配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R5
R5(config)#ipv6 unicast-routing 
R5(config)#int eth0/0
R5(config-if)#ipv6 add 2001:2::2/64
R5(config-if)#no shutdown 
R5(config-if)#exit
R5(config)#ipv6 route ::/0 2001:2::1
R5(config)#end
R5#wr

基础信息配置完成以后我们开始配置GRE隧道、R2的配置信息如下:

R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 创建隧道接口tunnel 0
R2(config)#int tunnel 0
# 隧道接口的源IP地址是23.1.1.2
R2(config-if)#tunnel source 23.1.1.2         
# 隧道接口的目标IP地址是34.1.1.4,要求路由可达
R2(config-if)#tunnel destination 34.1.1.4
# 为隧道接口配置IPv6地址
R2(config-if)#ipv6 add 2001:3::1/64
# 隧道的类型是GRE over IPv4
R2(config-if)#tunnel mode gre ip
R2(config-if)#exit
# 让去往2001:2::/32网段的IPv6路由经由隧道传输
R2(config)#ipv6 route 2001:2::/32 2001:3::2
R2(config)#end
R2#wr

R4的GRE隧道配置信息如下:

R4#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R4(config)#int tunnel 0
# R2隧道接口的目标地址,这里是源IP地址,隧道两端接口的源IP地址和目标IP地址相反
R4(config-if)#tunnel source 34.1.1.4
R4(config-if)#tunnel destination 23.1.1.2
R4(config-if)#ipv6 add 2001:3::2/64
R4(config-if)#tunnel mode gre ip
R4(config-if)#exit
# 让去往2001:1::/32网段的IPv6路由经由隧道传输
R4(config)#ipv6 route 2001:1::/32 2001:3::1
R4(config)#end
R4#wr

配置完成以后我们再R1上ping R5路由器的IPv6地址,如果可以ping通;就说明IPv6的流量穿越了IPv4网络(本实验中的R3路由器是纯IPv4网络)。测试信息如下:

R1#ping 2001:2::2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:2::2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/7/32 ms
R1#ping 2001:2::2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:2::2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R1#

好奇的同学可能就要问了、R1去往R5的IPv6报文是如何传递的呢?R1的ping包到达R2,R2查找路由表得知去往2001:2::2的数据包要通过隧道接口,该数据包被送往隧道接口进行封装。这里我们可以通过抓包来分析一下数据包的详细情况。下图是我们在路由器R3的E0/0接口上捕获的数据包。当前显示的这个数据包是R1去往R5的ping包,为了方便讲解,我们在下图中添加了编号。

image-20220328203632553

编号1是帧的基本信息描述,比如帧的字节数。

编号2是TCP/IP参考模型的第一层,即网络访问层。这里是Ethernet Ⅱ(以太网类型Ⅱ)的帧,因为是以太网,所以会有数据帧的源和目标MAC地址。

编号3是TCP/IP参考模型的第二层,即网络层,这里的源和目标IP地址是隧道的两端IP地址。

编号4是GRE协议。

编号5是IPv6数据报头,源IPv6地址是R1的地址,目标IPv6地址是R5的地址。

编号6是ICMPv6的报文。

当然、如果还是觉得很难懂;我们还可以把上面的数据包抽象城下图的样子。。对路由器R3来说,把“GRE报头+ IPv6报头+IPv6有效数据”作为IPv4的有效数据,只要根据IPv4报头就可以实现正常的数据包转发了。

image-20220328204936090

路由器R4收到数据包后将其解封装,得到IPv6报头+IPv6有效数据。由于R4是双栈路由器,因此会根据IPv6报头转发数据包。R5向R1返回数据包的过程也是按照“隧道起点封装→IPv4网络中的路由→隧道终点解封装”进行的。

3.1.2、IPv6 in IPv4(手动隧道)

IPv6 in IPv4手动隧道也可以称为IPv6 over IPv4手动隧道,是把IPv6报文直接封装到IPv4报文中去。IPv6 in IPv4手动隧道比GRE隧道少了一层封装协议,如下图所示。

image-20220330140448976

IPv6 in IPv4手动隧道与GRE隧道一样,也是需要手动配置每一条隧道,且配置命令与GRE隧道的配置命令基本一样,区别就是改变隧道的封装协议。我们以前面的GRE over IPv4实验为例,针对R2路由器的配置进行改动。原GRE隧道的配置如下:

# 隧道的类型是GRE over IPv4
R2(config-if)#tunnel mode gre ip 

在IPv6 in IPv4手动隧道中,只需把上面的隧道封装模式做如下改动:

# 隧道的类型是IPv6 over IPv4
R2(config-if)#tunnel mode ipv6ip 
3.1.3、GRE Over IPv6

在IPv6发展的后期阶段,需要在IPv6互联网上建立隧道来传输IPv4的流量,以解决IPv4孤岛问题,如下图:

image-20220328205706484

下面我们来测试一下在GRE隧道上实现IPv4孤岛互联。测试拓扑如下图,R1和R2之间是纯IPv4网络,R2、R3和R4之间是纯IPv6网络,R4和R5之间是纯IPv4网络。R1和R5是纯IPv4路由器,R3是纯IPv6路由器,R2和R4是双栈路由器。在R2和R4之间建立一条GRE隧道,R1和R5之间的纯IPv4流量被封装在IPv6协议中,数据包流经路由器R3时,R3只查看最外层的IPv6报头,并转发数据包到下一跳路由器,由此实现了IPv4流量跨IPv6网络的传输。路由器基本配置信息如下:

image-20220328210000021

R1路由器基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R1
R1(config)#int e0/0
R1(config-if)#ip add 12.1.1.1 255.255.255.0
R1(config-if)#no shutdown 
R1(config-if)#exit
R1(config)#ip route 0.0.0.0 0.0.0.0 12.1.1.2 
R1(config)#end
R1#wr

R2路由器基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R2
R2(config)#ipv6 unicast-routing 
R2(config)#int e0/0
R2(config-if)#ip add 12.1.1.2 255.255.255.0
R2(config-if)#no shutdown 
R2(config-if)#int eth0/1
R2(config-if)#ipv6 add 2001:1::1/64
R2(config-if)#no shutdown 
R2(config-if)#exit
R2(config)#ipv6 route 2001:2::/32 2001:1::2
R2(config)#end
R2#wr

R3路由器基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R3
R3(config)#ipv6 unicast-routing 
R3(config)#int e0/0
R3(config-if)#ipv6 add 2001:1::2/64
R3(config-if)#no shutdown 
R3(config-if)#int e0/1
R3(config-if)#ipv6 add 2001:2::1/64
R3(config-if)#no shutdown 
R3(config-if)#end
R3#wr

R4路由器基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R4
R4(config)#ipv6 unicast-routing 
R4(config)#int e0/0
R4(config-if)#ipv6 add 2001:2::2/64
R4(config-if)#no shutdown 
R4(config-if)#int e0/1
R4(config-if)#ip add 45.1.1.4 255.255.255.0
R4(config-if)#no shutdown 
R4(config-if)#exit
R4(config)#ipv6 route 2001:1::/32 2001:2::1
R4(config)#end
R4#wr

R5路由器基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R5
R5(config)#int e0/0
R5(config-if)#ip add 45.1.1.5 255.255.255.0
R5(config-if)#no shutdown 
R5(config-if)#exit
R5(config)#ip route 0.0.0.0 0.0.0.0 45.1.1.4
R5(config)#end
R5#wr

基础信息配置完成以后我们开始配置GRE隧道,R2的配置信息如下:

R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 创建隧道接口tunnel 0
R2(config)#int tunnel 0
# 隧道接口的源IPv6地址是2001:1::1
R2(config-if)#tunnel source 2001:1::1
# 隧道接口的目标IP地址是2001:2::2,要求IPv6路由可达
R2(config-if)#tunnel destination 2001:2::2
# 为隧道接口配置IPv4地址
R2(config-if)#ip add 24.1.1.2 255.255.255.0
# 隧道的类型是GRE over IPv6
R2(config-if)#tunnel mode gre ipv6
R2(config-if)#exit
# 让去往45.1.1.10网段的IPv4路由经由隧道传输
R2(config)#ip route 45.1.1.0 255.255.255.0 24.1.1.4
R2(config)#end
R2#wr

R4配置信息如下:

R4#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R4(config)#int tunnel 0
# R2隧道接口的目标地址,这里是源IPv6地址,隧道两端接口的源和目标IPv6地址相反
R4(config-if)#tunnel source 2001:2::2
R4(config-if)#tunnel destination 2001:1::1
R4(config-if)#ip add 24.1.1.4 255.255.255.0
R4(config-if)#tunnel mode gre ipv6
R4(config-if)#exit
R4(config)#ip
R4(config)#ip route 12.1.1.0 255.255.255.0 24.1.1.2
R4(config)#end
R4#wr

配置完成以后我们在R1上上ping R5路由器的IPv4地址,可以ping通。IPv4的流量穿越了IPv6网络(该实验中的R3路由器是纯IPv6网络)。对路由器R3来说,把“GRE报头+IPv4报头+IPv4有效数据”作为IPv6的有效数据,只要根据IPv6报头就可以实现正常的数据包转发了,如下图。

R1#ping 45.1.1.4 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 45.1.1.4, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/8/29 ms
R1#ping 45.1.1.5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 45.1.1.5, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R1#
3.1.4、IPv4客户端使用PPTP VPN隧道访问IPv6网络

前面我们使用双栈解决了用户访问IPv4网络和IPv6网络的问题,在有些情况下可能不具备配置双栈的条件。比如在下图中,一个出差在外的员工想要访问公司的IPv6网络(公司网络是双栈接入),但他当前只能访问IPv4网络,此时就可以通过VPN接入公司,获取IPv6地址,然后再访问IPv6网络。同时,公司内网中也有些区域不支持IPv6,比如三层交换机不支持IPv6,内网中的用户也可以通过VPN连接到内网中的VPN服务器获得IPv6地址,然后使用IPv6服务。

image-20220328215548357

下面我们来搭建实验测试拓扑,我们在前面配置IPv6双栈实验的基础上进行继续测试,实验拓扑如下图。为了节省资源,关闭不用的Win10-1和Win10-2计算机。添加1台Windows Server 2016计算机用来提供VPN服务,它的IPv4地址是10.2.2.3/24,IPv6地址是2001:da8:1011:2002::3/64。HillStoneSG6000V6是公司的出口防火墙,有双栈接入。内网中的Win7禁用IPv6协议,它通过连接VPN来获得IPv6服务。外网中的Win10-3禁用IPv6协议,用来模拟出差在外的IPv4客户,它通过连接公司的VPN服务器获得IPv6服务。

image-20220328220201561

我们首先在防火墙上配置端口映射,把公网IPv4地址的点对点隧道协议(Point to Point Tunneling Protocol,PPTP)服务映射到内网VPN服务器(10.2.2.3)的1723端口,如下图所示;PPTP服务默认使用的是TCP 1723端口。

image-20220328223356113

端口映射配置完成以后我们开始配置访问策略,允许外网访问IPv4地址为218.1.1.2的GRE和PPTP服务,如下图所示。

image-20220328223638258

我们还要把VLAN和IPv6路由配置完成,Switch-2的配置信息如下:

Switch-2>en
Switch-2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch-2(config)#int e1/1
Switch-2(config-if)#sw mode acc
# 把VPN服务器划入VLAN 2
Switch-2(config-if)#sw acc vlan 2
Switch-2(config-if)#exit
# 在IPv4 VPN中,VPN用户可以使用VPN服务器所在网段的IPv4地址,但在IPv6 VPN中,VPN用户不能使用VPN服务器所在网段的IPv6地址;
# 需要另分一段,本实验中计划分配的是2001:da8:1011:2008::/64这段IPv6地址,所以需要在三层交换机上配置路由;
# 把去往2001:da8:1011:2008::/64网段的IPv6路由发往VPN服务器(2001:da8:1011:2002::3)
Switch-2(config)#ipv6 route 2001:da8:1011:2008::/64 2001:da8:1011:2002::3   
Switch-2(config)#end
Switch-2#wr

数通部分配置完成以后我们开始配置VPN服务器。我们需要为VPN服务器配置IPv4和IPv6地址;然后添加服务器角色。在Winserver-VPN服务器上运行“添加角色
和功能向导”,在“选择服务器角色”界面中选中“远程访问”,如下图所示。此时系统可能会提示“此计算机和目标服务器或VHD之间可能存在版本不匹配的问题”,不用理会,单击“下一步”按钮。

image-20220328224313818

接下来为远程访问选择角色服务,如下图所示,选中“DirectAccess和VPN(RAS)”和“路由”复选框,在弹出的“添加路由所需功能”对话框中,单击“添加功能”并返回,继续“下一步”,开始安装“远程访问”功能。

image-20220328224356703

开始配置“路由和远程访问”。在“服务器管理器”窗口中,单击菜单“工具”→“路由和远程访问”,打开“路由和远程访问”窗口,如下图所示。

image-20220328230810408

运行“路由和远程访问服务器安装向导”。在上图左侧栏的计算机名上单击鼠标右键,选择“配置并启用路由和远程访问”,弹出“路由和远程访问服务器安装向导”后,单击“下一步”按钮。

“路由和远程访问服务器安装向导”接下来询问要启用下列哪些服务,用户也可以自定义配置,如图8-29所示。第一个选项是配置“远程访问(拨号或VPN)”,但需要服务器上配有两块网卡,本实验的VPN服务器是旁路型VPN,只配有一块网卡,因此不适合这个选项。第二个选项是配置“网络地址转换”,一般用在出口,可以替代防火墙或路由器来提供NAT服务。第三个选项是配置“虚拟专用网络(VPN)访问和NAT”。第四个选项是“两个专用网络之间的安全连接”,相当于路由器的功能。最后一个选项是“自定义配置”,需要手动来配置,比如,在服务器只有一块网卡的情况下,如果希望把服务器配置成VPN服务器,就需要手动配置。本实验选择“自定义配置”,单击“下一步”按钮。

image-20220328230910455

安装向导接下来会询问自定义配置要启用哪些服务,如下图所示。这里选择“VPN访问”和“LAN路由”复选框,单击“下一步”按钮,完成安装向导的配置。

image-20220328230956799

安装向导完成后,会提示是否启动服务。单击“启动服务”,启动VPN服务。自定义配置VPN其他选项。VPN向导完成后,还需要一些手动配置,在计算机名上单击鼠标右键,在弹出的快捷菜单中选择“属性”,如下图所示。

image-20220328231102451

在VPN属性的“常规”选项卡下,选中“IPv6路由器”复选框以及该复选框下的“局域网和请求拨号路由”单选按钮,选中“IPv6远程访问服务器”复选框,如下图所示。

image-20220328231134072

在VPN属性的“IPv4”选项卡中,选择“静态地址池”,然后单击“添加”按钮,起始IP地址(从)填入10.2.2.240,结束IP地址(到)填入10.2.2.250,第一个IP地址10.2.2.240被VPN服务器占用,除此之外还有10个IP地址可用,可以满足10个VPN用户的接入。这11个IP地址既然被VPN使用,在局域网环境中就不要再使用了。这里也可以分配局域网中没有使用的另一段IP地址,但需要在三层交换机上配置路由,把这段IP地址段的路由指向VPN服务器。配置完成后的界面如下图所示。

image-20220328231226086

在VPN属性的“IPv6”选项卡中,在“IPv6前缀分配”中填入2001:da8:1011:2008::,如下图所示。前面已经解释过,VPN用户分配的IPv6地址前缀不能与本地网段相同,所以这里另外配置了一段,并在三层交换机上把这段路由指向VPN服务器。

image-20220328231313979

VPN属性配置完成后,单击“确定”按钮,提示需要重新启路由器,如下图所示。单击“是”按钮,重启“路由和远程访问”服务。

image-20220328231327856

好了、现在我们来建立VPN用户。在VPN服务的“服务器管理器”窗口中,单击菜单“工具”→“计算机管理”→“本地用户和组”→“用户”,新建一个test用户。然后编辑该用户属性,在“拨入”选项卡的“网络访问权限”中选择“允许访问”,如下图所示。

image-20220328231657556

配置完成以后我们开始进行测试,。Win7是内网中的一台计算机,用来模拟没有IPv6接入的情况,在配置并启用VPN后可以使用IPv6。我们首先需要禁用IPv6协议,在网卡的本地连接属性中,取消选中IPv6。然后建立VPN连接,在状态栏的网络图标上右键单击,选择“打开网络和共享中心”,然后打开“网络和共享中心”窗口,如下图所示。

image-20220328231724083

单击“设置新的连接或网络”链接,打开“设置连接或网络”配置向导,选择“连接到工作区”,如下所示。

image-20220328231816602

单击“下一步”按钮,在接下来出现的“您想如何连接”对话框中选择“使用我的Internet连接(VPN)”。配置向导继续问“您想在继续之前设置Internet连接吗?”,这里选择“我将稍后设置Internet连接”。配置向导询问要连接的Internet地址,也就是询问VPN服务器的IP地址,这里输入10.2.2.3,如下图所示;单击“下一步”按钮。

image-20220328231907262

接下来要“键入您的用户名和密码”,也就是VPN服务器上刚才配置的test用户和对应的密码。单击“创建”按钮,完成VPN连接的创建。我们继续在Win7计算机上进行测试,我们在DOS命令行窗口中输入ipconfig命令,确认当前只有IPv4的IP地址。双击“VPN连接”图标,打开右下角网络中心,打开“VPN连接”对话框,如下图所示。单击“连接”按钮,稍后提示VPN连接成功。

image-20220328232628299

打开DOS命令行,执行ipconfig命令,显示如图8-42所示。可以看到多出一个“PPP适配器VPN连接”,被分配了IPv4地址10.2.2.243和前缀是“2001:da8: 1011:2008::”的IPv6地址,这个前缀是在前面的VPN服务器中指定的。

image-20220328232731354

我们继续测试IPv6和IPv4的连通性,在DOS窗口中分别执行tracert –d www.edu.cn和tracert -d 218.1.2.3命令,显示如下图所示。www.edu.cn这个域名分别对应了IPv4地址218.1.2.3和IPv6地址2001:2:8,这里显示的IPv6地址证明在默认情况下优选IPv6。IPv6第一跳对应的IPv6地址是VPN服务器上“PPP适配器RAS(Dial In)Interface”虚接口的IPv6地址,可以在VPN服务器上使用ipconfig命令验证;第二跳是VPN服务器所在VLAN接口的IPv6网关;最后显示到2001:2::8可达。

image-20220328232830901

IPv4第一跳对应的IPv4地址是VPN服务器上“PPP适配器RAS(DialIn)Interface”虚接口的IPv4地址,可以在VPN服务器上使用ipconfig命令验证;第二跳是VPN服务器所在VLAN接口的IPv4网关;最后显示到218.1.2.3可达。

内网测试正常之后我们开始测试外网链接,Win10-3是外网中的一台计算机,用来模拟没有IPv6接入的情况,在配置并启用VPN后可以使用IPv6。我们首先要禁用IPv6协议,在网卡的本地连接属性中,取消选中IPv6。然后建立VPN连接。在Win10-3上建立VPN连接的方式与Win7大致相同,这里不详细演示。配置完按成以后我们开始测试,在Win10-3计算机的DOS命令行窗口中输入ipconfig命令,确认当前只有IPv4的IP地址。双击“VPN连接”图标,打开“连接VPN连接”对话框,;单击“连接”按钮,稍后提示VPN连接成功。打开DOS命令行,执行ipconfig命令,显示如下图所示。可以看到多出一个“PPP适配器VPN连接”,被分配了IPv4地址10.2.2.245和前缀是“2001:da8:1011:2008::”的IPv6地址,这个前缀是在前面的VPN服务器中指定的。

image-20220328233624053

继续测试IPv6和IPv4的连通性。在DOS窗口中分别执行tracert –d www.edu.cn和tracert -d 10.2.2.2命令,显示如下图所示。Win10-3虽没有IPv6接入,但经过VPN进入公司网络后,也可以使用IPv6访问内外网的IPv6服务。无论员工以后去哪儿出差,也不用担心没有IPv6接入了。

image-20220328233724313

经过VPN连接后,Win10-3到内网的IPv4地址(比如10.2.2.2)也直接可达了。

但是现在有一个问题、。计算机默认的是IPv6地址优先,能不能改成IPv4地址优先呢?当然可以,在前面的双栈实验中、我们调整双栈计算机IPv4和IPv6的优先,前缀策略表在VPN的环境下同样有效。这里简单演示一下效果,在实际使用中建议保持默认的IPv6优先。在Win10-3计算机的管理员命令窗口中执行netsh interface ipv6 show prefixpolicies命令,显示前缀策略项,如下图所示。

image-20220328234014244

然后执行netsh interface ipv6 set prefixpolicy::ffff:0.0.0.0/96 100 0 active命令修改前缀策略项后,再次查看前缀策略项,然后测试域名解析,发现此时是IPv4优先了,显示如下图所示。

image-20220328234207009

这里配置的IPv4优先仅在计算机重启前有效,若想一直有效,需要把参数active替换成persistent(也可以不加参数,此时默认的就是persistent)。

注:这里需要说明一下在修改优先级 :: ffff:0:0/96 >= 40 时 服务器优先使用IPv4地址(这里我们按照文档设定为100)。

3.1.5、IPv6客户端使用L2TP VPN访问IPv4网络

在前面的实验中IPv4用户借助于PPTP VPN通过IPv4互联网连接到公司,进而获得IPv6地址,访问IPv6网络中的服务。在IPv6发展的后期阶段,只有IPv6互联网,IPv4网络则成为孤岛。下面我们将继续演示如何通过IPv6互联网连接到公司,获得IPv4地址,进而访问公司内或外的IPv4网络上的服务。

这里我们不再单独创建实验拓扑、我们继续使用前面的实验拓扑进行测试。只是互联网变成了IPv6互联网,且Win10-3只配置IPv6地址。我们先来配置外网防火墙,L2TP/IPSec VPN涉及的协议有:第二层隧道协议(Layer 2 Tunneling Protocol, L2TP,使用的是UDP的1701端口)、Internet安全协议(Internet Protocol Security,IPSec,使用的是封装安全负载[Encapsulated Security Payload,ESP]和认证头部[Authentication Header,AH]协议)、Internet密钥交换协议(Internet key exchange,IKE,使用的是UDP的500和4500端口)。在防火墙上配置策略,允许外网IPv6地址访问VPN服务器(IPv6地址是2001:da8:1011:2002::3)的IKE、L2TP、IPSec服务,如下图所示。PPTP VPN使用的是TCP的1723端口,L2TP/IPSec VPN使用的是UDP协议。有些时候,尤其是不清楚防火墙配置且PPTP VPN不成功的情况下,可以换为L2TP/IPSec VPN进行尝试。

image-20220329204033426

然后我们开始配置VPN客户端,Win10-3充当IPv6的VPN客户端。首先我们要禁用IPv4协议,在网卡的本地连接属性中,取消选中IPv4。然后我们开始建立VPN连接,方法与前面相同,只不过Internet地址中填入的是VPN服务器IPv6的地址“2001:da8:1011:2002::3”。3.编辑VPN属性。右键单击新建的“VPN连接2”,从快捷菜单中选择“属性”,打开“VPN连接2属性”对话框,选择“安全”选项卡,如下图所示。

image-20220329204420458

单击“VPN类型”下拉列表,选择“使用IPSec的第2层隧道协议(L2TP/IPSec)”选项。通过对比前面建立的VPN连接可以发现,前面建立的VPN连接下拉列表中有“点到点隧道协议(PPTP)”,而这里没有。由于不支持PPTP,所以只好选L2TP了。单击上图中的“高级设置”按钮,弹出“高级属性”对话框,选择“使用预共享的密钥作身份验证”单选按钮,并在“密钥”中输入“cisco@123”,如下图所示。该密钥要与VPN服务器中的配置一致。单击“确定”按钮,完成VPN客户端的配置。

image-20220329204443983

客户端配置完成以后我们开始配置VPN服务器,打开“路由和远程访问”窗口,在计算机名上单击鼠标右键,在弹出的快捷菜单中选择“属性”,打开VPN属性配置对话框,选择“安全”选项卡,如下图所示。选中“允许L2TP/IKEv2连接使用自定义IPsec策略”复选框,并在“预共享的密钥”中输入“cisco@123”(与VPN客户中输入的密钥保持一致),单击“确定”按钮,完成VPN服务器的设置。

image-20220329204631218

Win10-3是外网中的一台计算机,用来模拟没有IPv4接入的情况,在配置并启用VPN后可以使用IPv4。我们先禁用Win10-3的IPv4协议,在网卡的本地连接属性中,取消选中IPv4。然后建立VPN连接,双击刚建立的“VPN连接2”,稍后VPN连接成功。连接成功之后在Win10-3计算机的DOS命令行窗口中输入ipconfig命令,显示如下图所示。可以看到多出一个“PPP适配器VPN连接2”,它被分配了IPv4地址10.2.2.244和前缀是“2001:da8:1011:2008::”的IPv6地址。ping内网的10.2.2.2服务器,发现可以ping通;IPv6的VPN客户端可以访问IPv4服务了。

image-20220330140051141

至此,IPv4客户端可以使用PPTP VPN隧道访问IPv6网络,也可以使用L2TP/IPSec VPN隧道访问IPv6网络。IPv6客户端可以使用L2TP/IPSec VPN隧道访问IPv4网络。由于IPv6客户端的VPN属性中没有PPTP选项,只能使用L2TP/IPSec VPN。这两个实验在IPv6过渡期间非常有实用价值,尤其在员工经常出差在外时,可以通过这种方式使用IPv4或IPv6访问公司内外的IPv6或IPv4网络,很是方便。

3.3、6to4隧道

前面介绍的GRE隧道、IPv6 in IPv4隧道都是手动隧道,每条隧道都需要单独建立和维护。下面我们介绍一种新的隧道技术:6to4隧道。6to4隧道是一种自动隧道,它使用内嵌在IPv6地址中的IPv4地址建立,其IPv6地址格式如下图所示。6to4隧道是自动建立隧道,因此维护方便。6to4隧道的缺点是必须使用规定的6to4地址格式。为了使用标准IPv6网络访问6to4网络,需要将6to4具体路由通告到IPv6网络中,而一般管理员的权限不够,只能通告到有限的IPv6网络中。假如管理员有权限,可以把6to4具体路由注入IPv6骨干网中,但众多明细的6to4具体路由条目会破坏IPv6路由的全球可聚合性,这限制了6to4隧道的使用。

image-20220330142145290

FP:可聚合全球单播地址的格式前缀(format prefix),其值为001。
TLA:顶级聚集符(top level aggregator),其值为0x0002。
IPv4地址:转换成十六进制的IPv4地址,占32位。
SLA ID:站点级聚集符(site level aggregator)ID。
接口ID:接口标识符,占位64位。

6to4地址可以表示为2002::/16,接下来的32位是IPv4地址,这样前48位固定了。接下来的16位SLA是用户可以自定义的。比如用户6to4网络内部有多个网段,前48位相同,接下来的16位不同,可用于区分不同的网段。

6to4隧道的封装与IPv6 in IPv4报文封装示意图一样,只不过隧道的建立是动态的。6to4路由器或主机根据要访问的目标IPv6地址(6to4地址),从中取出17~48位将其转换成IPv4地址。6to4路由器或主机用自己的公网IPv4地址作为隧道源地址,用目标公网IPv4地址作为目标地址,建立IPv4隧道,在隧道内传输IPv6数据。

在下图中,若是配置IPv6 in IPv4手动隧道,那么在全互联的情况下每台路由器需配置3条隧道,虽然配置复杂些,但路由器还是可以配置的,而一般计算机根本就不支持IPv6 in IPv4手动隧道配置,可以给一般计算机配置6to4隧道。

image-20220330143456732

6to4网络采用了特殊的IPv6地址格式,若是与标准IPv6网络相连,需要配置6to4中继路由器。

下面我们开始通过实验来测试6to4网络,实验拓扑如下图所示。路由器R3、R4、R5、R7和计算机Win10组成一个IPv4骨干网。R1、R2和R6是6to4网络中的普通路由器。R3和R5是6to4路由器,把6to4网络和IPv4网络相连。R7是6to4中继路由器,把6to4网络和标准IPv6网络相连,Win10是一台配置6to4的计算机。

image-20220330144215728

路由器R3只有一个公网IPv4地址34.1.1.3,只能用于一个6to4隧道的源地址。R3连接了2段内部网段(这里用R1和R2来表示),并通过使用6to4地址中的SLA ID来区分,即2002:2201:0103:1::/64和2002:2201:0103:2::/64。其中2002是6to4地址的前缀,34.1.1.3l转换成十六进制是2201:0103,接下来的1和2就是SLA ID,用来区分内部的不同网段。访问外部IPv6时,这两个网段共用一个隧道。路由器R5的公网IPv4地址是45.1.1.5,6to4的IPv6地址前缀是2002:2d01:0105,SLA ID为1(随意取的),完整6to4的IPv6地址前缀是2002:2d01:0105:1::/64。

路由器R7连接的是标准IPv6网络,其他6to4网络通过R7访问标准IPv6网络,R7也称为6to4中继路由器。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,这个下一跳路由器称为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地址中获得。6to4中继路由器可以解决普通IPv6网络与6to4网络通过IPv4网络的互通问题。

Win10是一台具有公网IPv4地址的计算机,IPv4地址是211.1.1.2,对应的6to4 IPv6地址前缀是2002:D301:0102::/48。讲了这么多,下面我们采用6to4隧道配置技术来完成上图中所有IPv6网络之间的互通。配置和测试步骤如下:

我们首先来配置所有设备的IPv4和IPv6地址,R1的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R1 
R1(config)#ipv6 unicast-routing 
R1(config)#int e0/0
R1(config-if)#ipv6 add 2002:2201:0103:1::2/64
R1(config-if)#no shut
R1(config-if)#exit
R1(config)#ipv6 route ::/0 2002:2201:0103:1::1
R1(config)#end
R1#wr

R2的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R2
R2(config)#ipv6 unicast-routing 
R2(config)#int e0/0
R2(config-if)#ipv6 add 2002:2201:0103:2::2/64
R2(config-if)#no shut
R2(config-if)#exit
R2(config)#ipv6 route ::/0 2002:2201:0103:2::1
R2(config)#end
R2#wr

R3的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R3
R3(config)#ipv6 unicast-routing
R3(config)#int e0/0
R3(config-if)#ipv6 add 2002:2201:0103:1::1/64
R3(config-if)#no shut
R3(config-if)#int e0/1
R3(config-if)#ipv6 add 2002:2201:0103:2::1/64
R3(config-if)#no shut
R3(config-if)#int e0/2
R3(config-if)#ip add 34.1.1.3 255.255.255.0
R3(config-if)#no shut
R3(config-if)#exit
R3(config)#ip route 0.0.0.0 0.0.0.0 34.1.1.4
R3(config)#end
R3#wr

R4的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R4
R4(config)#int e0/0
R4(config-if)#ip add 34.1.1.4 255.255.255.0
R4(config-if)#no shut
R4(config-if)#int e0/1
R4(config-if)#ip add 45.1.1.4 255.255.255.0
R4(config-if)#no shut
R4(config-if)#int e0/2
R4(config-if)#ip add 47.1.1.4 255.255.255.0
R4(config-if)#no shut
R4(config-if)#int e0/3
R4(config-if)#ip add 211.1.1.1 255.255.255.0
R4(config-if)#no shut
R4(config-if)#exit
R4(config)#
R4(config)#end
R4#wr

R5的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R5
R5(config)#ipv6 unicast-routing
R5(config)#int e0/0
R5(config-if)#ip add 45.1.1.5 255.255.255.0
R5(config-if)#no shut
R5(config-if)#int e0/1
R5(config-if)#ipv6 add 2002:2d01:0105:1::1/64
R5(config-if)#no shut
R5(config-if)#exit
R5(config)#ip route 0.0.0.0 0.0.0.0 45.1.1.4
R5(config)#
R5(config)#end
R5#wr

R6的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R6
R6(config)#ipv6 unicast-routing
R6(config)#int e0/0
R6(config-if)#ipv6 add 2002:2d01:0105:1::2/64
R6(config-if)#no shut
R6(config-if)#exit
R6(config)#ipv6 route ::/0 2002:2d01:0105:1::1
R6(config)#end
R6#wr

R7的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R7
R7(config)#ipv6 unicast-routing
R7(config)#int e0/0
R7(config-if)#ip add 47.1.1.7 255.255.255.0
R7(config-if)#no shut
R7(config-if)#int e0/1
R7(config-if)#ipv6 add 2001:1::1/64
R7(config-if)#no shut
R7(config-if)#exit
R7(config)#ip route 0.0.0.0 0.0.0.0 47.1.1.4
R7(config)#end
R7#wr

R8的基本配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R8
R8(config)#ipv6 unicast-routing
R8(config)#int e0/0
R8(config-if)#ipv6 add 2001:1::2/64
R8(config-if)#no shut
R8(config-if)#exit
R8(config)#ipv6 route ::/0 2001:1::1
R8(config)#end
R8#wr

注:Win10计算机的IP地址是211.1.1.2,网关IP地址是211.1.1.1。

基础配置完成以后我们开始配置6to4隧道,首先是R3路由器、配置信息如下:

R3#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 创建隧道接口
R3(config)#int tunnel 0
# 隧道源地址是路由器的公网IPv4地址
R3(config-if)#tunnel source 34.1.1.3
# 隧道的模式是6to4隧道
R3(config-if)#tunnel mode ipv6ip 6to4
# 隧道接口的IP地址,这个IPv6地址要满足6to4的IPv6地址前缀,SLA ID可以随意取值,这里取最小的值0
R3(config-if)#ipv6 add 2002:2201:0103:0::1/64
R3(config-if)#exit
# 配置路由,让去往6to4的IPv6地址(也就是2002::/16前缀的地址)的路由通过隧道接口传输
R3(config)#ipv6 route 2002::/16 tunnel 0
# 配置其他标准IPv6路由。由于网络中还有其他标准IPv6地址,所以这里需要配置具体路由(简单考虑,这里直接配了默认路由);
# 如果网络中有多个标准IPv6网络以及多个6to4中继路由器,这里就需要添加具体路由了;
# 2002:2f01:0107:0::1是6to4中断路由器的隧道接口IPv6地址,这里是R7路由器6to4隧道接口的IPv6地址。
R3(config)#ipv6 route ::/0 2002:2f01:0107:0::1
R3(config)#end
R3#wr

R5路由器的配置信息如下:

R5#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R5(config)#int tunnel 0
R5(config-if)#tu source 45.1.1.5
R5(config-if)#tunnel mode  ipv6ip ?
  6rd     IPv6 automatic tunnelling using 6rd
  6to4    IPv6 automatic tunnelling using 6to4
  isatap  IPv6 automatic tunnelling using ISATAP
  <cr>

R5(config-if)#tunnel mode  ipv6ip 6to4
R5(config-if)#ipv6 add 2002:2d01:0105:0::1/64
R5(config-if)#exit
R5(config)#ipv6 route 2002::/16 tunnel 0
R5(config)#ipv6 route ::/0 2002:2f01:0107:0::1
R5(config)#end
R5#wr

R7的配置信息如下:

R7#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R7(config)#int tunnel 0
R7(config-if)#tu source 47.1.1.7
R7(config-if)#tu mode ipv6ip 6to4
# 隧道接口的IP地址,这个IPv6地址要满足6to4的IPv6地址前缀,SLA ID可以随意取值,这里取最小的值0
R7(config-if)#ipv6 add 2002:2f01:0107:0::1/64
R7(config-if)#exit
# 仅配置6to4 IPv6地址的路由(当然也可以配置默认路由),因为这个标准IPv6网络中并没有复杂的路由
R7(config)#ipv6 route 2002::/16 tunnel 0
R7(config)#end
R7#wr

WIN10计算机的配置信息如下:

# 启用6to4(把enable改成disable就是禁用6to4隧道)
C:\Users\Aadministrator>netsh interface 6to4 set state enable

# 如果只有6to4的IPv4地址,则不需要添加路由,但由于存在其他的IPv6地址,所以需要添加具体路由(这里直接使用了默认路由)
C:\Users\Aadministrator>route add ::/0 2002:2f01:0107:0::1

配置完成以后我们在WIN10和IPv6路由器上ping实验拓扑中的任意IPv6地址都可以ping通。好奇的同学就有疑问了、6to4隧道是怎么工作的呢?他的工作原理又是什么呢?

R1#ping 2002:2d01:0105:1::2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2002:2D01:105:1::2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/5/25 ms
R1#ping 2001:1::2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:1::2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/5/20 ms
R1#ping 2001:1::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:1::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
R1#ping 2002:2d01:0105:1::2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2002:2D01:105:1::2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R1#ping 2002:2d01:0105:1::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2002:2D01:105:1::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R1#

实验测试1:在路由器R1上ping 2002:2d01:0105:1::2。路由器R1上配置了默认路由,把数据包发往路由器R3。路由器R3收到R1发过来的数据包,看到数据包的目标IP地址是2002:2d01:0105:1::2。R3查找自己的路由表,知道去往该地址的数据包要从隧道接口发出,这是一个6to4的隧道接口。R3从目标IPv6地址中取出2d01:0105,将其转换成IPv4地址45.1.1.5。R3用隧道接口的源IPv4地址34.1.1.3和目标IPv4地址45.1.1.5对IPv6数据包进行封装并发出。路由器R4收到R3发过来的数据包,根据数据包的目标IPv4地址查找路由表并转发到R5。路由器R5收到数据包后,发现这个数据包的目标IPv4地址就是自己,于是解封装,在看到IPv6的数据报头后进一步查找IPv6路由表,然后把IPv6的数据包发往路由器R6。数据包从R6返回R1的过程基本上与发送过程类似,这里不再细述。

实验测试2:在路由器R1上ping 2001:1::2。路由器R1把数据包发往路由器R3。路由器R3收到R1发过来的数据包,看到数据包的目标IP地址是2001:1::2。R3查找自己的路由表,知道去往该地址的数据包要发往2002:2f01:0107:0::1,这个下一跳地址属于路由2002::/16,而去往2002::/16的路由要走6to4的隧道接口。R3从下一跳IPv6地址中取出2f01:0107,将其转换成IPv4地址47.1.1.7。R3用隧道接口的源IPv4地址34.1.1.3和目标IPv4地址47.1.1.7对IPv6数据包进行封装并发出。路由器R4收到R3发过来的数据包,根据数据包的目标IPv4地址查找路由表并转发往R7。路由器R7收到数据包后,发现这个数据包的目标IPv4地址就是自己,于是解封装,在看到IPv6的数据报头后进一步查找IPv6路由表,然后把IPv6的数据包发往路由器R8。数据包从R8返回R1的过程与从R8返回R1的过程类似,这里不再细述。

3.4、ISATAP隧道

站点内自动隧道寻址协议(Intra-Site Automatic Tunnel Addressing Protocol,ISATAP)不仅是一种自动隧道技术,而且可以对IPv6地址进行自动配置。ISATAP典型的用法就是把运行IPv4协议的ISATAP主机连接到ISATAP路由器,这台主机再利用分配的IPv6地址接入IPv6网络。

ISATAP隧道的地址也有特定的格式,ISATAP主机的前64位是通过向ISATAP路由器发送请求得到的,后64位是接口ID,有固定的格式:

::200:5EFE:a.b.c.d

其中200:5EFE是IANA规定的格式;a.b.c.d是单播IPv4地址嵌入到IPv6地址的最后32位。与6to4地址类似,ISATAP地址中也嵌入了IPv4地址,ISATAP隧道可以根据目标ISATAP地址中的IPv4建立。ISATAP隧道属于非广播多路访问(Non-Broadcast Multiple Access,NBMA)网络,在前面的学习中得知,IPv6主机向路由器发送组播报文RS,然后从路由器收到组播报文RA,获取路由器分配的IPv6前缀。由于NBMA网络不支持组播,因此ISATAP主机通过发送单播报文到ISATAP路由器的链路本地地址来获取IPv6前缀。ISATAP路由器的链路本地地址有固定的格式:

Fe80::0:5EFE:a.b.c.d

其中0:5EFE是IANA规定的格式;a.b.c.d是单播IPv4地址嵌入到IPv6地址的最后32位。ISATAP主机通过源IPv6地址Fe80::200:5EFE:a.b.c.d将目标是Fe80::0:5EFE:a.b.c.d的RS报文发送出去。ISATAP主机完成数据的封装,中间路由器看到的都是IPv4地址。

在下图中,两台ISATAP主机通过ISATAP隧道连接到ISATAP路由器,获得IPv6前缀,再结合本地的64位的接口ID“200:5EFE:a.b.c.d”形成IPv6地址,然后就可以访问IPv6网络了。因为两台ISATAP主机的链路本地地址和IPv6地址都包含了IPv4地址,所以它们之间的ISATAP隧道是自动建立的,两台ISATAP主机之间可以直接通过链路本地地址和IPv6地址互访。

image-20220330200017967

ISATAP隧道的优点是解决了IPv4主机访问IPv6网络的问题,并且对IPv6地址前缀没有特别的要求;缺点是很多NAT设备不支持IPv6 in IPv4报文的穿越,导致ISATAP路由器和ISATAP主机之间的IPv4地址要直接可达。比如,如果ISATAP路由器用在公网上,则ISATAP主机需要有公网的IPv4地址,且不能经过NAT转换,因此在现阶段IPv4地址短缺的情况下实际应用的困难较大。如果ISATAP路由器用在内网,内网中的ISATAP主机则可以使用私有IPv4地址与ISATAP路由器通信,进而访问IPv6网络,这还是比较实用的。

下面我们一起来看一看如何配置ISATAP隧道,实验拓扑如下所示。ISATAP主机Win10-1和Win10-2通过IPv4网络连接到ISATAP路由器R2,获取IPv6地址,进而访问IPv6网络。

image-20220330200654386

R1的基础配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#host R1
R1(config)#int e0/0
R1(config-if)#ip add 218.1.1.1 255.255.255.0
R1(config-if)#no shut
R1(config-if)#int e0/1
R1(config-if)#ip add 219.1.1.1 255.255.255.0
R1(config-if)#no shut
R1(config-if)#int e0/2
R1(config-if)#ip add 218.1.2.1 255.255.255.0
R1(config-if)#no shut
R1(config-if)#end
R1#wr

R2的基础配置信息如下:

Router>enable
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R2
R2(config)#int e0/0
R2(config-if)#ip add 219.1.1.2 255.255.255.0
R2(config-if)#no shut
R2(config-if)#int e0/1
R2(config-if)#ipv6 add 2001:1::1/64
R2(config-if)#no shut
R2(config-if)#exit
R2(config)#ipv6 unicast-routing
R2(config)#ip route 218.1.0.0 255.255.0.0 219.1.1.1
R2(config)#end
R2#wr

R3的基础配置信息如下:

Router>enable
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R3
R3(config)#int e0/0
R3(config-if)#ipv6 add 2001:1::2/64
R3(config-if)#no shut
R3(config-if)#exit
R3(config)#ipv6 unicast-routing
R3(config)#ipv6 route ::/0 2001:1::1
R3(config)#end
R3#wr

注:Win10-1主机的IP地址是218.1.1.2,网关IP地址是218.1.1.1。Win10-2主机的IP地址是218.1.2.2,网关IP地址是218.1.2.1。

现在我们开始配置ISATAP隧道,首先是R2的配置信息:

R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 创建一个隧道接口
R2(config)#int tunnel 0
# 配置IPv6地址(可以随意配置,没有特殊要求)
R2(config-if)#ipv6 address 2001:2::1/64
# 以太网接口下隐式含有这条命令。隧道接口隐含的命令是ipv6 ndra suppress,即隧道接口默认抑制RA报文,这里关闭抑制
R2(config-if)#no ipv6 nd ra suppress
# 隧道接口的源地址
R2(config-if)#tunnel source 219.1.1.2
# 隧道的模式是ISATAP
R2(config-if)#tunnel mode ipv6ip isatap
R2(config-if)#end
R2#wr

WIN10-1主机的配置如下:

# 启用ISATAP,Win10主机默认启用ISATAP隧道,有时做了改动后不能马上生效,可以把这里的enable改成disable,禁用ISATAP,然后再重新启用,使新配置马上生效
C:\Users\Aadministrator>netsh interface ipv6 isatap set state enabled 

# 配置ISATAP路由器的IPv4地址。大家可能会困惑,ISATAP隧道不是自动的吗,怎么还要配目标地址呢?这里配置ISATAP路由器,是为了让ISATAP主机请求到IPv6前缀
C:\Users\Aadministrator> netsh interface ipv6 isatap set router 219.1.1.2 

Win10-2主机上的执行结果如下图所示。从输出结果我们可以看到Win10-2已经获取IPv6地址2001:2::200:5efe:218.1.2.2,前缀是2001:2::/64,接口ID是200:5efe:218.1.2.2,默认网关是ISATAP路由器R2隧道接口的链路本地地址。

image-20220330202334030

我们可以在Win10-1和Win10-2上ping路由器R3的IPv6地址2001:1::2,都可以ping通。Win10-1、Win10-2、R2彼此ping对方的IPv6地址和链路本地地址都可以成功。断开路由器R2后,Win10-1和Win10-2仍可以ping通,原因是ISATAP主机之间会自动建立ISATAP隧道。

实验测试1:测试Win10-1和Win10-2链路本地地址之间的连通性。启用ISATAP后,Win10-1生成链路本地地址fe80::200:5efe:218.1.1.2, Win10-2也生成了链路本地地址fe80::200:5efe:218.1.2.2。有了IPv6的链路本地地址后,Win10-1和Win10-2就有了IPv6连接功能,在Win10-1上ping Win10-2的链路本地地址fe80::200:5efe:218.1.2.2时,数据包从Win10-1发出去,经由IPv4封装,IPv4的源IP地址是218.1.1.2,目标IP地址是218.1.2.2。中间的IPv4路由器会正常转发这个IPv4数据包。最后IPv4数据包到达Win10-2并解封装,看到IPv6的报头和数据。Win10-2根据IPv6地址fe80::200:5efe:218.1.1.2得知ISATAP返回数据包要封装的IPv4地址是218.1.1.2。

实验测试2:在Win10-2上ping IPv6地址2001:1::2。启用ISATAP后,Win10-2生成链路本地地址fe80:: 200:5efe:218.1.2.2,转换成十六进制是fe80::200:5efe:da01:202。Win10-2主机上配置了ISATAP路由器的IPv4地址219.1.1.2,根据这个IPv4地址计算出ISATAP路由器的隧道接口的链路本地地址是fe80::0:5efe:219.1.1.2,转换成十六进制是fe80::5efe:db01:102,由于隧道属于NBMA网络,不支持组播,Win10-2向fe80::5efe:db01:102发出RS报文。图8-62所示为在Win10-2上捕获的报文,编号103的报文是Win10-2发出的RS报文,源地址和目标地址与上面的分析一致。编号104的报文是ISATAP路由器返回的RA报文。下图中最下方显示了路由器返回的前缀是2001:2::/64,再结合Win10-2的接口ID值200:5efe:da01:202,形成完整的IPv6地址2001:2::200:5efe:218.1.2.2。

image-20220330204856339

在Win10-2上ping IPv6地址2001:1::2,该地址与本地IPv6地址2001:2::200:5efe:218.1.2.2不在同一个网络内,需要把数据包发给网关,也就是fe80::0:5efe:219.1.1.2。从这个链路本地地址可以知道隧道的目标IPv4地址是219.1.1.2。下图所示为在Win10-2上捕获的ping包,验证了上面的分析。

image-20220330205012877

3.5、Teredo隧道

Teredo隧道又称为面向IPv6的IPv4 NAT穿越隧道,在IPv4主机位于一个或多个IPv4 NAT设备之后时,用来为IPv4主机分配IPv6地址和自动隧道。

前面介绍的6to4隧道技术也是一种自动隧道技术,但6to4路由器使用一个公网的IPv4地址来构建6to4前缀,如果主机没有公网的IPv4地址,则无法使用6to4隧道。另外,6to4隧道使用了特殊的IPv6地址前缀,这个IPv6前缀很难做到全球可达。另一种隧道技术ISATAP,是一种自动分配IPv6地址的自动隧道技术,对IPv6前缀没有特殊要求,但要求IPv4主机要具有公网IPv4地址。目前IPv4地址严重短缺,除了服务器,互联网上的大多数终端没有公网IPv4地址,需要通过一次或多次NAT转换后才具有公网IPv4地址。

6to4隧道和ISATAP隧道都无法解决私有IPv4地址访问IPv6网络的问题,而Teredo隧道很好地解决了这个问题。为了使IPv6数据包能够通过单层或多层NAT设备传输,它需要封装成IPv4的UDP数据,UDP数据能够被众多的NAT设备解析并最终穿越多层NAT设备。Teredo隧道要想正常工作,除了需要Teredo服务器和Teredo终端外,还需要Teredo中继。在下图中,IPv4网络中没有公网IP地址的私网终端通过Teredo隧道连接到Teredo服务器,获得了IPv6地址。私网终端的IPv6数据包被封装在Teredo隧道中到达Teredo服务器,Teredo服务器解开IPv4封装,把IPv6数据包发往IPv6网络。IPv6的返回流量到达Teredo中继,Teredo中继根据IPv6数据包的目标IPv6地址,知道这个IPv6数据包需要通过Teredo隧道,然后将数据包返回到私网终端;私网终端解开IPv4封装,得到IPv6的数据。

image-20220330205841408

下面我们开始Teredo隧道的实验测试,实验拓扑如下图所示。私网主机Win10-2的IPv4地址是192.168.1.2,通过NAT设备路由器R2访问互联网。搭建Teredo服务器和Teredo中继,使私网主机Win10-2可以访问纯IPv6主机Win10-1。

image-20220330214555215

按照拓扑图规划内容,我们需要配置Win10-1的IPv6地址为2001:2::2,网关IP地址为2001:2::1。Win10-2的IPv4地址192.168.1.2,网关IP地址为192.168.1.1。Teredo服务器和Teredo中继都是双栈主机,配置两块网卡,既有IPv6地址,也有IPv4地址。在做实验时,要确认把IPv4或IPv6配置在正确的网卡上,可以通过ping进行验证。Teredo服务器的e1网卡配置的IPv6地址是2001:1::2,网关IP地址是2001:1::1;e0网卡配置的IPv4地址是211.1.1.2和211.1.1.3(Teredo服务器需要配置两个连续的IPv4公网IP地址,以测试隧道),网关IP地址为211.1.1.1。Teredo中继的e1网卡配置的IPv6地址是2001:1::3,网关IP地址是2001:1::1;e0网卡配置的IPv4地址是211.1.1.4,网关IP地址是211.1.1.1。主机配置完成以后我们开始配置R2 NAT设备,配置信息如下:

Router>enable
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R2
R2(config)#int e0/0
R2(config-if)#ip add 211.1.1.1 255.255.255.0
# NAT对外接口
R2(config-if)#ip nat outside
R2(config-if)#no shut
R2(config-if)#int e0/1
# NAT对内接口
R2(config-if)#ip nat inside
R2(config-if)#ip add 192.168.1.1 255.255.255.0
R2(config-if)#no shut
R2(config-if)#exit
# 允许内网所有IP
R2(config)# access-list 1 permit any
# 所有私网主机使用e0/0接口的IP共享上网
R2(config)#ip nat inside source list 1 interface e0/0 overload
R2(config)#end
R2#wr

NAT设备配置完成以后,我们在Teredo服务器上右键单击“开始”菜单,选择“命令提示符(管理员)”,打开管理员命令提示窗口,依次输入netsh interface teredo set state type=server命令;然后使用netsh interface teredo show state命令查看Teredo状态;继续使用netsh interface teredo set state servername=211.1.1.2命令改变服务器为本服务器;我们再次使用netsh interface teredo show state命令查看Teredo状态,输出信息如下:

image-20220330221900522

注:从上面的输出信息我们可以看到,服务器的状态变成了online。

Teredo服务器配置完成以后我们就可以开始配置Teredo中继了,Teredo的配置信息如下:

C:\Windows\system32>netsh interface teredo set stateenterpriseclient

C:\Windows\system32>netsh interface teredo set stateservername=211.1.1.2

然后我们在Teredo中继服务器中使用ipconfig命令查看IP配置,显示如下图所示:

image-20220330222509297

继续使用下面的命令在IPv6接口和Teredo隧道接口上启用转发功能:

C:\Windows\system32>netsh interface ipv6 set interface "以太网 2" forwarding=enabled

C:\Windows\system32>netsh interface ipv6 set interface "Teredo Tunneling Pseudo-Interface" forwarding=enabled

Teredo客户端的配置如下:

C:\Windows\system32>netsh interface teredo set state enterpriseclient

C:\Windows\system32>netsh interface teredo set state servername=211.1.1.2

使用netsh interface teredo show state命令查看Teredo状态,显示如下图所示:

image-20220330223152930

我们在私网主机上使用ipconfig命令查看Teredo客户端Teredo隧道接口的IPv6地址,显示为2001:0:d301: 102:24c0:2529:2cfe:fefe。其中2001:0/32是Teredo地址的固定前缀;d301:102是Teredo服务器IPv4地址211.1.1.2的十六进制格式;24c0是随机部分;2529是图8-67中外部NAT映射的端口56022与FFFF的异或值(56022换成二进制是11011010.11010110,异或后是00100101.00101001,换成十六进制是25.29);2cfe:fefe是上图中外部NAT映射IP地址211.1.1.1与FFFF.FFFF的异或值(211.1.1.1换算成二进制是11010011.00000001.00000001.00000001,异或后是00101100.11111110. 11111110.11111110,换成十六进制是2c.fe.fe.fe)。

image-20220330223235840

我们继续配置R1路由器,配置信息如下:

Router>
Router>enable
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#host R1
R1(config)#int e0/0
R1(config-if)#ipv6 add 2001:1::1/64
R1(config-if)#no shut
R1(config-if)#int e0/1
R1(config-if)#ipv6 add 2001:2::1/64
R1(config-if)#no shut
R1(config-if)#exit
R1(config)#ipv6 unicast-routing
# IPv6路由器把Teredo的路由指向Teredo中继。在真实IPv6环境中,Teredo中继可以有很多个;
# 发往Teredo中继的路由是2001:0::/32,众多的Teredo中继可以采用动态路由,IPv6路由器会选择最近的Teredo中继。
# 本实验中Teredo客户端和Teredo中继使用了同一台Teredo服务器,在真实环境中,它们可以指向不同的Teredo服务器
R1(config)#ipv6 route 2001:0:d301:102::/64 2001:1::3
R1#wr

全部配置完成以后我们开始测试,我们在Win10-2上ping Win10-1的IPv6地址2001:2::2,可以ping通,远程桌面也可以连接。在Win10-1上可以远程桌面连接Win10-2的IPv6地址2001:0:d301: 102:24c0:2529:2cfe:fefe。Teredo中继也可以远程桌面连接Win10-2的IPv6地址。

image-20220330223705270

image-20220330223917843

我们在Win10-2上ping IPv6地址2001:2::2。启用Teredo隧道后,Win10-2生成了Teredo的IPv6地址2001:0:d301:102:24c0:2529:2cfe:fefe。Win10-2根据Teredo隧道的配置,把IPv6的数据包封装后发给Teredo服务器211.1.1.2。下图所示为在Teredo服务器的e0接口捕获的数据包。可以看到IPv4之上是UDP,源端口是56022(与Teredo的IPv6地址有关),目标端口是3544(Teredo服务器的固定端口)。UDP之上是Teredo隧道,可以看到源和目的IPv6地址,再往上是ICMPv6的报文。

image-20220331104727010

Teredo服务器解封装后,把IPv6数据发往IPv6网络(这里是发往R1),R1再发往Win10-2。Win10-2返回2001:0:d301:102:24c0:2529:2cfe:fefe的数据包发往R1,R1根据路由表发往Teredo中继。Teredo中继根据目的IPv6地址知道这个数据包要通过Teredo隧道发送,也知道外部NAT映射的公网IPv4地址和端口,于是将IPv6数据包封装进IPv4后发往路由器R2。下图中所示为捕获的Teredo中继发往Teredo客户端的报文。这个报文并没有像Teredo客户端发往Teredo服务器的报文那样显示出上层协议和内容,而只显示了Data。至于Data有什么内容,需要由上层协议去分析处理。

image-20220331111032738

我们在路由器R2查看NAT转换表,根据目的UDP端口56022得知是发往192.168.1.2的数据包,于是把目的IP由211.1.1.1转换成192.168.1.2并发往Win10-2。Win10-2收到R2发过来的IPv4数据包后将其解封装,然后交由上层协议继续处理。Teredo客户端到2001:2::2的后续数据包不再通过Teredo服务器,而是Teredo客户端和Teredo中继之间直接通信,上图的抓包进一步验证了这个结论。由此可见,Teredo服务器还是比较轻松的,只需指路即可,后面的工作都由Teredo中继来完成。

这里需要多说一句,Teredo隧道虽然解决了IPv4终端NAT后访问IPv6网络的问题,但由于Teredo隧道离不开Teredo中继,互联网去往Teredo中继2001::/32的路由都是指向国外,即使国内搭了Teredo服务器,最后还得通过国外的Teredo中继来提供服务,因此效率不高。如果既搭建了Teredo服务器,又搭建了Teredo中继,但要访问的资源不在本地,在访问资源时依然会选择就近的Teredo中继,访问的效率仍不高。除非搭建自己的Teredo服务器和Teredo中继,并且要访问的资源也在本地,为此可以调整路由表,把资源的返回路径调整到自己的Teredo中继。Teredo服务器teredo.njtech.edu.cn和资源网站cbl6.njtech.edu.cn采用的就是这种方式。

3.6、其他隧道技术

除了上面我们提到的这么多隧道技术、还有其他的隧道技术供大家选择。

3.6.1、6PE

6PE(IPv6 Provider Edge,IPv6供应商边缘)是一种IPv6过渡技术,可以让支持IPv6的CE(Customer Edge,用户边缘)路由器穿过当前已存在的IPv4 MPLS(Multiprotocol Label Switching,多协议标签交换)网络,使用IPv6进行通信。这是运营商级的技术,在实际工作中我们可能用的特别少,这里就不做过多介绍,感兴趣的朋友可以自行百度。

3.6.2、Tunnel Broker

Tunnel Broker(隧道代理)的主要目的是简化用户的隧道配置,以方便接入IPv6网络。Tunnel Broker通过Web方式为用户分配IPv6地址、建立隧道,以提供和其他IPv6站点之间的通信。Tunnel Broker的特点是灵活,可操作性强,可针对不同用户提供不同的隧道配置。目前互联网上有些公司提供了免费的Tunnel Broker服务,感兴趣的同学可以在网上搜索Tunnel Broker,然后自行配置。

3.6.3、隧道技术对比

image-20220331112615159

由上表可知,如果PC终端要访问IPv6网络,推荐使用VPN GRE,也就是前面我们演示的方法。GRE不仅对IPv6前缀没有特殊要求,还支持验证。搭建了这样一台VPN服务器后,可以有针对性地对某些用户提供服务。6to4隧道技术不仅需要PC端有公网的IPv4地址,还要求使用特殊的IPv6前缀,几乎没有实用价值。ISATAP同样需要PC端要有公网的IPv4地址,条件很难满足。Teredo虽对PC端的IPv4地址没有要求,但却要求特殊的IPv6前缀,而且还需要Teredo中继,Teredo中继又因路由问题而效率低下,实用价值也不大。在6to4、ISATAP和Teredo中,如果不配置验证,谁都可以使用因此安全性欠缺,不适合用来提供服务。如果只是实现网络到网络的互通,GRE、IPv6 in IPv4和6to4都可以,前两种虽是手动隧道,但对IPv6前缀没有特殊要求,一般单位也不会建立很多条隧道,因此比较可行。

4、协议转换技术

前面我们介绍的隧道技术归根结底是双栈技术,主要用于实现分离的IPv6或IPv4网络之间的互通。本节要介绍的协议转换技术用来实现不同网络间的访问,比如在无须配置另外一种协议的情况下,让客户端使用IPv4来访问IPv6网络,反之亦然。采用协议转换实现IPv4到IPv6过渡的优点是不需要进行IPv4、IPv6节点的升级改造,缺点是用来实现IPv4节点和IPv6节点相互访问的方法比较复杂,网络设备进行协议转换、地址转换所需的开销较大,一般在其他互通方式无法使用的情况下使用。

4.1、NAT-PT转换技术

NAT-PT由SIIT(Stateless IP/ICMP Translation,无状态IP/ICMP转换)技术和动态地址转换(NAT)技术结合和演进而来,SIIT提供IPv4和IPv6之间的一对一的映射转换,NAT-PT支持在SIIT基础上实现多对一或多对多的地址转换;NAT-PT分为静态和动态两种。

4.1.1、静态NAT-PT

静态NAT-PT提供IPv6地址和IPv4地址之间的一对一的映射,一般用于需要提供稳定服务的场合。IPv6单协议网络内的节点要访问IPv4单协议网络内的每一个IPv4地址,都必须先在NAT-PT设备中配置。在NAT-PT设备中,把要与IPv6网络通信的IPv4地址映射成IPv6地址;把要与IPv4网络通信的IPv6地址映射成IPv4地址。比如,当IPv4设备访问IPv6网络时,它访问的是IPv6映射后的IPv4地址。IPv4数据包发往NAT-PT设备后,NAT-PT设备根据映射表的配置,把源IPv4和目的IPv4地址转换成对应的IPv6地址,然后将数据包发往目的IPv6设备。IPv6设备根据源IPv6地址进行回应,IPv6数据包被发往NAT-PT设备,NATPT设备再把源和目的IPv6地址转换成相应的IPv4地址,返回到IPv4设备。

NAT-PT并不是转换所有IPv6数据包的地址,而是只转换满足特定前缀的IPv6地址,转换方法是使用命令ipv6 nat prefix,后面跟上要转换的IPv6前缀和固定长度96,比如ipv6 nat prefix 2001:2::/96。下面我们还是通过实验的方式来看看静态NAT-PT是如何实现的,实验拓扑如下图所示。我们需要配置图中的设备,使纯IPv4设备路由器R1可以与纯IPv6设备路由器R3通信。

image-20220331113143093

R1的基础配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R1
R1(config)#int e0/0
R1(config-if)#ip add 192.168.1.2 255.255.255.0
R1(config-if)#no shutdown 
R1(config-if)#exit
R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.1.1
R1(config)#end
R1#wr

R2的基础配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R2
R2(config)#ipv6 unicast-routing 
R2(config)#int e0/0
R2(config-if)#ip add 192.168.1.1 255.255.255.0
R2(config-if)#no shutdown 
R2(config-if)#int e0/1
R2(config-if)#ipv6 add 2001:1::1/64
R2(config-if)#no shutdown 
R2(config-if)#end
R2#wr

R3的基础配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname R3
R3(config)#ipv6 unicast-routing 
R3(config)#int e0/0
R3(config-if)#ipv6 add 2001:1::2/64
R3(config-if)#no shutdown 
R3(config-if)#exit
R3(config)#ipv6 route ::/0 2001:1::1
R3(config)#end
R3#wr

基础信息配置完成以后我们开始配置NAT-PT协议、我们主要在R2路由器上进行配置,配置信息如下:

R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R2(config)#int e0/0
# 这个接口上启用NAT-PT
R2(config-if)#ipv6 nat
R2(config-if)#int e0/1
# 这个接口上启用NAT-PT
R2(config-if)#ipv6 nat
R2(config-if)#exit
# 配置IPv4向IPv6的转换(192.168.1.2转换成2001:2::1)
R2(config)#ipv6 nat v4v6 source 192.168.1.2 2001:2::1
# 配置IPv6向IPv4的转换(2001:1::2转换成192.168.2.2)
R2(config)#ipv6 nat v6v4 source 2001:1::2 192.168.2.2
# 定义前缘长度,必须是96位,意味着IPv4地址会被映射到IPv6网络中的2001:2::/96
R2(config)#ipv6 nat prefix 2001:2::/96
R2(config)#no ip cef
R2(config)#end
R2#wr

注:这里需要说明一点,我们需要通过no ip cef命令来关闭思科快速交换技术。不然我们在R1上ping 192.168.2.2,在R3上ping 2001:2::1会出现ping包都是一个通一个不通的现象。Cisco快速交换(Cisco Express Forwarding,CEF)是思科的一种快速交换技术,可以将其理解成缓存技术,比如前一个ping包成功ping通了,后一个ping不用经过耗时的路由进程处理,而是直接去往之前的数据包的交换路径。由于这里要经过IPv4和IPv6的转换,因此每一个数据包都要经过路由进程处理。no ip cef命令会关闭思科的快速交换,强制所有数据包都经路由进程处理。

4.1.2、动态NAT-PT

在动态NAT-PT中,IPv6到IPv4的地址映射是动态生成的、可变的。NAT-PT网关定义了IPv4地址池,它从地址池中取出一个地址来替换IPv6报文的源地址,从而完成从IPv6地址到IPv4地址的转换。动态NAT-PT支持将多个IPv6地址映射为一个IPv4地址,节省了IPv4地址空间。我们继续使用上面的实验拓扑结构、基础配置信息和上面的静态NAT-PT实验数据一致,这里我们只需要修改NAT-PT的配置信息即可,R2路由器的配置信息如下:

R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 关闭Cisco快速交换
R2(config)#no ip cef
R2(config)#int e0/0
R2(config-if)#ipv6 nat
R2(config-if)#int e0/1
R2(config-if)#ipv6 nat
R2(config-if)#exit
# 创建IPv6的访问控制列表
R2(config)#ipv6 access-list v6v4
# 放行2001:1::/64前缀的IPv6地址
R2(config-ipv6-acl)#permit ipv6 2001:1::/64 any
R2(config-ipv6-acl)#exit
# 配置IPv4地址池,实现IPv6到IPv4的映射
R2(config)#ipv6 nat v6v4 pool v4-pool 192.168.2.2 192.168.2.3 prefix-length 24
# 配置2001:1::/64前缀的IPv6地址,使其在访问IPv4网络时被动态转换为地址池中的IPv4地址(这种对应关系不是固定的,是临 时的)
R2(config)#ipv6 nat v6v4 source list v6v4 pool v4-pool              
# 配置IPv4向IPv6的转换(192.168.1.2转换成2001:2::1,在动态NAT-PT中,仍然需要配置静态的IPv4到IPv6的映射)
R2(config)#ipv6 nat v4v6 source 192.168.1.2 2001:2::1
R2(config)#ipv6 nat prefix 2001:2::/96
R2(config)#end
R2#wr

从前面的配置中可以看到,动态IPv4地址池中有两个IP地址,可并没有具体的IPv6地址和IPv4地址的映射,从IPv4网络中无法主动发起到IPv6网络的连接。从IPv6网络中主动发起到IPv4网络的连接,在R3上ping 2001:2::1,源IPv6地址是2001:1::2,目的IPv6地址是2001:2::1,该数据包到达NAT-PT设备。NAT-PT设备从IPv4动态地址池中取一个IPv4地址(一般是未使用的最小的IPv4地址,这里在初次使用时是192.168.2.2)替换数据包的源IPv6地址。根据配置的静态映射,NAT-PT设备用192.168.1.2替换数据包中的目的IPv6地址。测试的结果是R3可以ping通R1,此时在R2上查看NAT映射关系,显示如下:

1  R2#show ipv6 nat translations 
2  Prot  IPv4 source              IPv6 source
3        IPv4 destination         IPv6 destination
4  ---   ---                      ---
5        192.168.1.2              2001:2::1
6 
7  icmp  192.168.2.2,9081         2001:1::2,9081
8        192.168.1.2,9081         2001:2::1,9081
9 
10 ---   192.168.2.2              2001:1::2
11       ---                      ---
12 
13 R2#

为了方便解释,在输出的前面添加了行号。第4行和第5行是配置的IPv4到IPv6的静态映射,由于是静态配置的,会一直有效。第7行和第8行是在R3上ping 2001:2::1产生的,显示的是IPv6的源和目的IPv6地址,以及转换成IPv4后的源和目的IPv4地址。这个条目在生存时间过后会自动删除。第10行和第11行是生成的静态条目,这个条目也会一直存在。它们与第1行和第2行的区别在于,第10行和第11行是通过数据包触发生成的,而第4行和第5行一直存在。使用下面的命令可以删除第10行和第11行,但第3行和第4行不受影响。

R2#clear ipv6 nat translation *

将路由器R3的e0/0接口的IPv6地址改为2001:1::3/64,再次ping 2001:2::1,也可以ping 通。一段时间后在R2上执行sho ipv6 nat translations命令,显示如下:

R2#show ipv6 nat translations 
Prot  IPv4 source              IPv6 source
      IPv4 destination         IPv6 destination
---   ---                      ---
      192.168.1.2              2001:2::1

icmp  192.168.2.2,3329         2001:1::2,3329
      192.168.1.2,3329         2001:2::1,3329

---   192.168.2.2              2001:1::2
      ---                      ---

icmp  192.168.2.3,128          2001:1::3,128
      192.168.1.2,128          2001:2::1,128

---   192.168.2.3              2001:1::3
      ---                      ---

R2#

从上面的输出看到,2001:1::2被转换成192.168.2.2,2001:1::3被转换成192.168.2.3。路由器R3的e0/0接口的IPv6地址从2001:1::2变成2001:1::3后,原来的转换条目依然存在。有了这个转换表,就可以主动从IPv4端发起到IPv6端的连接了,比如R1访问192.168.2.3,就相当于访问2001:1::3。

把路由器R3的e0/0接口的IPv6地址更改为2001:1::4/64后,ping 2002:2::1时发现不通了,这是因为IP地址池中的两个IP地址都用完了,现在没有地址可用。这种转换虽然是动态的,但IPv4和IPv6地址仍然是一对一的转换。

其实NAPT-PT类似于IPv4中的超载,在转换条目后添加overload参数,启用端口转换,这样多个IPv6地址就可以转换成一个IPv4地址了。具体命令如下:

R2(config)#ipv6 nat v6v4 source list v6v4 pool v4-pool overload

在执行该命令进行修改时,可能会提示“IPv6 NAT: %Dynamic mapping in use, cannot change”信息,显示映射正在被使用,不能修改。可以使用命令clear ipv6 nat translation *清除映射后再修改。

我们可以将路由器R3的e0/0接口更改为多个IPv6地址来进行测试,发现都可以ping 通R1。执行命令sho ipv6 nat translations,可以发现只生成了端口转换条目,不存在IP转换条目。假如R1是IPv4网络上的某个应用服务器,通过NAPT-PT配置后,应用服务器不用做任何改动,就可以支持多个IPv6地址直接访问IPv4应用了。

当然、动态NAT-PT也是有优缺点的,具体该如何取舍就看业务场景和具体需求了。比如,NAT-PT不必修改现有网络即可实现IPv4与IPv6网络之间的互通。在NAPT-PT中,仅使用一个IPv4地址,即可实现多个IPv6主机与IPv4网络的通信,从而解决IPv4地址没有IPv6地址多的问题。NAT-PT原理与IPv4中的NAT原理类似,是一种非常好的IPv4向IPv6过渡技术。NAT-PT的缺点是:属于同一会话的请求和响应都必须通过同一NAT-PT设备才能进行转换,不适合多出口设备的环境;不能转换IPv4报头的可选项部分;由于地址在传输过程中发生了变化,端到端的安全性很难实现。

4.1.3、防火墙配置NAPT-PT

在真实环境中,公司一般都是通过防火墙连接互联网;下面我们来演示一下通过防火墙如何配置NAPT-PT。实验拓扑如下图所示,防火墙连接IPv4和IPv6网络,配置动态NAPT-PT,使IPv4网络中的所有主机都可以主动访问IPv6网络中的2001:1::2服务器,被映射后的服务器IPv4地址是192.168.2.100;使IPv6网络中的所有主机都可以主动访问IPv4网络中的192.168.1.2服务器,被映射后的服务器IPv6地址是2001:2::1。

image-20220331204944359

我们按照拓扑规划来配置Winserver1服务器的IPv4地址和网关,配置Winserver2服务器的IPv6地址和网关。配置完成以后我们开始配置防火墙。防火墙配置如下:

SG-6000# configure 
SG-6000(config)# interface eth0/2
SG-6000(config-if-eth0/2)# zone trust 
SG-6000(config-if-eth0/2)# ip add 192.168.1.1 255.255.255.0
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# interface eth0/1
SG-6000(config-if-eth0/1)# zone untrust 
SG-6000(config-if-eth0/1)# ipv6 enable
# 接口默认抑制RA报文,使用此命令关闭抑制
SG-6000(config-if-eth0/1)# no ipv6 nd ra suppress 
SG-6000(config-if-eth0/1)# exit
SG-6000(config)# ip vrouter trust-vr 
# 配置源地址转换,任何IPv4地址访问192.168.2.100时,把源IPv4地址转换成IPv6地址2001:2::10
SG-6000(config-vrouter)# snatrule from "any" to "192.168.2.100" service "Any" trans-to 2001:2::100 mode dynamicport 
# # 配置源地址转换,任何IPv6地址访问2001:2::1时,把源IPv6地址转换成IPv4地址192.168.2.2
SG-6000(config-vrouter)# snatrule from "IPv6-any" to "2001:2::1" service "Any" trans-to 192.168.2.2 mode dynamicport     
# 配置目的地址转换,任何IPv4地址访问192.168.2.100时,把目的IPv4地址转换成IPv6地址2001:1::2
SG-6000(config-vrouter)# dnatrule from "any" to "192.168.2.100" service "Any" trans-to "2001:1::2"
# 配置目的地址转换,任何IPv6地址访问2001:2::1时,把目的IPv6地址转换成IPv4地址192.168.1.2
SG-6000(config-vrouter)# dnatrule from "IPv6-any" to "2001:2::1" service "Any" trans-to "192.168.1.2"
SG-6000(config-vrouter)# exit
# 创建策略,允许IPv4地址从信任区域访问非信任区域
SG-6000(config)# rule
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone trust 
SG-6000(config-policy-rule)# dst-zone untrust 
SG-6000(config-policy-rule)# src-addr any
SG-6000(config-policy-rule)# dst-addr any 
SG-6000(config-policy-rule)# service Any
SG-6000(config-policy-rule)# name "ip any any"
SG-6000(config-policy-rule)# exit
# 创建策略,允许IPv6地址从非信任区域访问信任区域
SG-6000(config)# rule 
SG-6000(config-policy-rule)# action permit 
SG-6000(config-policy-rule)# src-zone untrust 
SG-6000(config-policy-rule)# dst-zone trust 
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "ipv6 any any"
SG-6000(config-policy-rule)# exit
SG-6000(config)# 
# 创建名称为ipv4的DHCP地址池
SG-6000(config)# dhcp-server pool ipv4
SG-6000(config-dhcp-server)# add 192.168.1.100 192.168.1.200
SG-6000(config-dhcp-server)# netmask 255.255.255.0
SG-6000(config-dhcp-server)# gateway 192.168.1.1
SG-6000(config-dhcp-server)# exit
SG-6000(config)# interface eth0/2
# 在接口下调用DHCP地址池
SG-6000(config-if-eth0/2)# dhcp-server enable pool ipv4
SG-6000(config-if-eth0/2)# end
SG-6000# sa

在IPv4网络中的Win10-1和Winserver-1上主动ping 192.168.2.100(实际上是Winserver-2),都可以ping通。在IPv6网络中的Win10-2和Winserver-2上主动ping 2001:2::1(实际上是Winserver-1),也都可以ping通。本实验的配置更全面,不仅IPv4网络中的任意主机可以访问IPv6网络中的服务,而且IPv6网络中的任意主机也可以访问IPv4网络中的服务。

image-20220331214241161

4.2、NAT64/DNS64转换技术

4.2.1、NAT64配置

NAT-PT通过IPv6与IPv4的网络地址与协议转换,实现了IPv6网络与IPv4网络的互联互通。但NAT-PT在实际的网络应用中面临各种缺陷。为了解决NAT-PT中的各种缺陷,同时实现IPv6与IPv4之间的网络地址与协议转换技术,IETF重新设计了新的解决方案:NAT64与DNS64技术。

NAT64是一种有状态的网络地址与协议转换技术,一般只支持通过IPv6网络侧发起连接来访问IPv4网络侧的资源。NAT64也支持手动配置静态映射关系,让IPv4网络主动发起去往IPv6网络的连接。NAT64可实现TCP、UDP、ICMP协议下的IPv6与IPv4网络地址与协议转换。当IPv6客户端进行DNS查询时,如果没有得到IPv6 DNS服务器的响应,可使用DNS64向IPv4 DNS服务器发起DNS请求,并将从IPv4 DNS中返回的A记录(IPv4地址)合成到AAAA记录(IPv6地址)中,然后将合成的AAAA记录返回到IPv6客户端。NAT64执行IPv4与IPv6有状态的地址与协议转换,DNS64用来解析域名地址,两者协同工作,不需要在IPv6客户端或IPv4服务器端进行任何修改。

下面我们一起来看一下NAT64配置的实验拓扑,如下图所示。公司内配置的是纯IPv6网络,但公司内的IPv6主机也需要访问IPv4网络。配置NAT64,使公司内网的IPv6主机可以主动访问IPv4互联网络中的所有设备。

image-20220401091719002

配置Winserver1服务器的IPv4地址和路由器R1接口的IPv4地址。然后我们开始配置防火墙,配置信息如下:

SG-6000# configure 
SG-6000(config)# interface eth0/2
SG-6000(config-if-eth0/2)# zone untrust 
SG-6000(config-if-eth0/2)# ip add 218.1.1.1 255.255.255.0
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# interface eth0/1
SG-6000(config-if-eth0/1)# zone trust 
SG-6000(config-if-eth0/1)# ipv6 enable
# 接口默认抑制RA报文,使用此命令关闭抑制
SG-6000(config-if-eth0/1)# no ipv6 nd ra suppress 
SG-6000(config-if-eth0/1)# exit
SG-6000(config)# ip vrouter trust-vr 
# 配置源地址转换,任何IPv6地址访问2001:2::/96时,把源IPv6地址转换成IPv4地址218.1.1.1
SG-6000(config-vrouter)# snatrule from "IPv6-any" to "2001:2::/96" service "Any" trans-to 218.1.1.1 mode dynamicport 
# 配置目的地址转换,任何IPv6地址访问"2001:2::/96"时,直接从报文的目的IPv6地址中抽取最后32位作为目的IPv4地址
SG-6000(config-vrouter)# dnatrule from "IPv6-any" to "2001:2::/96" service "Any" v4-mapped 
SG-6000(config-vrouter)# exit
# 创建策略,允许IPv6地址从非信任区域访问信任区域
SG-6000(config)# rule 
SG-6000(config-policy-rule)# action permit 
SG-6000(config-policy-rule)# src-zone trust 
SG-6000(config-policy-rule)# dst-zone untrust 
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "ipv6 any any"
SG-6000(config-policy-rule)# exit
SG-6000(config)# exit
SG-6000# sa

配置完成以后我们开始测试,我们在Win10-2和Winserver2上ping2001:2::218.1.1.2和2001:2::218.1.1.3,输出信息如下图所示。218.1.1.2 转换成十六进制是 da01:102,218.1.1.3 转换成十六进制是da01:103,这里直接ping 十六进制和十进制组合后的IPv6地址(计算机会自动进行地址转换)。

image-20220401101556700

如果我们在路由器R1上执行debug ip icmp命令,验证ping 2001:2::da01:103时就是ping 218.1.1.3。不要关闭该实验,在本实验的基础上继续完成下面的DNS64实验配置。

R1#debug ip icmp
ICMP packet debugging is on
R1#
*Apr  1 09:16:25.551: ICMP: echo reply sent, src 218.1.1.3, dst 218.1.1.1, topology BASE, dscp 0 topoid 0
*Apr  1 09:16:26.585: ICMP: echo reply sent, src 218.1.1.3, dst 218.1.1.1, topology BASE, dscp 0 topoid 0
R1#
*Apr  1 09:16:27.603: ICMP: echo reply sent, src 218.1.1.3, dst 218.1.1.1, topology BASE, dscp 0 topoid 0
*Apr  1 09:16:28.617: ICMP: echo reply sent, src 218.1.1.3, dst 218.1.1.1, topology BASE, dscp 0 topoid 0
R1#
4.2.2、DNS64配置

完成上面的NAT64实验配置后,内网中的IPv6主机通过访问特定前缀的IPv6地址,进而可以直接与IPv4互联网上的IPv4地址通信。在真实环境中,域名解析往往都是通过DNS进行的。在上面的实验拓扑中,我们将Winserver1配置成IPv4网络中的DNS服务器,新建正向区域test.com,添加一条A记录www.test.com,指向IPv4地址218.1.1.3。下面我们开始配置DNS64,使Win10-2和Winserver2可以ping通www.test.com。

我们在Winserver1上添加DNS服务,新建正向区域test.com,添加一条A记录www.test.com,指向IPv4地址218.1.1.3。配置Win10-2和Winserver2的“Internet协议版本6”,仍然采用“自动获取IPv6地址”,将首选DNS服务器配置成防火墙的IPv6地址,即“2001:1::1”。

配置完成以后开始配置防护墙,防火墙配置信息如下:

SG-6000# configure 
# 创建DNS代理规则序号1,可以创建多条规则
SG-6000(config)# dns-proxy rule id 1
# 指定启用DNS代理的接口,该接口的IPv6地址是2001:1::1。Win10-2和Winserver2的DNS配置成此接口的IPv6地址
SG-6000(config-dns-proxy-rule)# ingress-interface ethernet0/1
# 流量的源IPv6地址,满足该条件的才可以使用这个DNS代理,假如有多个DNS代理的话,可以根据源地址筛选使用不同的DNS代理
SG-6000(config-dns-proxy-rule)# src-addr "IPv6-any"
# 流量的目的IPv6地址
SG-6000(config-dns-proxy-rule)# dst-addr "IPv6-any"
# 该DNS代理可查询所有的域名
SG-6000(config-dns-proxy-rule)# domain any
# DNS代理服务器要转发到的真正的DNS服务器,这里可以是IPv4或IPv6的DNS服务器。
# 查看配置时,该命令后面会自动添加 vrouter "trust-vr",表示默认的虚拟路由器。
SG-6000(config-dns-proxy-rule)# name-server 218.1.1.2
# 当用户配置了IPv6 DNS代理规则后,可以指定开启或关闭DNS64功能。
# 默认情况下DNS64功能是关闭的,在DNS代理中再使用DNS64。
SG-6000(config-dns-proxy-rule)# dns64 enable
# 指定IPv6前缀及长度,DNS64使用此前缀进行IPv4地址到IPv6地址的合成,IPv4地址被转换成IPv6地址的最后32位
SG-6000(config-dns-proxy-dns64)# prefix 2001:2::/96
# 指定DNS64服务器的IP地址,该IP地址只能为IPv4地址。
# 查看配置时,该命令后同样也会自动加上vrouter "trust-vr"。
SG-6000(config-dns-proxy-dns64)# server 218.1.1.2
SG-6000(config-dns-proxy-dns64)# exit
SG-6000(config-dns-proxy-rule)# exit
SG-6000(config)# end
SG-6000# sa

配置完成以后我们开始测试,我们在Win10-2和Winserver2上执行pingwww.test.com,输出信息如下:

image-20220401102926848

至此,IPv6网络可以无感知地访问IPv4网络。

我们根据上面的实验结果来梳理一下NAT64和DNS64的工作流程。

1、IPv6主机(这里以Win10-2为例)发起到DNS服务器(IPv6地址是2001:1::1,也就是DNS代理设备)的IPv6域名解析请求,解析域名为www.test.com。

2、DNS代理设备触发到DNS服务器(218.1.1.2)的IPv6地址查询。若能查询到则返回域名对应的IPv6地址;若查询不到,则返回空。这里的DNS服务器(218.1.1.2)上只有A记录,没有AAAA记,所以返回空。

3、DNS代理再次触发到DNS服务器(218.1.1.2)的IPv4地址查询。DNS服务器返回的IPv4地址是218.1.1.3,这个IPv4的值会返回给Win10-2。

4、DNS代理设备又配置了DNS64功能,用配置的前缀2001:2::/96再加32位的IPv4地址(218.1.1.3,转化成十六进制是da01:103)组合成IPv6地址,即2001:2::da01:103,DNS代理设备把这个IPv6地址也返回给Win10-2主机。

5、Win10-2主机实际上得到了IPv4地址218.1.1.3和IPv6地址2001:2::da01:103,由于没有配置IPv4地址,ping显示出来的是IPv6地址(即使配置了IPv4地址,因默认的IPv6优先,ping显示的仍然是IPv6地址,可以使用nslookup命令验证,实际上返回了IPv4和IPv6的地址。如果DNS代理设备中没有配置name-server 218.1.1.2,则不会返回IPv4的地址)。Win10-2发起目的地址为001:2::da01:103的IPv6数据包,这个数据包被转发给NAT64设备。

6、NAT64执行地址转换和协议转换,目的地址转换为218.1.1.3,源地址转换为218.1.1.1。该数据包在IPv4网络内被路由到目的地(218.1.1.3)。

7、IPv4数据包返回,目的地址为218.1.1.1。该数据包返回到NAT64设备。

8、NAT64设备根据已有的转换记录表进行转换,目的地址转换为Win10-2的IPv6地址,源地址为加了IPv6前缀的IPv4地址2001:2::da01:103。

9、Win10-2收到www.test.com返回的数据包,至此数据往返通信成功。

4.3、其他转换技术

4.3.1、IVI技术

IVI是一种基于运营商路由前缀的无状态IPv4/IPv6转换技术,是由CERNET2的研究人员、清华大学李星教授等提出,发布于RFC 6052
中。IVI的主要思路是从全球IPv4地址空间中取出一部分地址映射到全球IPv6地址空间中,其映射规则是在IPv6地址中插入IPv4地址。地址
的0~31位为ISP的/32位的IPv6前缀,32~39位设置为FF,表示这是一个IVI映射地址。40~71位表示插入的全局IPv4空间的地址格式,72~128位全为0。为了便于讲解,这里以下图为例。假如某公司申请了IPv4公网地址218.1.1.0/24,申请了IPv6地址2001:1::/32。

image-20220331220342384

公司现在所有的业务都运行在纯IPv6网络上,但有些业务仍要支持IPv4访问。服务器配置的IPv6网络前缀是2001:1:ffda:0101::/64,其中da:0101由IPv4地址218.1.1转换而来。假如IPv4网络中的1.1.1.1要访问218.1.1.2,则数据包被路由到IVI设备(IVI是双栈)。IVI根据映射规则,把源IPv6地址转换成2001:1:ff01:0101:0100::/128,2001:1/32是公司IPv6前缀,接下来的ff表示IVI映射地址,后面的01:0101:01由IPv4地址转换而来。IVI根据映射规则把目的IPv6地址转换成2001:1:ffda:0101:0200::/128,该数据包经IVI设备被发往IPv6网络。IPv6网络根据路由,把返回的数据包发回到IVI设备,IVI设备把源和目的IPv6地址根据IVI映射规则转换成IPv4地址,然后把数据包发往IPv4网络。这种IPv4和IPv6的转换是固定的一对一的转换,所以不需要记录转换关系(即无状态协议转换)。IVI除了进行地址映射外,还根据标准规定实现IPv4/ICMP协议各字段的对译,同时更新TCP/UDP协议的相关字段,完成整个数据包的转换操作。IVI在可扩展性和安全性方面优于NAT64,缺点是IVI的支持设备较少。

4.3.2、Smart6和Space6

Smart6和Space6类似于NAT64技术,都是用来解决IPv6用户访问IPv4资源的问题。通过将Smart6/Space6网关部署在IDC(Internet Data Center,互联网数据中心)出口,可以使IPv6用户访问IPv4的ICP/ISP(Internet Content Provider/Internet Service Provider,互联网内容提供商/互联网服务提供商)资源,从而达到迁移IPv6流量,促进用户向IPv6演进的目的。

5、过渡技术选择

好了、讲了这么多的IPv6过渡技术,在具体的业务场景中我们该选择何种技术类型来进行业务适配呢?其实,每种过渡技术都有各自的优缺点,因此需结合实际需求在不同的场景下选择不同的过渡技术:对于新建业务系统的场景,推荐采用双栈技术,它同时支持IPv4和IPv6;对于多个孤立IPv6网络互通的场景,如多个IPv6数据中心的互联,可以采用隧道技术,让IPv6数据封装到IPv4网络上传输,以减少部署的成本和压力;对于已经上线的业务系统,若不方便改造成双栈,可以采用地址协议转换技术。

推荐文章