IPv6地址分配

7
我刚开始接触IPv6,所以在过去几天中我阅读了很多相关文献。不幸的是,我的一些问题在我的研究中没有得到解答。
我的目标是跟踪分配了哪些地址,并将其分配给哪个接口。根据我所了解的信息,有几种方式可以为一个接口获取 IPv6 地址,我在下面的子章节中列出了这些方式。我已经强调了我所发现的,同时在这些章节中提出了一些问题。如果有人能纠正我所学的内容,或者回答这些问题,请不吝赐教。如果有人知道我可以找到更多信息的地方,我也不介意自己进一步研究。
编辑:我发现前缀委派实际上并不会导致地址分配。它被 DHCP 服务器用于从另一个 DHCP 服务器获取要使用的前缀。
获取 IPv6 地址的方法如下:
1.基于状态的地址自动配置(SLAAC) 2.有状态 DHCPv6

SLAAC

SLAAC 用于在小型网络中为接口生成 IPv6 地址。它几乎不需要配置,基本工作原理如下:

  1. 当接口上线时,客户端将使用其接口ID地址和链路本地前缀(FE80::/10)生成一个链路本地IPv6地址。
  2. 为了验证该地址是否唯一,会向该地址发送邻居请求(NS)消息。如果有回复,则表示该地址正在使用中,不能使用。自动配置会被中止,需要手动进行配置。问题1a: 这里真的没有后备方案吗?
  3. 假设在超时期限结束之前未收到回复,则假定该地址是唯一的,并将其分配为接口的链路本地地址。

    现在节点可以与此链路上的所有其他节点互联

  4. 节点要么等待接收路由器通告(RA),要么向所有路由器的组播组发送路由器请求(RS)消息。当路由器接收到RS消息时,它将用RA消息进行响应。该RA消息将包含一个前缀。

  5. 节点将使用前缀和其接口ID生成全局单播地址。
  6. 与创建链路本地地址时类似,节点将向该地址发送消息以确定其是否唯一。问题2: 这也是一个NS消息吗?如果有回复,则表示该地址已经在使用中,必须手动进行地址分配。问题1b: 再次确认,是否有任何自动恢复的方法?
  7. 假设在超时期限结束之前没有收到回复,则将该地址分配为接口的全局IPv6地址。

问题3: 可以为接口获取多个地址。实际上,在上述过程结束时,单个接口将拥有2个地址 - 一个链路本地地址和一个全局单播地址。是否可以使用SLAAC获取此接口的其他地址?或者必须使用另一种方法(例如DHCPv6)?

有状态DHCPv6

节点可以使用上述步骤1-3获取链路本地地址。我认为这是可选的,它可以简单地在DHCP请求中使用::/128(未指定)作为其源地址,直到被分配地址为止。

获取地址的方法有两种:普通和快速提交。 普通方法需要4个消息交换(SolicitAdvertiseRequestReply),而快速提交是一个2个消息交换(SolicitReply)。 当客户端在Solicit消息中使用Rapid-Commit选项请求时,将执行快速提交。它基本上与普通提交相同,并且因为对于我的使用没有影响,所以我现在会忽略它。
此外,消息可能通过中继代理。从中继发送到服务器的消息是RELAY_FORW消息,从服务器发送到中继的消息是RELAY_REPL消息。客户端与服务器之间的实际对话完全封装在一个OPTION_RELAY_MSG选项中。接下来,我只处理非中继消息。如果消息被中继,则可以轻松获取原始消息,然后以下内容仍然适用。
地址分配如下所示:
  1. 客户端向“所有DHCP服务器和中继”多播地址发送Solicit消息。该消息用于发现本地链路上的DHCP服务器的标识。
  2. DHCP服务器以Advertise消息响应本地多播地址。
  3. 客户端直接向DHCP服务器发送Request消息,并在其中包含选项,指示它希望获得IP地址。问题4:根据我看到的PCAP文件,似乎仍将此消息发送到多播地址ff02::1:2。这不直接从收到Advertise的DHCP服务器发送是否有任何原因?
  4. DHCP服务器使用包含IP地址的Reply进行响应。
  5. 客户端应执行类似于SLAAC方法中步骤6的重复地址检测。
  6. 节点将此地址分配给接口,并可以开始使用它。
这是分配地址的一般方法,但更具体地说,可以有3种方法来完成此操作:
  1. 非临时地址分配(IA_NA
  2. 临时地址分配(IA_TA
  3. 前缀代理(PD
所有三种方法都是通过在Request中包含一个选项来完成的,然后由服务器填充并在Reply中返回。对于前两种方法,将返回完整的IPv6地址,然后可以将其分配为接口的IP地址。对于第三个方法,将返回类似于SLAAC方法中的RA的前缀。然后使用该前缀与接口标识符创建完整的全局IPv6地址。
问题5:在我的pcap捕获中,我经常看到SolicitAdvertise也包含这些选项。在非快速情况下,由于Request和随后的Reply必须也包含该选项,因此这似乎是多余的。在Solicit中包含此选项的目的是什么?DHCP服务器在被请求之前在Advertise中创建IP地址(或前缀)的目的是什么?
问题6:RFC指出,可以包括多个IA_NA(或IA_TA)选项实例。我认为这意味着接口将具有多个地址。客户端是否只需在Request中包含多个选项实例即可获取多个地址?如果DHCP服务器可以提供一些但不是所有地址,会发生什么?整个Reply是否表明失败?还是会提供一些地址?
对于DHCPv6,可以使用Release消息释放正在使用的地址。客户端可以使用Decline消息拒绝由服务器在Reply中分配的地址,而不是使用该地址。
如果客户端未发送ReleaseDecline,则服务器将继续为客户端保留该地址,直到其过期。
问题7:如果客户端无法发送Release(或Decline)并重新启动,则会启动新的DHCP请求。DHCP服务器是否会返回旧地址?还是会认为这是请求额外IP地址并分配一个新地址?
我不确定由SLAAC或DHCP PD创建的地址如何释放(如果有)。也许这些地址的释放仅在内部完成,没有外部设备需要知道该事件。
正如我在开头所说,我的目标是跟踪所有当前有效的地址分配。我的计划是执行以下操作:
  • 创建一个以地址为索引的映射,存储分配给其的客户端(DUID)。
  • 收到 DHCPv6 请求确认更新重新绑定 或带有 Rapid-Commit扫描 的回复后,执行以下操作:
    • 提取 Client-DUID 选项
    • 对于每个 IA_NAIA_TA
      • 对于每个 IA,设置 map[address]=Client-DUID
      • 存储地址的到期时间
  • 当收到 拒绝释放回复 时,执行以下操作
    • 对于每个 IA_NAIA_TA
      • 对于每个 IA,删除 map[address]
  • 当地址过期时,它将从地图中删除

问题8: 如何检测 SLAAC 生成的地址或 DHCP PD 地址? 在消息中是否有可以用来重建完整 IP 地址的字段?我已经有了前缀,但接口 ID 是未知的。

这是否足以维护分配给客户端的 IP 地址列表?


这是一个很长的问题 :). - thuovila
是的,我已经得到了一些答案并将进行更新。 - Trenin
这是一篇很长的文章,我会稍后完成它。虽然这是一个问题,但我从这篇文章中学到了很多。谢谢。我会研究并尝试回答一些问题。 - dspjm
DAD的一些实现细节在这里:http://criticalindirection.com/2015/06/30/ipv6_dad_floating_ips/。 - user31986
你可以在https://networkengineering.stackexchange.com上获得更好的答案。 - StockB
2个回答

2

好的 - 所以我做了更多的研究,现在我有大部分答案了。

首先,更正一下。地址不是通过DHCP获取的PD。这是DHCP服务器获取用于其托管的DHCP客户端的网络前缀的方法。还有另一个DHCP服务器处理这些前缀的分配。因此,可以忽略使用PD来获取IP地址的方法。


问题1a/b:这里真的没有备用吗?

答案:没有自动备用机制。可以实现一个,但它将是定制的。

问题2:这也是NS消息吗?

答案:是的

问题3:接口可能有多个地址。实际上,在上述过程结束时,单个接口将有两个地址 - 一个链路本地地址和一个全局单播地址。是否可以使用SLAAC为此接口获取其他地址?或必须使用另一种方法(例如DHCPv6)?

答案:可以使用SLAAC生成多个地址。客户端可以使用来自多个路由器的路由器通告,每个路由器可以广播多个前缀。主机可以使用每个前缀创建全局单播地址。

问题8(修改):如何检测SLAAC生成的地址?消息中是否有某个字段可用于重新生成完整的IP地址?我已经有前缀,但接口ID未知。

答案:检测它们的唯一方法是侦听NS消息。由于这些消息是可选的,因此没有保证检测SLAAC生成的地址的方法。


我仍然没有问题4-7的答案,但我现在不太担心它们。

谢谢!


0

获取IPv6地址的第三种方法是手动配置。


是的 - 我在我的帖子中提到了这一点,作为自动配置失败时的备份方法。我不关心那种情况,因为我的目标是跟踪IP地址分配情况。如果它们是静态分配的,那么分配也可以静态记录。 - Trenin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接