定义:
IPv6动态主机配置协议DHCPv6(Dynamic Host Configuration Protocol for IPv6)是针对IPv6编址方案设计,为主机分配IPv6地址/前缀和其他网络配置参数。
DHCPv6是一种运行在客户端和服务器之间的协议,与IPv4中的DHCP一样,所有的协议报文都是基于UDP的。但是由于在IPv6中没有广播报文,因此DHCPv6使用组播报文,客户端也无需配置服务器的IPv6地址。
IPV6地址分配类型:
IPv6协议具有地址空间巨大的特点,但同时长达128比特的IPv6地址又要求高效合理的地址自动分配和管理策略。
目前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 Client:
DHCPv6客户端,通过与DHCPv6服务器进行交互,获取IPv6地址/前缀和网络配置信息,完成自身的地址配置功能。 - DHCPv6 Relay:
DHCPv6中继代理,负责转发来自客户端方向或服务器方向的DHCPv6报文,协助DHCPv6客户端和DHCPv6服务器完成地址配置功能。一般情况下,DHCPv6客户端通过本地链路范围的组播地址与DHCPv6服务器通信,以获取IPv6地址/前缀和其他网络配置参数。如果服务器和客户端不在同一个链路范围内,则需要通过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可以包含一个或多个地址信息。
DHCP报文结构:
- msg-type:1字节,表示报文的类型,取值为1~13。
- 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服务器为客户端分配地址/前缀的过程分为两类:
- 交互两个消息的快速分配过程
- 交互四个消息的分配过程
交互2个消息快速分配过程:DHCP上的改进,提高效率。
- DHCPv6客户端在发送的Solicit消息中携带Rapid Commit选项,标识客户端希望服务器能够快速为其分配地址/前缀和网络配置参数;(组播)
- 如果DHCPv6服务器支持快速分配过程,则直接返回Reply消息,为客户端分配IPv6地址/前缀和其他网络配置参数。如果DHCPv6服务器不支持快速分配过程,则采用交互四个消息的分配过程为客户端分配IPv6地址/前缀和其他网络配置参数。(单播)
交互四个消息的分配过程(和普通DHCP相似,,这里就不重复描述了):
Solicit 报文中没有携带 Rapid Commit 选项,或 Solicit 报文中携带 Rapid Commit 选项,但服务器不支持快速分配过程,则 DHCPv6 服务器回复 Advertise 报文,进行4个消息交互。
租约更新:
通过Renew更新地址/前缀租约,DHCP中使用的是request报文,这里单独分出来Renew报文进行更新。
如果在T1时(0.5倍生命值)发送的Renew请求更新租约,但是没有收到DHCPv6服务器的回应报文,则DHCPv6客户端会在T2(推荐值为首选生命期的0.875倍)时,向所有DHCPv6服务器组播发送Rebind报文请求更新租约。如果客户端可以继续使用该地址/前缀,则DHCPv6服务器回应续约成功的Reply报文,通知DHCPv6客户端已经成功更新地址/前缀租约;如果该地址/前缀不可以再分配给该客户端,则DHCPv6服务器回应续约失败的Reply报文,通知客户端不能获得新的租约;如果DHCPv6客户端没有收到服务器的应答报文,则到达有效生命期后,客户端停止使用该地址/前缀。
快速分配实验:
Sever:
全局配置:
ipv6 //开启IPv6
dhcp enable //配置DHCP
interface GigabitEthernet0/0/0 //进入接口
ipv6 enable
ipv6 address 2002::1/64
dhcpv6 server client rapid-commit //开启快速分配
dhcpv6 pool client //配置地址池
address prefix 2002::/64
excluded-address 2002::1
dns-server 3000::1
Client:(只有路由器能够模拟,PC不能模拟)
ipv6 //开启IPv6
dhcp enable //配置DHCP
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address auto link-local //先必须配置本地链路地址才能让接口打开
ipv6 address auto dhcp rapid-commit //开启快速分配接收
抓包:单播地址为链路本地地址
Solicit报文:
我们可以看到Rapid Commit字段存在,表示快速获取。Transaction ID和Reply报文的相同。
Reply报文:
Transaction报文 ID和Solicit报文的相同,然后有分配的IPv6地址,Rapid Commit字段依然存在。
DHCPv6有/无状态配置过程:
原理:
这是在IPv6中IPv4中DHCP很大的差别,主要是因为IPv6中不仅仅是可以通过DHCPv6或者IP地址,还可以通过RA/RD报文从自己最近的路由器获取IP地址。 DHCPv6可以向IPv6主机提供有状态的地址配置或无状态的配置设置:
无状态地址自动配置用于对链接本地地址和其他非链接本地地址两者进行配置,方法是与相邻路由器交换路由器请求和路由器公告消息。
有状态地址自动配置通过使用如DHCP的配置协议,用来配置非链接本地地址。
IPv6主机自动执行无状态地址自动配置,并在相邻路由器发送的路由器公告消息中使用基于以下标记的配置协议(如DHCPv6):
托管地址配置标记,也称为M标记。设置为1时,此标记指示主机使用配置协议来获取有状态地址。其他有状态配置标记,也称为O标记。设置为1时,此标记指示主机使用配置协议来获取其他配置设置。结合M和O标记的值可以产生以下组合:
- MO=00(无DHCPv6)
此组合对应不具有DHCPv6基础结构的网络。主机使用非链接本地地址的路由器公告以及其他方法(如手动配置)来配置其他设置。 - MO=11
DHCPv6用于这两种地址(链接本地地址和其他非链接本地地址)和其他配置设置。该组合称为DHCPv6有状态,其中DHCPv6将有状态地址分配给IPv6主机。 - MO=01
DHCPv6不用于分配地址,仅用来分配其他配置设置。相邻路由器配置为通告非链接本地地址前缀,IPv6主机从中派生出无状态地址。此组合称为DHCPv6无状态:DHCPv6不为IPv6主机分配有状态地址,但分配无状态配置设置。 - MO=10(X,没有这样使用)
在此组合中,DHCPv6用于地址配置,但不用于其他设置。因为IPv6主机通常需要使用其他设置(如域名系统(DNS)服务器的IPv6地址)进行配置,所以这是一种不太可能的组合。
DHCPv6无状态过程如下:
- 客户端以组播的方式向DHCPv6服务器发送information-request报文,该报文中携带Option request选项,指定客户端要从服务器获取的配置参数。
- 服务器收到information-Request报文后,为客户端分配网络配置参数,并单播发送Reply报文将网络配置参数返回给客户端。
- 客户端检查Reply报文中提供的信息,如果与information-Request报文中请求的配置参数相符,则按照Reply报文中提供的参数进行网络配置;否则,忽略该参数。如果接收到多个Reply报文,客户端将选择最先收到的Reply报文,并根据该报文中提供的参数完成客户端无状态配置。
DHCPv6中继工作原理:
- DHCPv6客户端向所有DHCPv6服务器和中继的组播地址FF02::1:2发送请求;
- DHCPv6中继接收到请求后,将其封装在Reply-forward报文的中继消息选项(Relay Message Option)中,并将Relay-forward报文发送给DHCPv6服务器;
- DHCPv6服务器从Relay-forward报文中解析出客户端的请求,为客户端选取IPv6地址和其他参数,构造应答消息,将应答消息封装在Relay-reply报文的中继消息选项中,并将Relay-reply报文发送给DHCPv6中继;
- DHCPv6中继从Relay-Reply报文中解析出服务器的应答,转发给DHCPv6客户端;
DHCPv6客户端根据DHCPv6服务器分配的IPv6地址/前缀和其他参数进行网络配置。
中继+有状态地址配置实验:
前提:
保证Relay与用户相连网段能和Sever互通,因为他们是用这两个IP地址进行通信的,所以需要配置对应的全球单播地址和动态路由,这里省略。
Sever上主要配置:
dhcpv6 pool guest //配置地址池,与中继g0/0/1接口在同一网段
address prefix 2001::/64
excluded-address 2001::1
dns-server 3000::1
interface GigabitEthernet0/0/0 //进入接口下使用地址池
ipv6 enable
ipv6 address 2002::1/64
dhcpv6 server guest
中继上主要配置:
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address 2002::2/64
interface GigabitEthernet0/0/1
ipv6 enable
ipv6 address 2001::1/64
ipv6 nd autoconfig managed-address-flag //设置M位,表示地址和前缀由DHCP服务器分配
ipv6 nd autoconfig other-flag //设置O位,表示DNS等参数由自己分配
dhcpv6 relay destination 2002::1 //设置服务器地址
最后在服务器上查看是否得到了相应的IP地址:成功获取。
因为模拟器原因DNS服务器的地址没有显示,可以成功ping通服务器:
这里需要注意的是,DHCPv6不能配置网关,因为网关会根据中继发送的报文的本地链路地址作为自己的网关。
报文抓包:
客户与中继之间:使用的单播地址都是链路本地地址,因为中继和客户端必须在同一网段。
中继与服务器之间:因为在不同的网段所以使用全球单播地址通信。
参考资料:华为hedex文档