DHCPv6 是 IPv6 环境下地址分配的一种协议,可以将网络配置参数从服务器段分配到客户端。DHCPv6-PD(Prefix Delegation,前缀分配)是 DHCPv6 的扩展,字如其名,其注重的是前缀分配,即服务器端将一个子网范围的前缀地址段和其他网络配置(如 DNS)下发到客户端。

当服务器端将一个前缀下发给客户端(当然这个客户端一般是边界路由器),同时会在这个客户端的上联设备上生成对应的路由,此时你可以在这个客户端(路由器)的本地接口上使用这个前缀下的任意 /64 子网地址。

类比 IPv4,相当于运营商给你了个 /24,这个 /24 内其他地址你说了算,可以在你的网络中任意分配。DHCPv6-PD 描述的就是这样一个过程。

DHCPv6-PD请求过程

请求

  • PD客户端向PD服务器发送DHCPv6请求报文,此报文携带IA_PD选项,表明自己需要申请IPv6前缀。
  • PD服务器收到请求报文后,从自己的前缀列表池中取出可用的前缀,附带在IA_PD选项中,回复给PD客户端。

续租

  • 前缀分配到期后,PD客户端重新向PD服务器发送DHCPv6请求报文,请求更新前缀。
  • PD服务器重新为PD客户端分配前缀(在原有前缀未被占用的情况下,一般就是续租)。

释放

  • PD客户端需要释放前缀时,向PD服务器发送快速请求报文,以释放前缀。
  • PD服务器接收快速请求报文后,回收前缀,并对PD客户端的快速请求报文进行回应。

动态?固定?

动态和固定似乎是一个冲突的事情,但是 DHCPv6 PD 中为我们提供了一个“机会”,将 DHCPv6 DP 服务器申请前缀。后面会说为什么是“机会”。

Hint 申请固定前缀

一般情况下可以从 PPPoE 接口通过 DHCPv6 协议获取前缀或地址,如下图。

20241025003520

选择接口是 PPPoE 接口,Request 类型为 Prefix(前缀)。为了更好的分配这个前缀,我们可以把它们放到一个地址池中,以我这边为例,地址池的长度为/64,名称是 pool_v6_cmnet。

Prefix Hint 为你要申请的前缀,你有两种方式可以获取它。1)你对你们当地的网络非常了解,你可以直接写一个没有在用,且合法的地址作为 Hint,相当于自选前缀。2)留空,保存,等待分配一次,将分配的结果写在这里。

通过这个选项,在一定程度上,我们就有了一个相对固定的前缀。

抓包分析

在上面的内容中,我们分析了 DHCPv6-PD 请求过程。下面我们通过抓包的方式来观察一下这个过程。

  1. DHCPv6 Solicit,当 ROS 配置 DHCPv6 Client 的 Request 类型为前缀时,IAPD 的 Option 为 25,表示是在请求前缀。Option 26 表示你要进行请求的前缀信息,也就是 Hint 的值。

20241025082922

  1. DHCPv6 Advertise,服务器端通过该报文确认 Prefix 可用,返回和上文一致的 IAID。如果不可用则返回一个可用的 Prefix。同时可能通过其它 Option 来下发其它网络信息,例如下图通过 Option 23 下发 DNS 配置。

20241025083038

  1. DHCPv6 Request,客户端通过该报文向服务器请求,确认占用 Prefix,IA Prefix 和 IAID 应该和上文一致。

20241025083141

  1. DHCPv6 Reply,服务器确认分配,过程结束。

20241025083242

为什么说只是个机会?

从实测看,部分地区确实不支持 Option 26。虽然你携带了相关的前缀,但是在 DHCPv6 Advertisese 的过程中会拒绝你申请的前缀,并给你返回一个新的前缀。这样的话,这个功能就没有效果了。

第二种情况就是,当你长时间不在线的时候,可能会存在 DHCPv6 地址租约过期等原因,前缀会被其它用户所使用。此时你再上线,你也无法和在线用户抢夺之前的前缀,你的前缀也就会变化了。