DHCPv6-PD
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 地址,并可进一步通过自动地址配置技术下发给最终客户主机使用。
DHCPv6-PD 请求过程
- PD 客户端向 PD 服务器发送 DHCPv6 请求报文,此报文携带 IA_PD 选项,表明自己需要申请 IPv6 前缀。
- PD 服务器收到请求报文后,从自己的前缀列表池中取出可用的前缀,附带在 IA_PD 选项中,回复给 PD 客户端。
- 前缀分配到期后,PD 客户端重新向 PD 服务器发送 DHCPv6 请求报文,请求更新前缀。
- PD 服务器重新为 PD 客户端分配前缀(在原有前缀未被占用的情况下,一般就是续租)。
- PD 客户端需要释放前缀时,向 PD 服务器发送快速请求报文,以释放前缀。
- PD 服务器接收快速请求报文后,回收前缀,并对 PD 客户端的快速请求报文进行回应。
从上述通信过程可以看出,DHCPv6-PD 与 DHCPv6 的主要区别就是前者申请的是前缀,后者申请的是地址。
网络拓扑

- FW1 的 port2 从 DHCPv6-PD 服务器获取 IPv6 地址和 Prefix,port3 通过 Delegate(继承)的方式从 port2 获取 IPv6 前缀,配合自身配置的 subnet 组成 port3 的 IPv6 地址。
- FW1 的 port3 开启 delegated DHCP Server,为内网 PC 分配 port2 获取的前缀中的 IPv6 地址。
配置步骤
FW1(模拟 ISP)
FW1 配置 DHCPv6 Server,模拟 Internet 运营商。

config system interface edit "port2" config ipv6 set ip6-address 2100::1/64 set ip6-send-adv enable set ip6-manage-flag enable set ip6-other-flag enable end next endFW1 开启 DHCPv6-PD 服务器,该功能只能在 CLI 开启。在 config system dhcp6 server 中,config prefix-range 为 PD 的配置,这里的配置就是可以给 FW2 分配的 Prefix 范围。
重要
这个范围不能超过 prefix-length,比如运营商的地址池为 60 位,分配的 prefix 为 64 位,则最多可以分配 2(64-60)=16 个 prefix,否则下发配置报错。
config system dhcp6 server edit 1 set subnet 2100::/60 set interface "port2" config prefix-range edit 1 set start-prefix 2100:0:0:3:: set end-prefix 2100:0:0:4:: set prefix-length 64 next end config ip-range edit 1 set start-ip 2100::2 set end-ip 2100::63 next end set dns-server1 2200::64 next end
FW2(模拟用户边界设备)
FW2 上配置 port2 接口的 IPv6 为 DHCP 方式获取,并开启 DHCPv6 prefix delegation,填写 DHCPv6 prefix hint 为想要从 DHCPv6-PD 服务器获取的 prefix。
重要
这里的 DHCPv6 prefix hint ID(dhcp6-iapd-list ID)最好配置为 1,否则在下步 GUI 配置继承接口时,无法选择到上游接口(CLI 可以配置)。
如果不知道需要向运营商申请哪一个 prefix,请填写为::/0,表示不指定请求的 prefix,让运营商选择分配的 prefix。

config system interface edit "port2" config ipv6 set ip6-mode dhcp set dhcp6-prefix-delegation enable config dhcp6-iapd-list edit 1 set prefix-hint 2100:0:0:3::/64 //可以填写为::/0或不填写,表示不指定请求的prefix,让运营商选择分配的prefix// next end end next end在 FW2 的 port3 上,设置 IPv6 的 IP 地址获取模式为“委派”,配置“IPv6 上行接口”为 port2,并配置“IPv6 Subnet”,从 port2 继承 prefix 后,加上配置的 subnet 地址,就组成了 port3 的 IPv6 地址。
重要
如果 GUI 中无法选择 IPv6 上行接口,可通过 CLI 配置。

config system interface edit "port3" config ipv6 set ip6-mode delegated set ip6-delegated-prefix-iaid 1 //与步骤1中port2下配置的dhcp6-iapd序列号对应// set ip6-upstream-interface "port2" set ip6-subnet ::1/64 //获取prefix后填充的子网IPv6// end next end那么 FW2 获取到这个 prefix 之后,除了可以分配给 port3 使用,还有什么作用呢?还可以通过自建 DHCPv6 服务器,将该 Prefix 中的 IPv6 分配给内网的 IPv6 客户端。
在 FW2 上的 port3 开启 DHCPv6 服务器,配置 subnet 为 port3 接口网段,配置 DNS Server,开启 Stateful Server,配置分配 IP mode 为 Delegated,配置 upstream interface 为 port2,从 port2 获取的 prefix 分配 IP 地址给 port3,。
重要
该配置需要在 CLI 下配置,在 GUI 下配置会出现无法下发的情况。
config system dhcp6 server edit 1 set subnet 2100:0:0:3::/64 set interface "port3" set ip-mode delegated set upstream-interface "port2" set delegated-prefix-iaid 1 //重要步骤:配置中引用port2中配置的IAPD// set dns-server1 2200::64 next end再次在 FW2 查看 port3 的配置,可以看到 RA、M Flag、O Flag 均被开启。
config system interface edit "port3" config ipv6 set ip6-mode delegated set ip6-delegated-prefix-iaid 1 set ip6-send-adv enable set ip6-manage-flag enable set ip6-other-flag enable set ip6-upstream-interface "port2" set ip6-subnet ::1/64 end next end
结果验证
DHCPv6-PD
在 FW2 上查看 port2 获取到的 IPv6 地址。

FW2 # diagnose ipv6 address list | grep port2 dev=4 devname=port2 flag=P scope=0 prefix=128 addr=2100::2 preferred=4294967295 valid=4294967295 cstamp=352820 tstamp=352820 ...在 FW1 上查看分配的 DHCPv6 客户端,可以看到 FW1 向 FW2 分别分配了一个 IPv6 地址和一个 IPv6 prefix,prefix IAID 为 FW2 的 port2 配置的 IAID 1,DUID(DHCPv6 Unique Identifier)为 FW2 的 DUID。

FW1 # exe dhcp6 lease-list Interface DUID IAID IP/Prefix Expiry port2 00:03:00:01:50:00:00:02:00:01 1 2100:0:0:3::/64 Tue Apr 11 17:33:19 2023 port2 00:03:00:01:50:00:00:02:00:01 4 2100::2 Tue Apr 11 17:33:19 2023查看 FW1 IAPD( Identity Association for Prefix Delegation)的 debug 信息(
diagnose debug application dhcp6s -1)。
抓包查看以上获取过程。
客户端 DHCPv6 请求中既包含 IPv6 地址请求,也包含 prefix 的请求(IAPD),请求的 Prefix 与配置的一致,这里看到的 IAID 的值与 dhcp6-iapd-list 的 ID 一致,如果配置了多个 dhcp6-iapd-list,则会携带多个 IAPD 请求。

服务器通过 DHCPv6 Advertise 告知可用的 IPv6 地址,并确认该 prefix 可用,返回的 prefix IAID 也为 1。

客户端请求确认占用该 IPv6 地址和 prefix,IAID 与 dhcp6-iapd-list 的 ID 一致,如果配置了多个 dhcp6-iapd-list,则会携带多个 IAPD 请求。

服务器返回 Reply 确认分配 IPv6 与 Prefix,原报文见附件。

查看 FW2 上的 port3 继承获取的 IPv6 地址,可以看到 port3 已经从 port2 的 DHCP - PD Client 获取到了前缀,加上自己的 subnet Address,组成了自己的 IPv6 地址。

FW2 # diagnose ipv6 address list | grep port3 dev=5 devname=port3 flag=P scope=0 prefix=64 addr=2100:0:0:3::1 preferred=4294967295 valid=4294967295 cstamp=485929 tstamp=485929 ...
DHCPv6 Client
配置 PC 客户端的 IPv6 获取方式为自动获取。

查看获取的 IPv6 地址、默认网关与 DNS 服务器,可以看到 PC 成功获取到了 upstream delegated prefix 中的 IPv6 地址。

在 FW2 上查看 DHCP Client 列表,DUID 为 PC 客户端的 DUID,IANA 的 IAID 与客户端申请时的 IAID 一致(100666409)。
FW2 # exe dhcp6 lease-list Interface DUID IAID IP/Prefix Expiry port3 00:01:00:01:2b:bc:4f:c8:00:0c:29:ae:55:70 100666409 2100:0:0:3::2 Tue Apr 11 18:30:05 2023FW2 上 IAPD( Identity Association for Prefix Delegation)的 debug 信息(
diagnose debug application dhcp6s -1)。... [debug]dhcp6_get_options() get DHCP option option request, len 6 [debug] requested option: vendor specific info [debug] requested option: DNS [debug] requested option: domain search list [debug]react_confirm() found a host configuration named 00:01:00:01:2b:bc:4f:c8:00:0c:29:ae:55:70 ...