DHCPv6协议
1. 定义
IPv6 动态主机配置协议DHCPv6(Dynamic Host Configuration Protocol for IPv6)是针对IPv6编址方案设计,为主机分配IPv6 地址/前缀和其他网络配置参数的一种有状态协议。
2. 目的
IPv6 协议具有地址空间巨大的特点,但同时长达128 比特的IPv6 地址又要求高效合理的地址自动分配和管理策略。IPv6 无状态地址配置方式(参看协议RFC2462)是目前广泛采用的IPv6 地址自动配置方式。配置了该协议的主机只需相邻路由器开启IPv6 路由通告功能,即可以根据通告报文包含的前缀信息自动配置本机地址。
无状态地址配置方案中路由器并不记录所连接的IPv6 主机的具体地址信息,可管理性差。而且当前无状态地址配置方式不能使IPv6 主机获取DNS 服务器的IPv6 地址等配置信息,在可用性上有一定缺陷。对于互联网服务提供商(ISP)来说,也没有相关的规范指明如何向路由器自动分配IPv6 前缀,所以在部署IPv6 网络时,只能采用手动配置的方法为路由交换设备配置IPv6 地址。
DHCPv6 技术解决了这一问题。DHCPv6 属于一种有状态地址自动配置协议。在有状态地址配置过程中,DHCPv6 服务器分配一个完整的IPv6 地址给主机,并提供DNS 服务器地址等其他配置信息,这中间可能通过DHCPv6 中继转发DHCPv6 报文,最终服务器能把分配的IPv6 地址和客户端的进行绑定,从而增强了网络的可管理性。
与其他IPv6 地址分配方式(手工配置、通过路由器通告消息中的网络前缀无状态自动配置等)相比,DHCPv6 具有以下优点:
更好地控制IPv6 地址的分配。DHCPv6 方式不仅可以记录为IPv6 主机分配的地址,还可以为特定的IPv6 主机分配特定的地址,以便于网络管理。
DHCPv6 支持为网络设备分配IPv6 前缀,便于全网络的自动配置和网络层次性管理。
除了为IPv6 主机分配IPv6 地址/前缀外,还可以分配DNS 服务器IPv6 地址等网络配置参数。
3. 协议简介
动态主机配置协议 (DHCP) 曾设计用来处理向计算机分配 IP 地址和其他网络信息,以便计算机可以在网络上自动通信。通过使用 IPv6 网络,实际上不需要 DHCP 来配置地址,但是有充分的理由来使用它。DHCP for IPv6 (DHCPv6) 可以向 IPv6 主机提供有状态的地址配置或无状态的配置设置。IPv6 主机可以使用多种方法来配置地址:
无状态地址自动配置 用于对链接本地地址和其他非链接本地地址两者进行配置,方法是与相邻路由器交换路由器请求和路由器公告消息。
有状态地址自动配置 通过使用如 DHCP 的配置协议,用来配置非链接本地地址。
DHCPv6 基本架构
DHCPv6 基本构架如图3-1所示。
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 地址/前缀和其他网络配置信息。
4. DHCPv6 基本概念
1. 组播地址
在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 服 务器都是此组的成员。
2. UDP 端口号
DHCPv6 报文承载在UDPv6 上。
客户端监听的UDP 目的端口号是546。
服务器、中继代理监听的UDP 端口号是547。
3. DHCP 唯一标识符(DUID)
lDHCP 设备唯一标识符DUID(DHCP Unique Identifier),每个服务器或客户端有且只有一个唯一标识符,服务器使用DUID 来识别不同的客户端,客户端则使用DUID 来识别服务器。
l客户端和服务器DUID 的内容分别通过DHCPv6 报文中的Client Identifier 和Server Identifier 选项来携带。两种选项的格式一样,通过option-code 字段的取值来区分是Client Identifier 还是Server Identifier 选项。
4. 身份联盟(IA)
身份联盟IA(Identity Association)是使得服务器和客户端能够识别、分组和管理一系列相关IPv6 地址的结构。每个IA 包括一个IAID 和相关联的配置信息。
客户端必须为它的每一个要通过服务器获取IPv6 地址的接口关联至少一个IA。客户端用给接口关联的IA 来从服务器获取配置信息。每个IA 必须明确关联到一个接口。
IA 的身份由IAID 唯一确定,同一个客户端的IAID 不能出现重复。IAID 不应因为设备的重启等因素发生丢失或改变。__IA 中的配置信息由一个或多个IPv6 地址以及T1 和T2 生存期组成。IA 中的每个地址都有合法生存期和首选生存期。
一个接口至少关联一个IA,一个IA 可以包含一个或多个地址信息。
5. M/O 标记
IPv6 主机自动执行无状态地址自动配置,并在相邻路由器发送的路由器公告消息中使用基于以下标记的配置协议(如 DHCPv6):
托管地址配置标记,也称为 M 标记。路由器通告的RA 报文中的管理标记,当M 标志位为1 时,表示链路上的IPv6 主机采用DHCPv6 方式获取IPv6 地址/前缀。其他有状态配置标记 ,也称为 O 标记。路由器通告的RA 报文中的其他配置标记,当O 标志位为1 时,表示链路上的IPv6 主机采用DHCPv6 方式获取除IPv6 地址/前缀以外的其他网络配置参数。
结合 M 和 O 标记的值可以产生以下组合:
M 和 O 标记均设置为 0。 此组合对应不具有 DHCPv6 基础结构的网络。主机使用非链接本地地址的路由器公告以及其他方法(如手动配置)来配置其他设置。
M 和 O 标记均设置为 1。 DHCPv6 用于这两种地址(链接本地地址和其他非链接本地地址)和其他配置设置。该组合称为 DHCPv6 有状态,其中 DHCPv6 将有状态地址分配给 IPv6 主机。
M 标记设置为 0,O 标记设置为 1。 DHCPv6 不用于分配地址,仅用来分配其他配置设置。相邻路由器配置为通告非链接本地地址前缀,IPv6 主机从中派生出无状态地址。此组合称为 DHCPv6 无状态:DHCPv6 不为 IPv6 主机分配有状态地址,但分配无状态配置设置。
M 标记设置为 1,O 标记设置为 0。 在此组合中,DHCPv6 用于地址配置,但不用于其他设置。因为 IPv6 主机通常需要使用其他设置(如域名系统 (DNS) 服务器的 IPv6 地址)进行配置,所以这是一种不太可能的组合。
类似于 DHCP for IPv4,DHCPv6 基础结构的组件由下列各项构成:请求配置的 DHCPv6 客户端、提供配置的 DHCPv6 服务器、以及 DHCPv6 中继代理(当客户端位于不具备 DHCPv6 服务器的子网上时,它在客户端和服务器之间传递信息)。
5. 报文封装
DHCPv6 报文格式如图5-1 所示。
DHCPv6的封包有两种结构,即在中继与客户端上使用的报文结构有时是不同的,在客户端与服务器端报文结构如下图所示:
而在服务器与中继代理端交互的报文结构与客户端与服务器端交互的报文是不同的,某种程度上显得更为复杂一些,RFC3315中描述的这种报文结构如图:
DHCPv6 报文类型
目前DHCPv6 定义了如下十三种类型报文,DHCPv6 服务器和DHCPv6 客户端之间通过这十三种类型的报文进行通信。下表将对DHCPv6 和DHCPv4 报文进行类比。
DHCPv6 四个交互过程中的前两个过程的报文格式:
1.solicit UDP报文:
client identifier option :客户端标识。
IA_NA option:包括一个IP为全0的填充选项,IA_NA用于返回SERVER端分配给AP的IP地址。
option 60/17 option:这个60/17选项填充企业ID号,SERVER将根据该ID号进行地址的分配(企业ID号长度为四个字节,类型为unsigned int)。
other options :其它选项,比如ORO选项。
2.advertise UDP报文:
client identifier option:客户端标识。
server identifier options:服务器端标识。
IA_NA option:SERVER填充了分配给AP的IP地址。
option 52 option:这个52选项填充的接口IPv6地址。
options 60/17:返回企业ID号信息(企业ID号长度为四个字节,类型为unsigned int)
other options:其它选项,比如DNS选项。
3. 在request报文中也封装option 60/17选项
在reply报文中也封装了option 60/17 ,52选项供AP解析,具体格式可以参考solicit/advertise UDP报文。
6. DHCPv6 工作原理
DHCPv6 自动分配分为DHCPv6 有状态自动分配和DHCPv6 无状态自动分配。
DHCPv6 有状态自动分配。DHCPv6 服务器自动配置IPv6 地址/前缀,同时分配DNS、NIS、SNTP 服务器等网络配置参数。
DHCPv6 无状态自动分配。主机IPv6 地址仍然通过路由通告方式自动生成,DHCP服务器只分配除IPv6 地址以外的配置参数,包括DNS、NIS、SNTP 服务器地址等参数。
DHCPv6 有状态自动分配
IPv6 主机在地址分配之前,由IPv6 节点生成链路本地地址并且DAD 通过后,首先有一个链路路由器发现过程,即IPv6 节点发送RS 报文,链路路由器收到RS 报文后,回应RA 报文。如果IPv6 节点收到的RA 报文中M 标记为1,O 标记位为1,则表示IPv6 节点通过有状态DHCPv6 方式获取地址和其他配置参数(例如DNS 服务器的IPv6 地址等)。
DHCPv6 服务器为客户端分配地址/前缀的过程分为两类:
DHCPv6 四步交互分配过程
DHCPv6 两步交互快速分配过程
DHCPv6 四步交互
四步交互常用于网络中有多个DHCPv6 服务器的情况。DHCPv6 客户端首先通过组播发送Solicit 报文来定位可以为其提供服务的DHCPv6 服务器,在收到多个DHCPv6 服务器的Advertise 报文后,根据DHCPv6 服务器的优先级选择一个为其分配地址和配置信息的服务器,接着通过Request/Reply 报文交互完成地址申请和分配过程。
DHCPv6 服务器端如果没有配置使能两步交互,无论客户端报文中是否包含Rapid Commit选项,服务器都采用四步交互方式为客户端分配地址和配置信息。
DHCPv6 四步交互地址分配过程如图6-1 所示。
图6-1 DHCPv6 四步交互地址分配过程
DHCPv6 四步交互地址分配过程如下:
1. DHCPv6 客户端发送Solicit 报文,请求DHCPv6 服务器为其分配IPv6 地址和网络配置参数。
2. 如果Solicit 报文中没有携带Rapid Commit 选项,或Solicit 报文中携带RapidCommit 选项,但服务器不支持快速分配过程,则DHCPv6 服务器回复Advertise 报文,通知客户端可以为其分配的地址和网络配置参数。
3. 如果DHCPv6 客户端接收到多个服务器回复的Advertise 报文,则根据Advertise 报文中的服务器优先级等参数,选择优先级最高的一台服务器,并向所有的服务器发送Request 组播报文,该报文中携带已选择的DHCPv6 服务器的DUID。
4. DHCPv6 服务器回复Reply 报文,确认将地址和网络配置参数分配给客户端使用。
DHCPv6 两步交互
两步交互常用于网络中只有一个DHCPv6 服务器的情况。DHCPv6 客户端首先通过组播发送Solicit 报文来定位可以为其提供服务的DHCPv6 服务器,DHCPv6 服务器收到客户端的Solicit 报文后,为其分配地址和配置信息,直接回应Reply 报文,完成地址申请和分配过程。
两步交换可以提高DHCPv6 过程的效率,但在有多个DHCPv6 服务器的网络中,多个DHCPv6 服务器都可以为DHCPv6 客户端分配IPv6 地址,回应Reply 报文,但是客户端实际只可能使用其中一个服务器为其分配的IPv6 地址和配置信息。为了防止这种情况的发生,管理员可以配置DHCPv6 服务器是否支持两步交互地址分配方式。
DHCPv6 两步交互地址分配过程如图4-4 所示。
DHCPv6 两步交互地址分配过程
DHCPv6 两步交互地址分配过程如下:
1. DHCPv6 客户端在发送的Solicit 报文中携带Rapid Commit 选项,标识客户端希望服务器能够快速为其分配地址和网络配置参数。
2. DHCPv6 服务器接收到Solicit 报文后,将进行如下处理:
如果DHCPv6 服务器支持快速分配地址,则直接返回Reply 报文,为客户端分配IPv6 地址和其他网络配置参数,Replay 报文中也携带Rapid Commit 选项。
如果DHCPv6 服务器不支持快速分配过程,则采用四步交互方式为客户端分配IPv6 地址/前缀和其他网络配置参数。
DHCPv6 无状态自动分配
在地址分配前,IPv6 节点生成链路本地地址并且DAD 通过后,首先有一个链路路由器发现过程。即IPv6 节点广播发送RS 报文,链路路由器收到RS 报文后,回应RA 报文。
如果IPv6 节点收到的RA 报文中M 标记为0,O 标记为1,则表示IPv6 节点通过DHCPv6 无状态方式获取配置参数(包括DNS、SIP、SNTP 等服务器配置信息,不包括IPv6 地址)。
DHCPv6 无状态工作过程如图4-5 所示。
DHCPv6 无状态工作过程如下:
1. DHCPv6 客户端以组播方式向DHCPv6 服务器发送Information-Request 报文,该报文中携带Option Request 选项,指定DHCPv6 客户端需要从DHCPv6 服务器获取的配置参数。
2. DHCPv6 服务器收到Information-Request 报文后,为DHCPv6 客户端分配网络配置参数,并单播发送Reply 报文,将网络配置参数返回给DHCPv6 客户端。
3. DHCPv6 客户端根据收到Reply 报文提供的参数完成DHCPv6 客户端无状态配置。
4. DHCPv6 PD 服务器回复Reply 报文,确认将IPv6 地址前缀分配给DHCPv6 PD 客户端使用。
DHCPv6 PD 同样也支持携带Rapid Commit 选项的两步交互方式,报文交互方式参见DHCPv6 两步交互方式。
7. DHCPv6 PD 工作原理
DHCPv6 前缀代理DHCPv6 PD(Prefix Delegation)是由Cisco 公司提出的一种前缀分配机制,并在RFC3633 中得以标准化。在一个层次化的网络拓扑结构中,不同层次的IPv6地址分配一般是手工指定的。手工配置IPv6 地址扩展性不好,不利于IPv6 地址的统一规划管理。
通过DHCPv6 前缀代理机制,下游网络路由器不需要再手工指定用户侧链路的IPv6 地址前缀,它只需要向上游网络路由器提出前缀分配申请,上游网络路由器便可以分配合适的地址前缀给下游路由器,下游路由器把获得的前缀(一般前缀长度小于64)进一步自动细分成64 前缀长度的子网网段,把细分的地址前缀再通过路由通告(RA)至与IPv6 主机直连的用户链路上,实现IPv6 主机的地址自动配置,完成整个系统层次的地址布局。
DHCPv6 PD 工作过程如图4-6 所示。
DHCPv6 PD 四步交互地址分配过程如下:
1. DHCPv6 PD 客户端发送Solicit 报文,请求DHCPv6 PD 服务器为其分配IPv6 地址前缀。
2. 如果Solicit 报文中没有携带Rapid Commit 选项,或Solicit 报文中携带Rapid Commit 选项,但服务器不支持快速分配过程,则DHCPv6 服务器回复Advertise 报文,通知客户端可以为其分配的IPv6 地址前缀。
3. 如果DHCPv6 客户端接收到多个服务器回复的Advertise 报文,则根据Advertise 报文中的服务器优先级等参数,选择优先级最高的一台服务器,并向该服务器发送Request 报文,请求服务器确认为其分配地址前缀。
4. DHCPv6 PD 服务器回复Reply 报文,确认将IPv6 地址前缀分配给DHCPv6 PD 客户端使用。
DHCPv6 PD 同样也支持携带Rapid Commit 选项的两步交互方式,报文交互方式参见DHCPv6 两步交互方式。
8. DHCPv6 中继工作原理
DHCPv6 中继工作过程如图 所示。DHCPv6 客户端通过DHCPv6 中继转发报文,获取IPv6 地址/前缀和其他网络配置参数(例如DNS 服务器IPv6 地址等)。
DHCPv6 中继工作交互过程如下:
1. DHCPv6 客户端向所有DHCPv6 服务器和DHCPv6 中继的组播地址FF02::1:2 发送请求报文。
2. 根据DHCPv6 中继转发报文有如下两种情况:
l 如果DHCPv6 中继和DHCPv6 客户端位于同一个链路上,即DHCPv6 中继为DHCPv6 客户端的第一跳中继,中继转发直接来自客户端的报文,此时DHCPv6中继实质上也是客户端的IPv6 网关设备。DHCPv6 中继收到客户端的报文后,将其封装在Relay-Forward 报文的中继消息选项(Relay Message Option)中,并将Relay-Forward 报文发送给DHCPv6 服务器或下一跳中继。
l 如果DHCPv6 中继和DHCPv6 客户端不在同一个链路上,中继收到的报文是来自其他中继的Relay-Forward 报文。中继构造一个新的Relay-Forward 报文,并将Relay-Forward 报文发送给DHCPv6 服务器或下一跳中继。
3. DHCPv6 服务器从Relay-Forward 报文中解析出DHCPv6 客户端的请求,为DHCPv6 客户端选取IPv6 地址和其他配置参数,构造应答消息,将应答消息封装在Relay-Reply 报文的中继消息选项中,并将Relay-Reply 报文发送给DHCPv6 中继。
4. DHCPv6 中继从Relay-Reply 报文中解析出DHCPv6 服务器的应答,转发给DHCPv6客户端。DHCPv6 客户端根据Advertise 报文中的服务器优先级选择一个DHCPv6服务器,后续从该DHCPv6 服务器获取IPv6 地址和其他网络配置参数。
9. IPv6 地址/前缀的分配与更新原则
IPv6 地址分配的优先次序
DHCPv6 服务器按照如下次序为DHCPv6 客户端选择IPv6 地址/前缀。
1. 选择IPv6 地址池
DHCPv6 服务器接口必须绑定IPv6 地址池,DHCPv6 服务器将选择该IPv6 地址池为接口下的DHCPv6 客户端分配地址/前缀。
2. 选择IPv6 地址/前缀
确定地址池后,DHCPv6 服务器将按照下面步骤为DHCPv6 客户端分配IPV6 地址/前缀:
a. 如果地址池中为客户端指定了地址/前缀,优先从地址池中选择与客户端DUID匹配的地址/前缀分配给客户端。
b. 如果客户端报文中的IA 选项携带了有效的地址/前缀,优先从地址池中选择该地址/前缀分配给客户端。如果该地址/前缀在地址池中不可用,则另外分配一个空闲地址/前缀给客户端。如果IPV6 前缀长度比指定分配长度大,则按指定分配长度来分配。
c. 从地址池中选择空闲地址/前缀分配给客户端,保留地址(例如RFC 2526 中定义的任播地址)、冲突地址、已被分配的地址不能再分配给客户端。
d. 如果没有合适的IPv6 地址/前缀可以分配,则分配失败。
DHCPv6 地址租约更新
DHCPv6 服务器为DHCPv6 客户端分配的地址是有租约的,租约由生命期(包括地址的优先生命期和有效生命期构成)和续租时间点(IA 的T1、T2)构成。地址有效生命期结束后,DHCPv6 客户端不能再使用该地址。在有效生命期到达之前,如果DHCPv6 客户端希望继续使用该地址,则需要更新地址租约。
DHCPv6 客户端为了延长其与IA 关联的地址的有效生命期和优先生命期,在T1 时刻,发送包含IA 选项的Renew 报文给服务器,其中IA 选项中携带需要续租的IA 地址选
项。如果DHCPv6 客户端一直没有收到T1 时刻续租报文的回应报文,那么在T2 时刻,DHCPv6 客户端通过Rebind 报文向DHCPv6 服务器继续续租地址。
T1 时刻地址租约更新过程如图 所示。
T1 时刻地址租约更新过程如下:
1. DHCPv6 客户端在T1 时刻(推荐值为优先生命期的1/2)发送Renew 报文进行地址租约更新请求。
2. DHCPv6 服务器回应Reply 报文。
如果DHCPv6 客户端可以继续使用该地址,则DHCPv6 服务器回应续约成功的Reply 报文,通知DHCPv6 客户端已经成功更新地址租约。
如果该地址不可以再分配给该DHCPv6 客户端,则DHCPv6 服务器回应续约失败的Reply 报文,通知DHCPv6 客户端不能获得新的租约。
T2 时刻地址租约更新过程如图所示。
T2 时刻地址租约更新过程如下:
1. DHCPv6 客户端在T1 时刻发送Renew 请求更新租约,但是没有收到DHCPv6 服务器的回应报文。
2. DHCPv6 客户端在T2 时刻(推荐值为优先生命期的0.8 倍),向所有DHCPv6 服务器组播发送Rebind 报文请求更新租约。
3. DHCPv6 服务器回应Reply 报文。
l 如果DHCPv6 客户端可以继续使用该地址,则DHCPv6 服务器回应续约成功的Reply 报文,通知DHCPv6 客户端已经成功更新地址/前缀租约。
l 如果该地址不可以再分配给该DHCPv6 客户端,则DHCPv6 服务器回应续约失败的Reply 报文,通知DHCPv6 客户端不能获得新的租约。
IP 地址预留
DHCPv6 服务器支持预留IPv6 地址,即保留部分IPv6 地址不参与动态分配。比如预留的IPv6 地址可作为DNS 服务器的IPv6 地址。