注:本文为 “IPv6 地址分配 | Stateless(无状态)与Stateful(有状态)” 相关文章合辑。
未整理去重。
有状态与无状态配置 IPv6 地址
作者:小慢哥本人 2019-10-09 08:29:30
一. Link-Local Address 的生成方式
生成 “链路本地地址”,有 2 种方式
▷ 手动配置
▷ 自动配置
其中 “自动配置” 根据算法,又分为
▷ eui64:根据 mac 地址换算而来
▷ stable_secret:跟随网络环境的变化而变化,处于固定网络环境时其值将固定
▷ random:随机生成
二. Global Address 的生成方式
生成 “全球单播地址”(或者 “唯一本地地址”),有两种方式
▷ 手动配置
▷ 自动配置
其中 “自动配置” 根据获取方式,又分为
▷ 无状态(Stateless)
根据路由通告报文 RA(Router Advertisement)包含的 prefix 前缀信息自动配置 IPv6 地址,组成方式是 Prefix + (EUI64 or 随机)。Stateless 也称为 SLAAC(Stateless address autoconfiguration)
▷ 有状态(Stateful)
通过 DHCPv6 方式获得 IPv6 地址
其中 “有状态” 又分为 2 种
▷ 有状态 DHCPv6(Stateful DHCPv6)
IPv6 地址、其他参数(如 DNS)均通过 DHCPv6 获取
▷ 无状态 DHCPv6(Stateless DHCPv6)
IPv6 地址依然通过路由通告 RA 方式生成,其他参数(如 DNS)通过 DHCPv6 获取
为了避免混淆,在此解释下有状态、无状态到底是什么。
首先,请明确一点,有状态、无状态仅针对于 IPv6 地址分配方式,并不包含其他参数.
▷ 有状态:可控、可管理
在网络中存在一个 IP 地址管理者,它能够识别客户端,根据不同的客户端,分配对应的 IPv6 地址,客户端与服务端之间需要维护 IP 地址的租期及续约。目前实现这种效果的,就是 DHCPv6 协议,IP 地址管理者就是 DHCPv6 Server
▷ 无状态:不可控、难管理
在网络中只有网关,没有 IP 地址管理者。因此无人去识别客户端,每个客户端根据网关发送的相同的 RA 报文内容,自行配置 IPv6 地址
三. RA 报文中 3 个关键的 Flag

RA 报文中存在 3 个关键的 flag bit:
| flag type | 状态 | 置位(bit) | 含义 |
|---|---|---|---|
| Autonomous flag(A flag) 表示是否配置无状态 IP。 在一个 RA 报文中,可存在多个 prefix,比如 2401::/64、2402::/64、2403::/64,每个 prefix 都可以独立配置 A flag。 | on | 1 | 表示客户端应当在该 prefix 范围内自动生成 IPv6 地址(客户端通过 DAD 自行保证地址可用),并配置子网路由条目、网关。 |
| off | 0 | 表示客户端不应当在该 prefix 范围内自动生成 IPv6 地址,但是可以配置子网路由条目、网关。 | |
| Managed flag(M flag) 表示是否配置有状态 IP。 M flag 是 RA 报文的全局参数,一个 RA 报文只有一个 M flag。 | on | 1 | 表示在 stateless 流程结束后开始 stateful 流程,也就是告诉客户端可以通过 DHCPv6 来获得 IPv6 地址和其他参数(如 DNS 列表) |
| off | 0 | 表示不通过 DHCPv6 来获得 IPv6 地址。 | |
| Other flag( O flag) 表示是否通过 DHCPv6 获得除 IP 以外的其他参数(如 DNS 列表)。 O flag 也是 RA 报文中的全局参数,一个 RA 报文只有一个 O flag。 注意:仅当 M flag 为 off 时,该参数才会被读取。 | on | 1 | 当 M flag 为 on,或者 M flag 为 off 且至少有一个 A flag 为 on 时,将通过 DHCPv6 获得其他参数。 |
| off | 0 | 当 M flag 为 on 时,依然将通过 DHCPv6 获得其他参数;当 M flag 也为 off 时,将不通过 DHCPv6 获得其他参数。 |
四. 流程示意图
无状态和有状态并不是相互对立的,可以同时存在,也就是一张网卡上可以同时出现通过 RA 生成的 IP 以及通过 DHCPv6 获得的 IP。通过下面这张笔者绘制的流程图可知晓其中奥秘。

从图中可以看到,顺序为:
1️⃣ Stateless 自动配置“链路本地地址”
2️⃣ Stateless 自动配置“全球地址”(或“唯一本地地址”)
3️⃣ Stateful 自动配置“全球地址”(或“唯一本地地址”)和其他参数,其中 Stateful 阶段中存在 Stateful DHCPv6 或 Stateless DHCPv6
注意:
部分客户端操作系统或网络管理器当 Stateless 阶段没有收到 RA 报文后,就到此结束,不会走 Stateful 阶段,比如 CentOS 7、Ubuntu 17 的默认逻辑都是这样,而 windows server 2012 就会继续走 Stateful 阶段。
五. 测试获得 IP 效果
测试环境:客户端基于 CentOS 7+NetworkManager(即系统默认的网络管理方式)进行测试
▪ 网关会发送 RA 报文,包含一个 prefix
▪ DHCPv6 Server 会分配 IP、DNS
测试内容:测试 M、O、A flag 在所有排列组合的情况下
▪ 客户端是否会通过 RA 报文配置无状态 IP
▪ 客户端是否会通过 RA 报文配置 prefix 子网路由
▪ 客户端是否会通过 RA 报文配置 gateway
▪ 客户端是否会通过 DHCPv6 获得有状态 IP
▪ 客户端是否会通过 DHCPv6 获得 DNS
测试结果:

六. 应用场景(选择无状态还是有状态)
何时采用无状态、何时采用有状态,关键看应用场景。核心在于是否需要控制IP地址,比如保持IP不变,如果需要控制,就采用有状态;如果无需控制,就采用无状态。
▷ 服务端领域:如对外提供服务,通常需要采用有状态IP。因为业务IP的突然变化容易导致业务中断(除非做好服务发现)
▷ 客户端领域:如移动设备、办公室内PC机,只需要上IPv6互联网,并不需要对外提供服务,可以采用无状态IP
七. 后续内容
由于篇幅有限,本文尚未贴出实验的详细配置。将会在《IPv6系列》后续文章里,贴出实验的完整信息,包括RA、DHCPv6的配置,以及客户端的配置,敬请关注。
附. 参考文档
http://www.6deploy.eu/tutorials/080-6deploy_ipv6_autoconfiguration_mechs_v0_4.pdf
DHCPv6 基础
发表于 2018-02-01
DHCPv6 简介
IPv6 动态主机配置协议 DHCPv6 (Dynamic Host Configuration Protocol for IPv6) 是针对 IPv6 编址方案设计,为主机分配 IPv6 地址 / 前缀和其他网络配置参数。
目的:
IPv6 协议具有地址空间巨大的特点,但同时长达 128 比特的 IPv6 地址又要求高效合理的地址自动分配和管理策略。IPv6 无状态地址配置方式(参看协议 RFC2462)是目前广泛采用的 IPv6 地址自动配置方式。配置了该协议的主机只需相邻设备开启 IPv6 路由通告功能,即可以根据通告报文包含的前缀信息自动配置本机地址。
无状态地址配置方案中设备并不记录所连接的 IPv6 主机的具体地址信息,可管理性差。而且当前无状态地址配置方式不能使 IPv6 主机获取 DNS 服务器的 IPv6 地址等配置信息,在可用性上有一定缺陷。对于互联网服务提供商来说,也没有相关的规范指明如何向设备自动分配 IPv6 前缀,所以在部署 IPv6 网络时,只能采用手动配置的方法为设备配置 IPv6 地址。
DHCPv6 技术解决了这一问题。DHCPv6 属于一种有状态地址自动配置协议。
与其他 IPv6 地址分配方式(手工配置、通过路由器通告消息中的网络前缀无状态自动配置等)相比,DHCPv6 具有以下优点:
- 更好地控制 IPv6 地址的分配。DHCPv6 方式不仅可以记录为 IPv6 主机分配的地址,还可以为特定的 IPv6 主机分配特定的地址,以便于网络管理。
- DHCPv6 支持为网络设备分配 IPv6 前缀,便于全网络的自动配置和网络层次性管理。
- 除了为 IPv6 主机分配 IPv6 地址 / 前缀外,还可以分配 DNS 服务器 IPv6 地址等网络配置参数。
DHCPv6 原理描述
DHCPv6 概述:
DHCPv6 是一种运行在客户端和服务器之间的协议,与 IPv4 中的 DHCP 一样,所有的协议报文都是基于 UDP 的。但是由于在 IPv6 中没有广播报文,因此 DHCPv6 使用组播报文,客户端也无需配置服务器的 IPv6 地址。
IPv6 地址分配类型:
IPv6 协议具有地址空间巨大的特点,但同时长达 128 比特的 IPv6 地址又要求高效合理的地址自动分配和管理策略。
- 手动配置。手动配置 IPv6 地址 / 前缀及其他网络配置参数(DNS、NIS、SNTP 服务器地址等参数)。
- 无状态自动地址分配。由接口 ID 生成链路本地地址,再根据路由通告报文 RA(Router Advertisement)包含的前缀信息自动配置本机地址。
- 有状态自动地址分配,即 DHCPv6 方式。DHCPv6 又分为如下两种:
- DHCPv6 有状态自动分配。DHCPv6 服务器自动分配 IPv6 地址 / PD 前缀及其他网络配置参数(DNS、NIS、SNTP 服务器地址等参数)。
- DHCPv6 无状态自动分配。主机 IPv6 地址仍然通过路由通告方式自动生成,DHCPv6 服务器只分配除 IPv6 地址以外的配置参数,包括 DNS、NIS、SNTP 服务器等参数。
DHCPv6 基本架构:

图:DHCPv6 基本架构
DHCPv6 基本协议架构中,主要包括以下三种角色:
-
DHCPv6 Client:
DHCPv6 客户端,通过与 DHCPv6 服务器进行交互,获取 IPv6 地址 / 前缀和网络配置信息,完成自身的地址配置功能。
-
DHCPv6 Relay:
DHCPv6 中继代理,负责转发来自客户端方向或服务器方向的 DHCPv6 报文,协助 DHCPv6 客户端和 DHCPv6 服务器完成地址配置功能。一般情况下,DHCPv6 客户端通过本地链路范围的组播地址与 DHCPv6 服务器通信,以获取 IPv6 地址 / 前缀和其他网络配置参数。如果服务器和客户端不在同一个链路范围内,则需要通过 DHCPv6 中继代理来转发报文,这样可以避免在每个链路范围内都部署 DHCPv6 服务器,既节省了成本,又便于进行集中管理。
DHCPv6 基本协议架构中,DHCPv6 中继代理不是必须的角色。如果 DHCPv6 客户端和 DHCPv6 服务器位于同一链路范围内,或 DHCPv6 客户端和 DHCPv6 服务器直接通过单播交互完成地址分配或信息配置的情况下,是不需要 DHCPv6 中继代理参与的。只有当 DHCPv6 客户端和 DHCPv6 服务器不在同一链路范围内,或 DHCPv6 客户端和 DHCPv6 服务器无法单播交互的情况下,才需要 DHCPv6 中继代理的参与。
-
DHCPv6 Server:
DHCPv6 服务器,负责处理来自客户端或中继代理的地址分配、地址续租、地址释放等请求,为客户端分配 IPv6 地址 / 前缀和其他网络配置信息。
DHCPv6 基本概念:
组播地址
- 在 DHCPv6 协议中,客户端不用配置 DHCPv6 Server 的 IPv6 地址,而是发送目的地址为组播地址的 Solicit 报文来定位 DHCPv6 服务器。
- 在 DHCPv4 协议中,客户端发送广播报文来定位服务器。为避免广播风暴,在 IPv6 中,已经没有了广播类型的报文,而是采用组播报文。DHCPv6 用到的组播地址有两个:
- FF02::1:2(All DHCP Relay Agents and Servers):所有 DHCPv6 服务器和中继代理的组播地址,这个地址是链路范围的,用于客户端和相邻的服务器及中继代理之间通信。所有 DHCPv6 服务器和中继代理都是该组的成员。
- FF05::1:3(All DHCP Servers):所有 DHCPv6 服务器组播地址,这个地址是站点范围的,用于中继代理和服务器之间的通信,站点内的所有 DHCPv6 服务器都是此组的成员。
UDP 端口号
- DHCPv6 报文承载在 UDPv6 上。
- 客户端侦听的 UDP 目的端口号是 546。
- 服务器、中继代理侦听的 UDP 端口号是 547。
DHCP 唯一标识符(DUID)
DHCP 设备唯一标识符 DUID(DHCPv6 Unique Identifier),每个服务器或客户端有且只有一个唯一标识符,服务器使用 DUID 来识别不同的客户端,客户端则使用 DUID 来识别服务器。
客户端和服务器 DUID 的内容分别通过 DHCPv6 报文中的 Client Identifier 和 Server Identifier 选项来携带。两种选项的格式一样,通过 option-code 字段的取值来区分是 Client Identifier 还是 Server Identifier 选项。
身份联盟(IA)
- 身份联盟 IA(Identity Association)是使得服务器和客户端能够识别、分组和管理一系列相关 IPv6 地址的结构。每个 IA 包括一个 IAID 和相关联的配置信息。
- 客户端必须为它的每一个要通过服务器获取 IPv6 地址的接口关联至少一个 IA。客户端用给接口关联的 IA 来从服务器获取配置信息。每个 IA 必须明确关联到一个接口。
- IA 的身份由 IAID 唯一确定,同一个客户端的 IAID 不能出现重复。IAID 不应因为设备的重启等因素发生丢失或改变。
- IA 中的配置信息由一个或多个 IPv6 地址以及 T1 和 T2 生存期组成。IA 中的每个地址都有首选生存期和有效生存期。
- 一个接口至少关联一个 IA,一个 IA 可以包含一个或多个地址信息。
DHCPv6 报文类型
DHCPv6 报文格式:

图:DHCPv6 的报文格式
| 字段 | 长度 | 含义 |
|---|---|---|
| msg-type | 1 字节 | 表示报文的类型,取值为 1~13,具体请参见DHCPv6 报文类型。 |
| transaction-ID | 3 字节 | DHCPv6 交互 ID,也叫事务 ID,用来标识一个来回的 DHCPv6 报文交互。例如 Solicit/Advertise 报文为一个交互。Request/Reply 报文为另外一个交互,两者有不同的事务 ID。交互 ID 特点如下:交互 ID 是 DHCPv6 客户端生成的一个随机值,DHCPv6 客户端应当保证交互 ID 具有一定的随机性。对于 DHCPv6 服务器响应报文和相应的请求报文,两者交互 ID 保持一致。如果是 DHCPv6 服务器主动发起的会话报文,则交互 ID 为 0。 |
| Options | 可变 | 表示 DHCPv6 的选项字段。此字段包含了 DHCPv6 服务器分配给 IPv6 主机的配置信息,如 DNS 服务器的 IPv6 地址等信息。 |
DHCPv6 报文类型:
目前 DHCPv6 定义了如下十三种类型报文,DHCPv6 服务器和 DHCPv6 客户端之间通过这十三种类型的报文进行通信。
DHCPv6 和 DHCPv4 报文对比:
| 报文类型 | DHCPv6 报文 | DHCPv4 报文 | 说明 |
|---|---|---|---|
| 1 | SOLICIT | DHCP DISCOVER | DHCPv6 客户端使用 Solicit 报文来确定 DHCPv6 服务器的位置。 |
| 2 | ADVERTISE | DHCP OFFER | DHCPv6 服务器发送 Advertise 报文来对 Solicit 报文进行回应,宣告自己能够提供 DHCPv6 服务。 |
| 3 | REQUEST | DHCP REQUEST | DHCPv6 客户端发送 Request 报文来向 DHCPv6 服务器请求 IPv6 地址和其它配置信息。 |
| 4 | CONFIRM | - | DHCPv6 客户端向任意可达的 DHCPv6 服务器发送 Confirm 报文检查自己目前获得的 IPv6 地址是否适用与它所连接的链路。 |
| 5 | RENEW | DHCP REQUEST | DHCPv6 客户端向给其提供地址和配置信息的 DHCPv6 服务器发送 Renew 报文来延长地址的生存期并更新配置信息。 |
| 6 | REBIND | DHCP REQUEST | 如果 Renew 报文没有得到应答,DHCPv6 客户端向任意可达的 DHCPv6 服务器发送 Rebind 报文来延长地址的生存期并更新配置信息。 |
| 7 | REPLY | DHCP ACK/NAK | DHCPv6 服务器在以下场合发送 Reply 报文:DHCPv6 服务器发送携带了地址和配置信息的 Reply 消息来回应从 DHCPv6 客户端收到的 Solicit、Request、Renew、Rebind 报文。DHCPv6 服务器发送携带配置信息的 Reply 消息来回应收到的 Information-Request 报文。用来回应 DHCPv6 客户端发来的 Confirm、Release、Decline 报文。 |
| 8 | RELEASE | DHCP RELEASE | DHCPv6 客户端向为其分配地址的 DHCPv6 服务器发送 Release 报文,表明自己不再使用一个或多个获取的地址。 |
| 9 | DECLINE | DHCP DECLINE | DHCPv6 客户端向 DHCPv6 服务器发送 Decline 报文,声明 DHCPv6 服务器分配的一个或多个地址在 DHCPv6 客户端所在链路上已经被使用了。 |
| 10 | RECONFIGURE | - | DHCPv6 服务器向 DHCPv6 客户端发送 Reconfigure 报文,用于提示 DHCPv6 客户端,在 DHCPv6 服务器上存在新的网络配置信息。 |
| 11 | INFORMATION-REQUEST | DHCP INFORM | DHCPv6 客户端向 DHCPv6 服务器发送 Information-Request 报文来请求除 IPv6 地址以外的网络配置信息。 |
| 12 | RELAY-FORW | - | 中继代理通过 Relay-Forward 报文来向 DHCPv6 服务器转发 DHCPv6 客户端请求报文。 |
| 13 | RELAY-REPL | - | DHCPv6 服务器向中继代理发送 Relay-Reply 报文,其中携带了转发给 DHCPv6 客户端的报文。 |
DHCPv6 报文抓包:
Solicit 报文(类型 1):
DHCPv6 客户端使用 Solicit 报文来确定 DHCPv6 服务器的位置。

图:Solicit 报文抓包示例
Advertise 报文(类型 2):
DHCPv6 服务器发送 Advertise 报文来对 Solicit 报文进行回应,宣告自己能够提供 DHCPv6 服务。

图:Advertise 报文抓包示例
Request 报文(类型 3):
DHCPv6 客户端发送 Request 报文来向 DHCPv6 服务器请求 IPv6 地址和其它配置信息。

图:Request 报文抓包示例
Renew 报文(类型 5):
DHCPv6 客户端向给其提供地址和配置信息的 DHCPv6 服务器发送 Renew 报文来延长地址的生存期并更新配置信息。

图:Renew 报文抓包示例
Rebind 报文(类型 6):
如果 Renew 报文没有得到应答,DHCPv6 客户端向任意可达的 DHCPv6 服务器发送 Rebind 报文来延长地址的生存期并更新配置信息。

图:Rebind 报文抓包示例
Reply 报文(类型 7):
DHCPv6 服务器在以下场合发送 Reply 报文:DHCPv6 服务器发送携带了地址和配置信息的 Reply 消息来回应从 DHCPv6 客户端收到的 Solicit、Request、Renew、Rebind 报文。DHCPv6 服务器发送携带配置信息的 Reply 消息来回应收到的 Information-Request 报文。用来回应 DHCPv6 客户端发来的 Confirm、Release、Decline 报文。

图:Reply 报文抓包示例
Release (类型 8);
DHCPv6 客户端向为其分配地址的 DHCPv6 服务器发送 Release 报文,表明自己不再使用一个或多个获取的地址。

图:Release 报文抓包示例
Reply-forw 报文(类型 12):
中继代理通过 Relay-Forward 报文来向 DHCPv6 服务器转发 DHCPv6 客户端请求报文。

图:Relay-Forw 报文抓包示例
Relay-reply 报文(类型 13):
DHCPv6 服务器向中继代理发送 Relay-Reply 报文,其中携带了转发给 DHCPv6 客户端的报文。

图:Relay-Reply 报文抓包示例
DHCPv6 工作原理::
DHCPv6 自动分配分为 DHCPv6 有状态自动分配和 DHCPv6 无状态自动分配。
- DHCPv6 有状态自动分配。DHCPv6 服务器自动配置 IPv6 地址 / 前缀,同时分配 DNS、NIS、SNTP 服务器等网络配置参数。
- DHCPv6 无状态自动分配。主机 IPv6 地址仍然通过路由通告方式自动生成,DHCP 服务器只分配除 IPv6 地址以外的配置参数,包括 DNS、NIS、SNTP 服务器地址等参数。
DHVPv6 有状态自动分配:
IPv6 主机通过有状态 DHCPv6 方式获取 IPv6 地址和其他配置参数(例如 DNS 服务器的 IPv6 地址等)。
DHCPv6 服务器为客户端分配地址 / 前缀的过程分为两类:
- DHCPv6 四步交互分配过程
- DHCPv6 两步交互快速分配过程
DHCPv6 四步交互
四步交互常用于网络中有多个 DHCPv6 服务器的情况。DHCPv6 客户端首先通过组播发送 Solicit 报文来定位可以为其提供服务的 DHCPv6 服务器,在收到多个 DHCPv6 服务器的 Advertise 报文后,根据 DHCPv6 服务器的优先级选择一个为其分配地址和配置信息的服务器,接着通过 Request/Reply 报文交互完成地址申请和分配过程。
DHCPv6 服务器端如果没有配置使能两步交互,无论客户端报文中是否包含 Rapid Commit 选项,服务器都采用四步交互方式为客户端分配地址和配置信息。
DHCPv6 四步交互地址分配过程如下:

图:DHCPv6 四步交互地址分配过程
DHCPv6 四步交互地址分配过程如下:
- DHCPv6 客户端发送 Solicit 报文,请求 DHCPv6 服务器为其分配 IPv6 地址和网络配置参数。
- 如果 Solicit 报文中没有携带 Rapid Commit 选项,或 Solicit 报文中携带 Rapid Commit 选项,但服务器不支持快速分配过程,则 DHCPv6 服务器回复 Advertise 报文,通知客户端可以为其分配的地址和网络配置参数。
- 如果 DHCPv6 客户端接收到多个服务器回复的 Advertise 报文,则根据 Advertise 报文中的服务器优先级等参数,选择优先级最高的一台服务器,并向所有的服务器发送 Request 组播报文,该报文中携带已选择的 DHCPv6 服务器的 DUID。
- DHCPv6 服务器回复 Reply 报文,确认将地址和网络配置参数分配给客户端使用。
DHCPv6 两步交互
两步交互常用于网络中只有一个 DHCPv6 服务器的情况。DHCPv6 客户端首先通过组播发送 Solicit 报文来定位可以为其提供服务的 DHCPv6 服务器,DHCPv6 服务器收到客户端的 Solicit 报文后,为其分配地址和配置信息,直接回应 Reply 报文,完成地址申请和分配过程。
两步交换可以提高 DHCPv6 过程的效率,但在有多个 DHCPv6 服务器的网络中,多个 DHCPv6 服务器都可以为 DHCPv6 客户端分配 IPv6 地址,回应 Reply 报文,但是客户端实际只可能使用其中一个服务器为其分配的 IPv6 地址和配置信息。为了防止这种情况的发生,管理员可以配置 DHCPv6 服务器是否支持两步交互地址分配方式。
- DHCPv6 服务器端如果配置使能了两步交互,并且客户端报文中也包含 Rapid Commit 选项,服务器采用两步交互方式为客户端分配地址和配置信息。
- 如果 DHCPv6 服务器不支持快速分配地址,则采用四步交互方式为客户端分配 IPv6 地址和其他网络配置参数。
DHCPv6 两步交互地址分配过程如下图:

图:DHCPv6 两步交互地址分配过程
DHCPv6 两步交互地址分配过程如下:
- DHCPv6 客户端在发送的 Solicit 报文中携带 Rapid Commit 选项,标识客户端希望服务器能够快速为其分配地址和网络配置参数。
- DHCPv6 服务器接收到 Solicit 报文后,将进行如下处理:
- 如果 DHCPv6 服务器支持快速分配地址,则直接返回 Reply 报文,为客户端分配 IPv6 地址和其他网络配置参数,Replay 报文中也携带 Rapid Commit 选项。
- 如果 DHCPv6 服务器不支持快速分配过程,则采用四步交互方式为客户端分配 IPv6 地址 / 前缀和其他网络配置参数。
DHCPv6 无状态自动分配:
IPv6 节点可以通过 DHCPv6 无状态方式获取配置参数(包括 DNS、SIP、SNTP 等服务器配置信息,不包括 IPv6 地址)。
DHCPv6 无状态工作过程如下图所示:

图:DHCPv6 无状态工作过程
DHCPv6 无状态工作过程如下:
- DHCPv6 客户端以组播方式向 DHCPv6 服务器发送 Information-Request 报文,该报文中携带 Option Request 选项,指定 DHCPv6 客户端需要从 DHCPv6 服务器获取的配置参数。
- DHCPv6 服务器收到 Information-Request 报文后,为 DHCPv6 客户端分配网络配置参数,并单播发送 Reply 报文,将网络配置参数返回给 DHCPv6 客户端。DHCPv6 客户端根据收到 Reply 报文提供的参数完成 DHCPv6 客户端无状态配置。
DHCPv6 PD 工作原理:
DHCPv6 前缀代理 DHCPv6 PD (Prefix Delegation) 是由 Cisco 公司提出的一种前缀分配机制,并在 RFC3633 中得以标准化。在一个层次化的网络拓扑结构中,不同层次的 IPv6 地址分配一般是手工指定的。手工配置 IPv6 地址扩展性不好,不利于 IPv6 地址的统一规划管理。
通过 DHCPv6 前缀代理机制,下游网络设备不需要再手工指定用户侧链路的 IPv6 地址前缀,它只需要向上游网络设备提出前缀分配申请,上游网络设备便可以分配合适的地址前缀给下游设备,下游设备把获得的前缀 (一般前缀长度小于 64) 进一步自动细分成 64 前缀长度的子网网段,把细分的地址前缀再通过路由通告 (RA) 至与 IPv6 主机直连的用户链路上,实现 IPv6 主机的地址自动配置,完成整个系统层次的地址布局。
DHCPv6 PD 工作过程下图所示:

图:DHCPv6 PD 工作原理
DHCPv6 PD 四步交互地址分配过程如下:
- DHCPv6 PD 客户端发送 Solicit 报文,请求 DHCPv6 PD 服务器为其分配 IPv6 地址前缀。
- 如果 Solicit 报文中没有携带 Rapid Commit 选项,或 Solicit 报文中携带 Rapid Commit 选项,但服务器不支持快速分配过程,则 DHCPv6 服务器回复 Advertise 报文,通知客户端可以为其分配的 IPv6 地址前缀。
- 如果 DHCPv6 客户端接收到多个服务器回复的 Advertise 报文,则根据 Advertise 报文中的服务器优先级等参数,选择优先级最高的一台服务器,并向该服务器发送 Request 报文,请求服务器确认为其分配地址前缀。
- DHCPv6 PD 服务器回复 Reply 报文,确认将 IPv6 地址前缀分配给 DHCPv6 PD 客户端使用。
DHCPv6 中继工作原理:
DHCPv6 客户端通过 DHCPv6 中继转发报文,获取 IPv6 地址 / 前缀和其他网络配置参数(例如 DNS 服务器的 IPv6 地址等)。
DHCPv6 中继工作过程如下图所示:

图:DHCPv6 中继工作原理
DHCPv6 中继工作交互过程如下:
- DHCPv6 客户端向所有 DHCPv6 服务器和 DHCPv6 中继发送目的地址为 FF02::1:2(组播地址)的请求报文。
- 根据 DHCPv6 中继转发报文有如下两种情况:
- 如果 DHCPv6 中继和 DHCPv6 客户端位于同一个链路上,即 DHCPv6 中继为 DHCPv6 客户端的第一跳中继,中继转发直接来自客户端的报文,此时 DHCPv6 中继实质上也是客户端的 IPv6 网关设备。DHCPv6 中继收到客户端的报文后,将其封装在 Relay-Forward 报文的中继消息选项(Relay Message Option)中,并将 Relay-Forward 报文发送给 DHCPv6 服务器或下一跳中继。
- 如果 DHCPv6 中继和 DHCPv6 客户端不在同一个链路上,中继收到的报文是来自其他中继的 Relay-Forward 报文。中继构造一个新的 Relay-Forward 报文,并将 Relay-Forward 报文发送给 DHCPv6 服务器或下一跳中继。
- DHCPv6 服务器从 Relay-Forward 报文中解析出 DHCPv6 客户端的请求,为 DHCPv6 客户端选取 IPv6 地址和其他配置参数,构造应答消息,将应答消息封装在 Relay-Reply 报文的中继消息选项中,并将 Relay-Reply 报文发送给 DHCPv6 中继。
- DHCPv6 中继从 Relay-Reply 报文中解析出 DHCPv6 服务器的应答,转发给 DHCPv6 客户端。如果 DHCPv6 客户端接收到多个 DHCPv6 服务器的应答,则根据报文中的服务器优先级选择一个 DHCPv6 服务器,后续从该 DHCPv6 服务器获取 IPv6 地址和其他网络配置参数。
IPv6 地址 / 前缀的分配与更新原则:
IPv6 地址分配的优先次序:
DHCPv6 服务器按照如下次序为 DHCPv6 客户端选择 IPv6 地址 / 前缀。
-
选择 IPv6 地址池
DHCPv6 服务器的接口可以绑定 IPv6 地址池,DHCPv6 服务器将选择该 IPv6 地址池为接口下的 DHCPv6 客户端分配地址 / 前缀。对于存在中继的场景,DHCPv6 服务器的接口可以不绑定 IPv6 地址池,而是根据报文中第一个不为 0 的 “link-address” 字段(标识 DHCPv6 客户端所在链路范围),选择与地址池中已配置的网络前缀或 IPv6 地址前缀属于同一链路范围的地址池。
-
选择 IPv6 地址 / 前缀
确定地址池后,DHCPv6 服务器将按照下面步骤为 DHCPv6 客户端分配 IPV6 地址 / 前缀:
-
如果地址池中为客户端指定了地址 / 前缀,优先从地址池中选择与客户端 DUID 匹配的地址 / 前缀分配给客户端。
-
如果客户端报文中的 IA 选项携带了有效的地址 / 前缀,优先从地址池中选择该地址 / 前缀分配给客户端。如果该地址 / 前缀在地址池中不可用,则另外分配一个空闲地址 / 前缀给客户端。如果 IPV6 前缀长度比指定分配长度大,则按指定分配长度来分配。
-
从地址池中选择空闲地址 / 前缀分配给客户端,保留地址(例如 RFC 2526 中定义的任播地址)、冲突地址、已被分配的地址不能再分配给客户端。
-
如果没有合适的 IPv6 地址 / 前缀可以分配,则分配失败。
DHCPv6 地址租约更新:
DHCPv6 服务器为 DHCPv6 客户端分配的地址是有租约的,租约由生命期(包括地址的首选生命期和有效生命期构成)和续租时间点(IA 的 T1、T2)构成。地址有效生命期结束后,DHCPv6 客户端不能再使用该地址。在有效生命期到达之前,如果 DHCPv6 客户端希望继续使用该地址,则需要更新地址租约。
DHCPv6 客户端为了延长其与 IA 关联的地址的有效生命期和首选生命期,在 T1 时刻,发送包含 IA 选项的 Renew 报文给服务器,其中 IA 选项中携带需要续租的 IA 地址选项。如果 DHCPv6 客户端一直没有收到 T1 时刻续租报文的回应报文,那么在 T2 时刻,DHCPv6 客户端通过 Rebind 报文向 DHCPv6 服务器继续续租地址。
T1 时刻地址租约更新过程如下:
- DHCPv6 客户端在 T1 时刻(推荐值为优先生命期的 0.5 倍)发送 Renew 报文进行地址租约更新请求。
- DHCPv6 服务器回应 Reply 报文。
- 如果 DHCPv6 客户端可以继续使用该地址,则 DHCPv6 服务器回应续约成功的 Reply 报文,通知 DHCPv6 客户端已经成功更新地址租约。
- 如果该地址不可以再分配给该 DHCPv6 客户端,则 DHCPv6 服务器回应续约失败的 Reply 报文,通知 DHCPv6 客户端不能获得新的租约。
T2 时刻地址租约更新过程如下:
-
DHCPv6 客户端在 T1 时刻发送 Renew 请求更新租约,但是没有收到 DHCPv6 服务器的回应报文。
-
DHCPv6 客户端在 T2 时刻(推荐值为优先生命期的 0.8 倍),向所有 DHCPv6 服务器组播发送 Rebind 报文请求更新租约。
-
DHCPv6 服务器回应 Reply 报文。
- 如果 DHCPv6 客户端可以继续使用该地址,则 DHCPv6 服务器回应续约成功的 Reply 报文,通知 DHCPv6 客户端已经成功更新地址 / 前缀租约。
- 如果该地址不可以再分配给该 DHCPv6 客户端,则 DHCPv6 服务器回应续约失败的 Reply 报文,通知 DHCPv6 客户端不能获得新的租约。
如果 DHCPv6 客户端没有收到 DHCPv6 服务器的应答报文,则到达有效生命期后,DHCPv6 客户端停止使用该地址。
IP 地址预留:
DHCPv6 服务器支持预留 IPv6 地址,即保留部分 IPv6 地址不参与动态分配。比如预留的 IPv6 地址可作为 DNS 服务器的 IPv6 地址。
DHCPv6 基础配置命令
address prefix
// IPv6 地址池视图下配置网络前缀和生命周期。
// infinite: 指定生命周期为无穷大。
// 生命周期默认值为 86400,即 1 天。
capwap-ac ipv6-address
// 在 IPv6 地址池视图下配置 AC 的 IPv6 地址。
conflict-address expire-time expire-time
// 配置 IPv6 地址池下冲突地址老化时间。
// 缺省情况下,地址池下的冲突地址老化时间是 172800 秒,即 2 天。
dhcpv6 client information-request
// 使能接口以 DHCPv6 无状态自动分配方式获取网络配置参数
//(不包括 IPv6 地址)的功能。
dhcpv6 client pd
// 配置 DHCPv6 PD 客户端功能。
// hint ipv6-address: 指定期望申请的 IPv6 地址
// hint ipv6-prefix/ipv6-prefix-length:
// 指定期望申请的 IPv6 地址前缀和前缀长度。
// rapid-commit: 指定客户端以两步交互申请 IPv6 地址前缀。
// unicast-option: 指定客户端以单播方式申请 IPv6 地址前缀。
// union-mode: 指定客户端使用一个报文同时获取 IPv6 地址和前缀。
dhcpv6 duid { ll | llt | duid }
// 配置 DHCPv6 设备的唯一标识符 DUID。
// 缺省情况下,设备以 ll 的方式生成 DUID。
// ll: 指定设备采用链路层地址(即 MAC 地址)方式生成 DUID。
// llt: 指定设备采用链路层地址(即 MAC 地址)加时间的方式生成 DUID。
dhcpv6 client renew
// 手动更新 DHCPv6 客户端申请到的 IPv6 地址 / 前缀。
renew-time-percent rebind-time-percent
// 配置 IPv6 地址池的续租时间和重绑定时间占优先生命周期的百分比。
// 缺省情况下,IPv6 地址池的续租时间占优先生命周期的 50%
// 重绑定时间占优先生命周期的 80%。
dhcpv6 interface-id format { default | user-defined text }
// 配置 DHCPv6 报文中 Interface-ID 选项的格式。
dhcpv6 packet-rate
// 使能 DHCPv6 报文限速功能,并配置速率抑制值。
// 缺省情况下,DHCPv6 报文限速功能处于未使能状态。
dhcpv6 packet-rate drop-alarm enable
// 使能 DHCPv6 报文限速丢弃告警功能。
dhcpv6 packet-rate drop-alarm threshold 100
// 配置 DHCPv6 报文限速丢弃告警阈值。缺省值为 100 包
dhcpv6 pool pool-name
// 创建 IPv6/IPv6 PD 地址池或进入 IPv6/IPv6 PD 地址池视图
dhcpv6 relay destination
// 使能接口的 DHCPv6 中继代理功能
// 并配置 DHCPv6 服务器或下一跳中继代理的 IPv6 地址。
dhcpv6 relay server-select group-name
// 来配置 DHCPv6 中继所对应的 DHCPv6 服务器组。
dhcpv6 relay source-interface
// 配置接口地址作为报文源 IPv6 地址。
dhcpv6 remote-id format
// 配置 DHCPv6 报文中 Remote-ID 选项的格式。
dhcpv6 remote-id insert enable
// 使能在 DHCPv6 中继报文中插入 remote-id 选项的功能。
dhcpv6 server
// 使能 DHCPv6 服务器或 DHCPv6 PD 服务器功能。
dhcpv6-server ipv6-address
// 配置在 DHCPv6 服务器组中添加 DHCPv6 服务器或下一跳中继的成员。
dhcpv6 server database
// 使能 DHCPv6 数据保存功能。
//write-delay : 指定 DHCPv6 数据保存的时间间隔。
dhcpv6 server group group-name
// 创建一个 DHCPv6 服务器组并进入 DHCPv6 服务器组视图
dns-domain-name
// 配置 DHCPv6 服务器为 DHCPv6 客户端分配的域名后缀。
dns-server ipv6-address
// 配置 DNS 服务器 IPv6 地址。
excluded-address
// 配置 IPv6 地址池中不参与自动分配的 IPv6 地址范围。
information-refresh time
// 设置无状态 DHCPv6 方式分配给客户端的配置信息刷新时间。
// 缺省情况下,IPv6 地址池配置信息刷新时间 86400 秒,即 24 小时。
ipv6 address auto dhcp 命
// 使能接口通过 DHCPv6 协议自动获取 IPv6 地址及其他网络配置参数。
link-address
// 在 IPv6 地址池视图下配置网络前缀。
lock
// 锁定 IPv6 地址池。
nis-domain-name
// 配置 DHCPv6 服务器为 DHCPv6 客户端分配的 NIS 域名后缀
nisp-domain-name
// 配置 DHCPv6 服务器为 DHCPv6 客户端分配的 NISP 域名后缀。
prefix-delegation
// 配置地址池视图下的代理前缀。
static-bind prefix
// 在 DHCPv6 地址池下静态绑定地址前缀与 DHCPv6 PD 客户端。
import all
// 使能设备向 DHCPv6 客户端动态分配 DNS 服务器和 SNTP 服务器配置信息的功能。
DHCPv6 服务器、中继配置示例
实验拓扑:

图:DHCPv6 实验拓扑
实验要求:
在 AR1 为 DHCPv6 服务器,AR2 为 DHCP 中继。通过配置,为主机分配 IPv6 地址。
配置文件:
AR1:
<DHCPv6>dis current-configuration
#
sysname DHCPv6
#
ipv6
#
dhcp enable
#
dhcpv6 pool pool1
address prefix 2000::/64
// 配置 IPv6 地址前缀
excluded-address 2000::1
#
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address 3000::1/64
dhcpv6 server pool1
#
ipv6 route-static :: 0 3000::2
#
return
AR2:
<Realy>dis current-configuration
#
sysname Realy
#
ipv6
#
dhcp enable
#
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address 3000::2/64
#
interface GigabitEthernet0/0/1
ipv6 enable
ipv6 address 2000::1/64
undo ipv6 nd ra halt
// 使能路由器向主机发送路由通告信息
ipv6 nd autoconfig managed-address-flag
// 使 M 和 O 标志位置位。实现主机通过 DHCPv6 方式获取地址
ipv6 nd autoconfig other-flag
dhcpv6 relay destination 3000::1
// 指明 DHCP 服务器的地址
#
return

图:DHCPv6 服务器地址分配状况
via:
-
IPv6系列-彻底弄明白有状态与无状态配置IPv6地址-有状态和无状态ipv6 作者:小慢哥本人
2019-10-09 08:29:30
https://www.51cto.com/article/603898.html -
DHCPv6 基础 | 曹世宏的博客 更新于 2019-08-25
https://cshihong.github.io/2018/02/01/DHCPv6基础/
1972

被折叠的 条评论
为什么被折叠?



