1、什么是DHCPv6-PD

前面我们介绍的都是IPv6环境下的地址自动配置技术,其地址配置模式采用的是“客户机-服务器”或“客户机-中继代理-服务器”模式,这也是常见的地址配置模式,服务器直接面对客户主机。在这种模式下,当客户主机段越来越多时,地址分配及管理上就容易发生凌乱,特别是对于实施了层次化网络环境的运营商,网络核心如果直接面对用户主机的地址分配,一方面与层次化地址分配原则相悖,另一方面也会增加地址管理和服务器的负担。正因为如此,RFC3633中定义了一种DHCPv6-PD模式,专门用于自动分配前缀。

DHCPv6-PD(Prefix Delegation,前缀分配)是DHCPv6的扩展,传统的DHCPv6注重的是将地址等网络配置参数从服务器端传递给IPv6客户主机,而DHCPv6-PD注重的是前缀分配,即PD服务器端将一个子网范围的前缀地址段以及DNS等其他网络配置信息下发给PD客户端,这就意味PD服务器下发的是一个“子网地址段”,而不是具体的可以直接供主机使用的IPv6地址。举个例子,PD服务器可以将2022:da8::/60前缀通过某个IPv6接口下发给PD客户端,同时一般会在PD客户端的上联设备上生成相应的路由。PD客户端收到该前缀后,可以在本地IPv6接口上动态使用该前缀的/64子网地址。

那么DHCPv6-PD到底用在什么场景中呢?这样做又有什么好处呢?DHCPv6-PD在运营商场景中最为常见,当然也可以用在其他较大的分层设计的网络中。以运营商为例,DHCPv6-PD服务器往往是供应商边界(Provider Edge,PE)路由器,而DHCPv6-PD客户端则是客户前置设备(Customer Premise Equipment,CPE)路由器。首先,PE路由器作为PD服务器,会提前设置好一定范围的前缀分配列表,然后将这些前缀列表通过直连CPE的接口自动分配给各个CPE路由器。然后,CPE路由器从上联接口收到PE路由器自动分配的前缀后,对此前缀做子网划分,这个子网划分一般是提前规划好并应用在各个下联接口的。待获取到前缀后,CPE路由器自动就在各个下联接口下生成了IPv6地址,并可进一步通过自动地址配置技术下发给最终客户主机使用。听起来还是有点抽象,这里以实验拓扑来说明,如下图所示:

image-20220223102908563

在上图中,R1是PD服务器,往往也是运营商的PE设备;R2和R4都是PD客户端,往往也是CPE设备;Win10和Win7是最终客户主机。首先,作为PD服务器的R1会设置一个一定范围的本地前缀列表,这个前缀列表指定了两个前缀长度,第一个前缀长度是整个PE可分配的前缀长度,第二个前缀长度是具体分配给每个PE客户端的前缀长度,且第二个长度不能小于第一个长度。举例说明,假定R1定义了待分配的前缀地址列表,其范围是2022:1: 1100::/40,分配的前缀长度是48位。那么也就是说本地可分配给PD客户端的前缀就是2022:1:1100::/48、2022:1:1101::/48、2022:1:1102::/48、…、2022:1:11FF::/48,总共就是2(48-40)=256个48位前缀,也就是支持256个PD客户端。当R2和R4作为PD客户端分配到各自的/48位前缀后,就可以通过其他自动地址配置技术继续给自己的下联终端分配具体的IPv6地址。这样做以后,PD服务器(一般是PE)可以灵活地为下联设备及终端自动分配和回收IPv6前缀(也就是自动生成及更新下联路由)。下联的PD客户端不用
关心具体使用什么前缀什么地址,上端的PD服务器下发通告什么前缀,自己就使用什么前缀,并根据此前缀再划分子网给自己的下联终端主机使用即可。

作为DHCPv6的扩展,DHCPv6-PD同样使用UDP的546端口和547端口在服务器与客户端之间通信,只不过在通信中携带了IA_PD选项,其通信过程大致如下。

1.PD客户端向PD服务器发送DHCPv6请求报文,此报文携带IA_PD选项,表明自己需要申请IPv6前缀。

2.PD服务器收到请求报文后,从自己的前缀列表池中取出可用的前缀,附带在IA_PD选项中,回复给PD客户端。

3.前缀分配到期后,PD客户端重新向PD服务器发送DHCPv6请求报文,请求更新前缀。

4.PD服务器重新为PD客户端分配前缀(在原有前缀未被占用的情况下,一般就是续租)。

5.PD客户端需要释放前缀时,向PD服务器发送快速请求报文,以释放前缀。

6.PD服务器接收快速请求报文后,回收前缀,并对PD客户端的快速请求报文进行回应。

从上述通信过程可以看出,DHCPv6-PD与DHCPv6的主要区别就是前者申请的是前缀,后者申请的是地址。服务器在分配时,都是以客户端的DUID来识别客户。分配前缀时,其IA类型是IA_PD;分配地址时,IA类型是IA_NA或IA_TA,都同样用IAID来做分配信息的索引。有意思的是,DHCPv6-PD在分配前缀时,在PD客户端的上联设备(可能是PD服务器,也可能是DHCPv6中继)上会自动生成前缀对应的直连客户接口的路由。同时,还可以下发DNS等信息给DHCPv6-PD客户端。需要注意的是,客户端除了根据获得的前缀自动来划分子网给下联用户外,其他DNS等信息不能自动下发。

2、DHCPv6-PD测试

本实验将实现一个简单的DHCPv6-PD前缀的自动分配,同时PD客户端上提前预留好前缀位置,只保留子网部分及接口ID。待从PD服务器获得前缀后,组成完整的IPv6地址,并通过自动配置技术给下联主机分配地址。通过本实验,读者可以加深对DHCPv6-PD的理解。

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)#service dhcp
R1(config)#ipv6 local pool ?         
  WORD  Create named local prefix pool

# 定义本地前缀列表池,列表池的名字是prefix_pool
R1(config)#ipv6 local pool prefix_pool 2022:1:ab00::/40 48
# 创建DHCP地址池,名字是dhcpv6-pd
R1(config)#ipv6 dhcp pool dhcpv6-pd
# DHCPv6地址池引用前缀列表,而不是地址
R1(config-dhcpv6)#prefix-delegation pool prefix_pool 
R1(config-dhcpv6)#exit
R1(config)#exit
R1(config)#ipv6 dhcp pool dhcpv6-pd   

# 这里我们需要用到R4的DUID、查询结果如下
R4#sh ipv6 dhcp
This device's DHCPv6 unique identifier(DUID): 00030001AABBCC000500
R4#                                       

# 00030001AABBCC000500 为指定的DUID分配保留前缀,类似于为指定DUID分配保留地址。路由器的DUID可以在启用IPv6路由协议后,使用show ipv6 dhcp命令查看
R1(config-dhcpv6)#prefix-delegation 2022:1:abff::/48 00030001AABBCC000500
# 分配DNS地址
R1(config-dhcpv6)#dns-server 240c::6666
R1(config-dhcpv6)#exit 
R1(config)#int eth0/0
R1(config-if)#ipv6 enable 
R1(config-if)#ipv6 add 2021::1/64
# 指定用于前缀分配的地址池
R1(config-if)#ipv6 dhcp server dhcpv6-pd
R1(config-if)#no shutdown 
R1(config-if)#exit
R1(config)#int ethernet 0/1
R1(config-if)#ipv6 enable 
R1(config-if)#ipv6 add 2020::1/64
R1(config-if)#ipv6 dhcp server dhcpv6-pd
R1(config-if)#no shutdown 
R1(config-if)#end
R1#wr
Building configuration...
[OK]
R1#

这里重点说一下定义的前缀列表池:2022:1:ab00::/40 48,后面的48表示分配给PD客户端的前缀长度是48位。前面的/40再结合48,就可以确定前缀地址池的范围,且前面的数字不能大于后面的数字。这与IPv4的prefix-list前缀列表类似。这里定义的前缀列表池是2022:1:ab00::/40 48,则分配的前缀就是2022:1:ab00::/48、2022:1:ab01::/48、…、2022:1: abff::/48,共计2(48-40)=256个48位前缀。思科路由器在进行前缀分配时,可以对指定DUID的客户端分配保留的前缀。

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)#service dhcp  
# 创建DHCP地址池,名字是dns_delegation
R2(config)#ipv6 dhcp pool dns_delegation
# 此DNS地址是为R2的下联客户主机分配的
R2(config-dhcpv6)#dns-server 240c::8888
R2(config-dhcpv6)#int eth0/0
R2(config-if)#ipv6 enable
# 上联R1的接口地址进行自动配置即可,并且引入默认路由
R2(config-if)#ipv6 add autoconfig default 
# 设置接口为申请PD的DHCPv6客户端,并将申请到的前缀命名为prefix_from_isp,供下联接口使用
R2(config-if)#ipv6 dhcp client pd prefix_from_isp
R2(config-if)#no shutdown 
R2(config-if)#int eth0/1
R2(config-if)#ipv6 enable
# 设置地址前缀部分为从上联接口分配到的48位前缀prefix_from_isp,再追加后面的部分
R2(config-if)#ipv6 add prefix_from_isp ::1:0:0:0:1/64
R2(config-if)#ipv6 nd other-config-flag 
# 为下联主机采用无状态DHCPv6
R2(config-if)#ipv6 dhcp server dns_delegation
R2(config-if)#no shutdown 
R2(config-if)#int eth0/2
R2(config-if)#ipv6 enable
R2(config-if)#ipv6 add prefix_from_isp ::2:0:0:0:1/64
R2(config-if)#ipv6 nd other-config-flag 
R2(config-if)#ipv6 dhcp server dns_delegation
R2(config-if)#no shutdown 
R2(config-if)#end
R2#wr
Building configuration...
[OK]
R2#

对于PD客户端的配置,可以得出以下结论。对上联到PD服务器的接口,通过命令ipv6 dhcp client pd将其设置成PD客户端,然后发送请求获取前缀,并将获取到的前缀进行命名,为下联接口的配置做准备。下联接口在设置IPv6地址时,先引用自动获取的前缀名,再补充剩余的含有子网划分字段的位数,从而组成完整的IPv6地址。PD服务器分配前缀时,允许将DNS等选项分配给PD客户端,但这些非前缀信息只能发送到PD客户端,不能将其自动下发给PD客户端下联的客户主机。

参照R2的配置,配置另一台PD客户端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)#service dhcp
R4(config)#int eth0/0
R4(config-if)#ipv6 enable 
R4(config-if)#ipv6 add autoconfig default 
R4(config-if)#ipv6 dhcp client pd prefix_from_isp
R4(config-if)#no shutdown 
# 用本地环回接口模拟IPv6网段
R4(config-if)#int lo0
R4(config-if)#ipv6 enable 
R4(config-if)#ipv6 add prefix_from_isp ::2022:0:0:2022:1/64
R4(config-if)#end
R4#wr
Building configuration...
[OK]
R4#

测试PE客户端。设置好R1、R2和R4后,在R1上用命令show ipv6 dhcp binding查看前缀分配情况,显示如下:

R1#  show ipv6 dhcp binding
Client: FE80::A8BB:CCFF:FE00:200 
  DUID: 00030001AABBCC000200
  Username : unassigned
  VRF : default
  Interface : Ethernet0/0
  IA PD: IA ID 0x00030001, T1 302400, T2 483840
    Prefix: 2022:1:AB00::/48
            preferred lifetime 604800, valid lifetime 2592000
            expires at Apr 07 2016 10:50 PM (2591832 seconds)
Client: FE80::A8BB:CCFF:FE00:500 
  DUID: 00030001AABBCC000500
  Username : unassigned
  VRF : default
  Interface : Ethernet0/1
  IA PD: IA ID 0x00030001, T1 302400, T2 483840
    Prefix: 2022:1:ABFF::/48
            preferred lifetime 604800, valid lifetime 2592000
            expires at Apr 07 2016 10:50 PM (2591839 seconds)
R1#

R2#show ipv6 dhcp 
This device's DHCPv6 unique identifier(DUID): 00030001AABBCC000200
R2#
R4#show ipv6 dhcp
This device's DHCPv6 unique identifier(DUID): 00030001AABBCC000500
R4#

从输出中可以看到,Client是R2和R4请求分配前缀的接口的链路本地地址,DUID是R2和R4设备的DUID(可在路由器上使用命令show ipv6 dhcp查看),IA类型是IA PD(即前缀分配),IA ID是IA的标识,T1和T2分别是更新时间和重新绑定时间。这里分配了两个前缀:2022:1:AB00::/48分配给了R2;2022:1:ABFF::/48分配给了R4。这两个前缀一般是按顺序分配,R4之所以分配到最后一个,是因为PD服务器上配置了前缀保留。

使用show ipv6 route命令查看R1路由表,显示如下:

R1#show ipv6 route
IPv6 Routing Table - default - 7 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
C   2020::/64 [0/0]
     via Ethernet0/1, directly connected
L   2020::1/128 [0/0]
     via Ethernet0/1, receive
C   2021::/64 [0/0]
     via Ethernet0/0, directly connected
L   2021::1/128 [0/0]
     via Ethernet0/0, receive
# 分配给R2的地址
S   2022:1:AB00::/48 [1/0]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/0
# 分配给R4的地址
S   2022:1:ABFF::/48 [1/0]
     via FE80::A8BB:CCFF:FE00:500, Ethernet0/1
L   FF00::/8 [0/0]
     via Null0, receive
R1#

从输出中可以看到,即便没有手动添加静态路由器表,R1仍然对分配给R2和R4的48位前缀分别生成了一条静态路由。在R2上验证配置。使用命令show ip name-server查看从R1自动分配的DNS地址,显示如下:

R2#show ip name-server
240C::6666

在R2上使用命令show ipv6 interface brief查看利用分配的前缀给下联接口生成的IPv6地址,显示如下:

R2#show ipv6 interface brief
Ethernet0/0            [up/up]
    FE80::A8BB:CCFF:FE00:200
    2021::A8BB:CCFF:FE00:200
Ethernet0/1            [up/up]
    FE80::A8BB:CCFF:FE00:210
    2022:1:AB00:1::1
Ethernet0/2            [up/up]
    FE80::A8BB:CCFF:FE00:220
    2022:1:AB00:2::1
Ethernet0/3            [administratively down/down]
    unassigned
R2#

测试最终DHCP客户端。Win10和Win7的IPv6地址采用自动配置。在Win7主机上使用命令ipconfig /all查看获得的地址等情况,如下图所示。

image-20220308215722808

从上图中可以看出,获取到的DNS是R2上的无状态DHCPv6配置分配的(240c::8888),而不是R1这台PD服务器分配的(240C::6666)。地址是根据R2的ethernet0/2接口发送的RA报文自动生成的。
在Win7主机上测试到路由器R1接口ethernet0/1的IPv6地址的可达性,其结果如下图所示。

image-20220308215956648

从上图中可以看出,即便本实验的所有路由器都没有手动添加静态路由,Win7也可以访问它们。这主要是因为DHCPv6-PD在进行层次化地址分配时,会自动添加静态路由。在R4上执行命令show ipv6 interface brief loopback 0,显示如下:

R4#show ipv6 interface brief loopback 0
Loopback0              [up/up]
    FE80::A8BB:CCFF:FE00:500
    2022:1:ABFF:2022::2022:1
R4#

在Win7上ping R4的loopback 0的IPv6地址2022:1:ABFF:2022::2022:1,可以ping通。Win10的测试过程与Win7的相同,这里不再演示。Win10和Win7相互之间也能ping通。

image-20220308220229068

在实际应用场景中,PD客户端并不总是与PD服务器直连,而是架设独立的DHCPv6服务器进行集中管理,PD客户端的上联设备仅执行中继转发。感兴趣的小伙伴可以参考已学内容自行完成在中继存在时的DHCPv6-PD实验,这里不再赘述。

推荐文章