dibbler-server是一个实现DHCPv6的应用层软件,用于给客户端提供IPv6地址分配。

dibbler-server支持IPv6地址分配、前缀委派等,本文总结了在前缀委派时需要的配置和可能出现的错误。

在 DHCPv6 前缀委派(PD)配置中,pd-length 和 pd-pool 的参数关系直接影响前缀分配的逻辑合理性:

参数关系

pd-length必须严格大于pd-pool定义的前缀长度。例如,若pd-pool定义为3000:458:aa31:5700::/48(48 位前缀),则pd-length应设为56或64等更大的数值。若两者相等(如均为 48),服务器无法分割前缀池,只能将整个/48分配给一个客户端,导致后续请求无法分配前缀。

分配失败的原因分析

  1. 地址空间耗尽:当pd-length=48 时,每个客户端需要占用整个 /48 前缀池。一旦分配一次,池中再无可用前缀,后续请求因资源不足失败。
  2. 逻辑冲突:DHCPv6 前缀委派的核心机制是将父前缀拆分为子前缀。若无法分割(长度相同),服务器会判定配置错误或忽略请求。

扩展性与多客户端支持

若需支持多个客户端,需确保 pd-length 比 pd-pool 前缀长度至少大 8 位(如 /48 → /56)。例如:

  1. 父前缀3000:458::/40搭配pd-length=48,可分配256个/48子网。
  2. 多池配置允许客户端从多个池各获一个子前缀,但每个池仍需满足pd-length > pd-pool 的规则。

故障排查

下面给出pd-lengthpd-pool相等时dibbler-server的相关日志,

25:58 Server Warning   Prefix pool /56 defined and clients are supposed to get /56 prefixes. Only ONE client will get prefix

示例

iface "wan" {

 // also ranges can be defines, instead of exact values
 t1 18-20
 t2 27-30
 prefered-lifetime 36
 valid-lifetime 72

# assign addresses from this pool
 class {
   pool 2020:6789::1000 - 2020:6789::2000
 }

# assign temporary addresses from this pool

 ta-class {
    pool 2001:db8:2222::/96
 }

#assign /56 prefixes from this pool
 pd-class {
     pd-pool 3000:458:aa31:5700::/48
     # 这里要配置为56,同时上面要配置为48
     pd-length 56
 }

# provide DNS server location to the clients
 option dns-server 2020::ff,2020::fe
}

上面的配置中dibbler-server从前缀池3000:458:aa31:5700::/48中向客户端分配/56前缀,可以分配$2^8=256$个前缀给客户端。

上面配置的前缀池大小为/48,分配给客户端的前缀长度为pd-length 56,如果这两者相等服务器则无法分隔前缀池,只能将整个前缀分配给一个客户端,导致后续请求无法分配前缀。

参考文档

  1. RFC 8168 - DHCPv6 Prefix-Length Hint Issues
  2. sourceforge.net