DHCPv6(Dynamic Host Configuration Protocol for IPv6)
前言
前面学到IPv6存在无状态地址配置以及有状态地址配置两种形式,前者多依赖于NDP进行配置,是目前IPv6广泛采用的IPv6地址自动配置方式。但是无状态地址配置方案中路由器并不记录所连接的IPv6主机的具体信息,并且配置方式不能使IPv6主机获取DNS,服务器的IPv6地址等配置信息,在可用性上存在一定缺陷。
DHCPv6是一种有状态自动配置协议。在配置过程中,DHCPv6服务器会给主机分配完整的IPv6地址,并且提供DNS服务器地址等配置信息。中间通过DHCPv6中继转发DHCPv6报文,将分配的IPv6与客户端绑定,增强了网络的可管理性。
DHCPv6定义
组播地址
DHCPv6协议中不用对DHCPv6服务器进行地址配置,而是发送目的地址为组播地址的报文来定位服务器,使用的组播地址有两个:
- FF02::1:2:所有DHCPv6服务器和中继代理的组播地址,这个地址是链路范围的,用于客户端和相邻服务器及中继代理之间通信。DHCPv6 服务器和中继代理都是该组的成员
- FF05::1:3:所有DHCPv6 服务器组播地址,这个地址是站点范围的,用于中继代理和服务器之间的通信,站点内的所有DHCPv6 服 务器都是此组的成员。
UDP端口
DHCPv6报文所使用的UDP端口如下:
- UDP 546端口:客户监听的UDP端口。
- UDP 547端口:服务器和中继代理监听的UDP端口。
DHCP唯一标识符
DHCP Unique Identifier (DUID)是用来唯一标示每一个DHCPv6用户或服务器。前言已经提及的绑定管理就是依靠于这个定义。它和DHCPv4中的客户和服务器标识符类似。
从DHCPv6报文处理方面来说,DUID是一段不透明的可变长数据。DHCP客户或服务器对于两个DUID的比较只能看他们是否一样。在[RFC3315]定义了DUID的标准格式来确保唯一性。
DUID的开头两个字节与前面的报文一样都是类型字段,后面是基于类型的可变长数据。
- DUID-LLT:链路层地址加时间
如上图所示是LLT的格式:
- 硬件类型:指定硬件设备,依据来源于IANA指定的16位硬件类型。
- 时间:32位无符号整数,以秒为单位的时间戳。
- 链路层地址:节点上产生这一DUID的网络设备的链路层地址。具体设备在前面指定。
标识符包含有产生时间,所以DUID-LLT很可能是唯一的,所以一般由具有固定存储器的通用设备(PC机)使用此类DUID,在节点上产生DUID的硬件可以独立于DHCPv6操作。
- DUID-EN:基于企业编号的厂商分配的唯一ID
如上图所示是EN的格式:
- 企业编号:IANA用以表示的一个特定厂商。
- 标识符:每个厂商特定的可变长数据。
DUID-EN应当由网络设备的制造商来使用,并且应该能标识由那个网络制造商提供的设备。
- DUID-LL:链路层地址
- 硬件类型:与LLT中字段功能相同
- 链路层地址:节点上产生这一DUID的网络设备的链路层地址。设备类型由前字段确定。
该类型与LLT类似,但不包含时间字段,用于那些有永久链接对的带有链路层地址的网络接口设备,并且此类设备没有存储生产时间的相应设备。
身份关联
身份关联(Identity Association IA)是一种概念上的结构,用来标识一系列的DHCPv6配置信息。每一个IA又是有一个32比特的标识符来标识,称之为IAID,IAID与每一个客户内的特定IA是一对一的关系。这点在绑定中也有相应的作用。
一个IPv6中一个接口可以有多个IP地址的特性。IA最初目的是在一个客户定义多个身份,每一个关联一个不同的IPv6地址。租用期由IA进行管理,而不是由地址管理,也就是说,跟新分配的配置信息的DHCPv6交换由IA执行。
每个IA都由两个参数T1和T2控制跟新。IA有以下三种类型:
- 非临时地址身份关联(identity association for non-temporary address, IA_NA),定义正常的为客户接口分配的IPv6地址。
- 临时地址身份关联(identity association for temporary. address, IA_TA),定义临时的为客户接口分配的IPv6地址。
- 前缀代理身份关联(identity association for prefix delegation, IA_PD),定义IPv6前缀,这些前缀由代理路由器分配到请求路由器。
绑定
前言提及,为了方便管理,会对IPv6地址与客户或服务器进行绑定。绑定过程由元组<客户的DUID,IA类型,IAID>来确定。
DHCPv6报文
前面提及有很多类型报文,DHCP也存在报文,但与不同目标交互报文格式不同。
客户与服务器
如上图所示是客户与服务器之间使用的DHCPv6报文格式:
- 报文类型:8位整数,标识DHCP报文类型。
- 事务ID:报文交换的事务ID,一个24位整数。事务ID由交换的发起者(通常为客户)选定。响应端复制ID到响应。当发起者接收到响应时,会与ID匹配来确定对于的交换。
- 选项:报文所携带的选项,此字段包含DHCPv6服务器分配给IPv6主机的配置信息。
中继代理与服务器
如上图所示是中继代理和服务器之间使用的DHCPv6报文格式:
- 报文类型:表示类型,只能为12(中继转发)或13(中继应答)。
- 跳数:这个字段只有在中继转发报文中有效,表示报文中继代理个数,避免报文进入无限循环。
- 链路地址:一个全球地址,服务器用这个地址表示客户所在链路。
- 对等地址:客户或中继代理的地址,通过此类地址接受将要中继的报文。这个地址在中继转发报文中设置,并在中继应答报文中使用,使得应答报文能转回客户。
- 选项:该字段包含特定于中继代理操作的DHCPv6选项。必须始终包含中继报文选项。
DHCP报文类型
类 型 | 名 称 | 描 述 |
---|---|---|
1 | 寻求(solicit) | 客户发出,寻找可用DHCPv6服务器 |
2 | 广告(advertise) | 服务器发出,携带配置信息以响应寻求报文 |
3 | 请求(request) | 客户发出,到指定服务器进行资源分配 |
4 | 确认(confirm) | 当客户转移到不同链路时发出,确认分配地址及前缀是否有效 |
5 | 更新(renew) | 客户发出到资源分配服务器以跟新资源 |
6 | 重新绑定(rebind) | 跟新报文失败时,客户发出以跟新分配的信息资源 |
7 | 应答(reply) | 服务器发出,响应客户各种报文,主要是确认或拒绝客户的请求 |
8 | 释放(releasc) | 客户发出,通知分配资源了的服务器可以释放资源。 |
9 | 拒绝(decline ) | 客户发出,告知服务器某分配地址已经在使用。 |
10 | 重配置(reconfigure) | 服务器发出,发起一个以更新或请求报文开始的交换。促使客户刷新分配的信息 |
11 | 信息请求(informationrequecst) | 客户发出,用于无状态服务 |
12 | 中继转发(relay-forward) | 中继代理发出,封装从客户到服务器的报文 |
13 | 中继应答(relay-reply) | 服务器发出,通过中继封装一个返回到客户的报文。 |
DHCPv6工作原理
有状态自动分配
IPv6主机在地址分配之前,由IPv6节点生成链路本地地址并且经过DAD检验之后,首先会有一个链路路由器发现的过程,此时IPv6节点发送RS报文,链路路由器回应以RA报文,之前就已经提及,RA报文中有M,O字段,如果两个字段值都为1,则表示IPv6节点通过有状态DHCPv6进行配置。
DHCPv6服务器进行地址分配以及前缀分配有两种类型:四步交互分配和两步交互分配。
四步交互分配
当网络中存在有多个DHCPv6服务器时,常使用四步交互分配:
- 客户端发送Solicit报文以寻求DHCPv6服务器。
- 如果Solicit报文没有Rapid Commit选项,或DHCPv6服务器不支持快速分配过程,则服务器回复Advertise报文,通知客户端其存在关系。
- 客户端如果收到多个Advertise报文,则根据报文中服务器的优先级等参数选择最优服务器,并向所有服务器发送Request报文,其中包含已选择服务器的DUID.
- DHCPv6服务器回复Reply报文,确认将地址和网络配置参数分配给客户端使用。
两步交互分配
当网络中仅存在有一个DHCPv6服务器时,常使用两步交互分配,这种方法可以提高DHCPv6的工作效率,但为了防止多个服务器同时可以分配IPv6地址并回应Reply报文,管理员可配置服务器是否支持两步交互地址分配方式。
- 客户端发送Solicit报文,并带有Rapid Commit选项,标识客户端希望服务器能够快速为其分配地址和网络配置参数。
- DHCPv6服务器接收到报文后进行如下处理:
- 若支持快速分配地址,则直接返回Reply报文,带有分配给的Ipv6地址以及网络配置参数,当然也带有Rapid Commit选项。
- 若不支持快速分配,则采用四部交互方式开始进行分配。
无状态自动分配
节点接收的RA报文中M,O字段若标识为0和1的话,标识IPv6只通过DHCPv6获取
除IPv6地址以外的服务器配置信息。
其工作过程如下:
- 客户端以组播方式向服务器发送Information-Request报文,该报文中Option Request指定想要获取的配置参数。
- 服务器接收到报文后,为客户端配置参数,并以单播形式发送Reply报文。
中继工作原理
客户端与服务器之间并非直接通信,在他们之间会有一个中继代理对报文进行处理封装,其交互工作过程如下:
- 客户端向所有服务器以及中继的组播地址FF02::1:2发送请求报文。
中继转发报文有如下两种情况:
1)若中继与客户端处于同一链路上,即DHCPv6中继为DHCPv6客户端的第一跳中继,中继接收到的客户端报文,将其封装到Relay-Forward报文的中继消息选项,发送给服务器。
2)若中继与客户端处于不同链路上,中继接收的报文是来自其它中继的Relay-Forward报文,中继会狗仔一个新的Relay-Forwrad报文并发送给服务器或下一跳中继。
- 服务器从Relay-Forward报文中解析出客户端的请求,为客户端选择IPv6地址和其他配置参数,构造应答信息,并将应答信息封装到Relay-Reply报文的中继消息选项中发送给中继。
- 中继解析出服务器的应答,转发给客户端,客户端根据应答报文中服务器优先级选择最优选项对地址及其他网络配置参数进行配置。
IPv6/前缀选择
DHCPv6服务器对IPv6地址进行分配是有优先次序的。
- 选择IPv6地址池,服务器的接口必须绑定有IPv6地址池,所以特定端口下的客户端使用该端口绑定的地址池进行IPv6/前缀选择。
选择IPv6/前缀.
1) 如果地址池中为客户端已指定地址/前缀,优先选择与客户端DUID匹配的地址/前缀。
2)如果客户端报文中的IA选项带有有效地址/前缀,优先进行分配,如果改地址/前缀在地址池中不可用,则另外分配一个空闲地址/前缀给客户端。
3)从地址池选择空闲地址/前缀分配给客户端。
4)没有合适地址/前缀进行分配,则分配失败。
地址租约更新
服务器分配给客户端的地址是有租约的,其约定由生命期(包括地址优先生命期和有效生命期)和IA的两个参数,T1,T2,即续租时间点组成。
当客户端地址使用到期,则在T1时刻发送Renew报文给服务器,其中IA选项携带需要续租的IA地址。
如果客户端一直未收到T1续租报文的回应报文,则在T2时刻发送Rebind报文继续续租。
T1时刻
- 客户端在T1时刻发送Renew报文进行地址续租更新请求。
服务器回应Reply报文两种情况。
a) 若客户端可继续使用,则回应续租Reply报文,表示成功更新租约。
b) 若客户端不可再使用,则报文通知续租失败。
T2时刻
- 向所有服务器组播发送Rebind报文请求更新租约。
服务器回应Reply报文两种情况。
a) 若客户端可继续使用,则回应续租Reply报文,表示成功更新租约。
b) 若客户端不可再使用,则报文通知续租失败。