7

我刚刚开始使用 IPv6,所以在过去的几天里我做了很多阅读。不幸的是,我的一些问题在我的研究中没有得到解答。

我的目标是跟踪分配了哪些地址,以及分配了哪些接口。根据我的阅读,接口可以通过几种方式获取 IPv6 地址,我在下面的小节中列出了这些方法。我已经强调了到目前为止我发现的内容,并在这些部分中提出了一些问题。如果有人可以对我所学的内容进行任何更正,或者对问题有答案,请这样做。如果有人知道我可以找到更多信息的地方,我不介意自己进行更多研究。

编辑:我发现前缀委派实际上并没有导致地址分配。DHCP 服务器使用它从另一个 DHCP 服务器获取要使用的前缀。


获取 IPv6 地址的方法有:

  1. 无状态地址自动配置 (SLAAC)
  2. 有状态 DHCPv6

SLAAC

SLAAC 在小型网络中用于为接口生成 IPv6 地址。它(几乎)不需要配置,并且基本上按如下方式工作:

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

    现在该节点已连接到此链接上的所有其他节点

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

  5. 该节点将生成一个带有前缀及其接口 ID 的全局单播地址。
  6. 与创建链接本地地址时类似,节点将向该地址发送消息以确定它是否是唯一的。 问题2:这也是一条NS信息吗? 如果有回复,则地址已在使用中,必须手动进行地址分配。 问题 1b:同样,是否有任何自动恢复方法?
  7. 假设在超时时间内没有回复,则将该地址作为全局 IPv6 地址分配给接口。

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

有状态 DHCPv6

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

有两种获取地址的方法——正常提交和快速提交。Normal 是 4 条消息交换 ( Solicit, Advertise, Request, Reply),Rapid 是 2 条消息交换 ( Solicit, Reply)。Rapid-Commit当客户端使用消息中的选项请求它时,会完成快速提交Solicit。它与 Normal 基本相同,并且由于它对我的使用没有影响,因此我现在将忽略它。

此外,消息有可能通过中继进行代理。从中继发送到服务器的消息是RELAY_FORW消息,从服务器发送到中继的消息是RELAY_REPL消息。客户端和服务器之间的实际对话完全封装在一个OPTION_RELAY_MSG选项中。对于以下内容,我只处理非中继消息。如果消息被转发,那么很容易获得原始消息并且以下仍然成立。

地址分配如下:

  1. Solicit客户端向“所有 DHCP 服务器和中继”多播地址发送消息。此消息的目的是发现本地链路上的 DHCP 服务器的身份。
  2. DHCP 服务器以Advertise消息响应本地多播地址。
  3. 客户端直接向 DHCP 服务器发送一条Request消息,其中包含表明它想要一个 IP 地址的选项。问题 4:在我看到的 PCAP 文件中,看起来这条消息仍然发送到多播地址ff02::1:2。这不是直接发送到接收广告的 DHCP 服务器的任何原因吗?
  4. DHCP 服务器以Reply包含 IP 地址的响应进行响应。
  5. 客户端应执行类似于 SLAAC 方法中的步骤 6 的重复地址检测。
  6. 节点将此地址分配给接口并可以开始使用它。

这是分配地址的一般方法,但更具体地说,有 3 种方法可以做到这一点:

  1. 非临时地址分配 ( IA_NA)
  2. 临时地址分配 ( IA_TA)
  3. 前缀委派 ( PD)

所有这三种方法都是通过在其中包含一个选项来完成的Request,然后由服务器填充并在Reply. 对于前两个,返回一个完整的 IPv6 地址,然后可以将其分配为接口的 IP 地址。对于第三个,返回一个类似于RASLAAC 方法中的前缀。然后将此前缀与接口标识符一起使用以创建完整的全球 IPv6 地址。

问题 5:在我的 pcap 捕获中,我看到Solicit并且Advertise经常包含这些选项。这在非快速情况下似乎是多余的,因为Request和后续Reply也必须包含该选项。将此选项包含在 中的目的是Solicit什么?AdvertiseDHCP服务器在被编辑之前创建IP地址(或前缀)的目的是Request什么?

问题 6:RFC 表明可以包含IA_NA(or ) 选项的多个实例。IA_TA我假设这意味着该接口将具有多个地址。Request客户端是否只是在获取多个地址中包含选项的多个实例?如果 DHCP 服务器可以提供部分地址,但不能提供全部地址,会发生什么情况?整体是否Reply表示失败?或者给了一些地址?


发布地址

对于 DHCPv6,可以通过消息释放正在使用的地址ReleaseReply客户端可以通过消息拒绝服务器分配的地址,Decline而不是使用该地址。

如果客户端发送Releaseor失败Decline,服务器将继续为客户端保留地址,直到过期。

问题 7:如果客户端无法发送Release(或Decline)并重新启动,它将发起新的 DHCP 请求。DHCP 服务器会返回旧地址吗?还是会假设这是对额外 IP 地址的请求并分配一个新地址?

我不确定如何PD释放 SLAAC 或 DHCP 创建的地址(如果有的话)。也许这些地址的释放只是在内部完成,外部设备不需要知道该事件。


正如我在开头所说的,我的目标是跟踪所有当前有效的地址分配。我的计划是执行以下操作:

  • 创建一个按地址索引的地图,该地图存储分配给它的客户端 (DUID)。
  • 在收到 DHCPv6ReplyRequestConfirmRenewRebindSolicitwith 时Rapid-Commit,请执行以下操作:
    • 提取Client-DUID选项
    • 对于每个IA_NAIA_TA
      • 对于每一个IA,设置map[address]=Client-DUID
      • 存储地址的过期时间
  • 在收到 aDeclineReplyto aRelease时,请执行以下操作
    • 对于每个IA_NAIA_TA
      • 对于每一个IA,设置删除map[address]
  • 当地址过期时,将从地图中删除

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

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

4

2 回答 2

2

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

首先,进行更正。地址不是通过PDDHCP 获得的。这就是 DHCP 服务器获取网络前缀以供其托管的 DHCP 客户端使用的方式。还有另一个 DHCP 服务器负责分发这些前缀。因此,PD可以忽略作为获取 IP 地址的方法。


问题 1a/b:这里真的没有退路吗?

答:没有自动回退机制。一个可以实现,但它是自定义的。

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

答案:是的

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

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

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

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


我仍然没有问题 4-7 的答案,但我目前并不太关心它们。

谢谢!!

于 2013-08-19T14:08:57.510 回答
0

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

于 2013-08-02T20:22:50.847 回答