我的目标是跟踪分配了哪些地址,并将其分配给哪个接口。根据我所了解的信息,有几种方式可以为一个接口获取 IPv6 地址,我在下面的子章节中列出了这些方式。我已经强调了我所发现的,同时在这些章节中提出了一些问题。如果有人能纠正我所学的内容,或者回答这些问题,请不吝赐教。如果有人知道我可以找到更多信息的地方,我也不介意自己进一步研究。
编辑:我发现前缀委派实际上并不会导致地址分配。它被 DHCP 服务器用于从另一个 DHCP 服务器获取要使用的前缀。
获取 IPv6 地址的方法如下:
1.基于状态的地址自动配置(SLAAC) 2.有状态 DHCPv6
SLAAC
SLAAC 用于在小型网络中为接口生成 IPv6 地址。它几乎不需要配置,基本工作原理如下:
- 当接口上线时,客户端将使用其接口ID地址和链路本地前缀(
FE80::/10
)生成一个链路本地IPv6地址。 - 为了验证该地址是否唯一,会向该地址发送邻居请求(
NS
)消息。如果有回复,则表示该地址正在使用中,不能使用。自动配置会被中止,需要手动进行配置。问题1a: 这里真的没有后备方案吗? 假设在超时期限结束之前未收到回复,则假定该地址是唯一的,并将其分配为接口的链路本地地址。
现在节点可以与此链路上的所有其他节点互联
节点要么等待接收路由器通告(
RA
),要么向所有路由器的组播组发送路由器请求(RS
)消息。当路由器接收到RS
消息时,它将用RA
消息进行响应。该RA
消息将包含一个前缀。- 节点将使用前缀和其接口ID生成全局单播地址。
- 与创建链路本地地址时类似,节点将向该地址发送消息以确定其是否唯一。问题2: 这也是一个
NS
消息吗?如果有回复,则表示该地址已经在使用中,必须手动进行地址分配。问题1b: 再次确认,是否有任何自动恢复的方法? - 假设在超时期限结束之前没有收到回复,则将该地址分配为接口的全局IPv6地址。
问题3: 可以为接口获取多个地址。实际上,在上述过程结束时,单个接口将拥有2个地址 - 一个链路本地地址和一个全局单播地址。是否可以使用SLAAC获取此接口的其他地址?或者必须使用另一种方法(例如DHCPv6)?
有状态DHCPv6
节点可以使用上述步骤1-3获取链路本地地址。我认为这是可选的,它可以简单地在DHCP请求中使用::/128
(未指定)作为其源地址,直到被分配地址为止。
Solicit
,Advertise
,Request
,Reply
),而快速提交是一个2个消息交换(Solicit
,Reply
)。 当客户端在Solicit
消息中使用Rapid-Commit
选项请求时,将执行快速提交。它基本上与普通提交相同,并且因为对于我的使用没有影响,所以我现在会忽略它。此外,消息可能通过中继代理。从中继发送到服务器的消息是
RELAY_FORW
消息,从服务器发送到中继的消息是RELAY_REPL
消息。客户端与服务器之间的实际对话完全封装在一个OPTION_RELAY_MSG
选项中。接下来,我只处理非中继消息。如果消息被中继,则可以轻松获取原始消息,然后以下内容仍然适用。地址分配如下所示:
- 客户端向“所有DHCP服务器和中继”多播地址发送Solicit消息。该消息用于发现本地链路上的DHCP服务器的标识。
- DHCP服务器以Advertise消息响应本地多播地址。
- 客户端直接向DHCP服务器发送Request消息,并在其中包含选项,指示它希望获得IP地址。问题4:根据我看到的PCAP文件,似乎仍将此消息发送到多播地址
ff02::1:2
。这不直接从收到Advertise的DHCP服务器发送是否有任何原因? - DHCP服务器使用包含IP地址的Reply进行响应。
- 客户端应执行类似于SLAAC方法中步骤6的重复地址检测。
- 节点将此地址分配给接口,并可以开始使用它。
- 非临时地址分配(
IA_NA
) - 临时地址分配(
IA_TA
) - 前缀代理(
PD
)
Request
中包含一个选项来完成的,然后由服务器填充并在Reply
中返回。对于前两种方法,将返回完整的IPv6地址,然后可以将其分配为接口的IP地址。对于第三个方法,将返回类似于SLAAC方法中的RA
的前缀。然后使用该前缀与接口标识符创建完整的全局IPv6地址。问题5:在我的pcap捕获中,我经常看到
Solicit
和Advertise
也包含这些选项。在非快速情况下,由于Request
和随后的Reply
必须也包含该选项,因此这似乎是多余的。在Solicit
中包含此选项的目的是什么?DHCP服务器在被请求之前在Advertise
中创建IP地址(或前缀)的目的是什么?问题6:RFC指出,可以包括多个
IA_NA
(或IA_TA
)选项实例。我认为这意味着接口将具有多个地址。客户端是否只需在Request
中包含多个选项实例即可获取多个地址?如果DHCP服务器可以提供一些但不是所有地址,会发生什么?整个Reply
是否表明失败?还是会提供一些地址?对于DHCPv6,可以使用
Release
消息释放正在使用的地址。客户端可以使用Decline
消息拒绝由服务器在Reply
中分配的地址,而不是使用该地址。如果客户端未发送
Release
或Decline
,则服务器将继续为客户端保留该地址,直到其过期。问题7:如果客户端无法发送
Release
(或Decline
)并重新启动,则会启动新的DHCP请求。DHCP服务器是否会返回旧地址?还是会认为这是请求额外IP地址并分配一个新地址?我不确定由SLAAC或DHCP
PD
创建的地址如何释放(如果有)。也许这些地址的释放仅在内部完成,没有外部设备需要知道该事件。正如我在开头所说,我的目标是跟踪所有当前有效的地址分配。我的计划是执行以下操作:
- 创建一个以地址为索引的映射,存储分配给其的客户端(DUID)。
- 收到 DHCPv6
请求
、确认
、更新
、重新绑定
或带有Rapid-Commit
的扫描
的回复后,执行以下操作:- 提取
Client-DUID
选项 - 对于每个
IA_NA
或IA_TA
- 对于每个
IA
,设置map[address]=Client-DUID
- 存储地址的到期时间
- 对于每个
- 提取
- 当收到
拒绝
或释放
的回复
时,执行以下操作- 对于每个
IA_NA
或IA_TA
- 对于每个
IA
,删除map[address]
- 对于每个
- 对于每个
- 当地址过期时,它将从地图中删除
问题8: 如何检测 SLAAC 生成的地址或 DHCP PD
地址? 在消息中是否有可以用来重建完整 IP 地址的字段?我已经有了前缀,但接口 ID 是未知的。
这是否足以维护分配给客户端的 IP 地址列表?