【发布时间】:2013-07-30 16:59:24
【问题描述】:
我刚刚开始使用 IPv6,所以在过去几天里我做了很多阅读。不幸的是,我的一些问题在我的研究中没有得到解答。
我的目标是跟踪分配了哪些地址,以及将它们分配到了哪些接口。根据我的阅读,接口可以通过几种方式获取 IPv6 地址,我在下面的小节中列出了这些方法。我已经强调了到目前为止我发现的内容,并在这些部分中提出了一些问题。如果有人可以对我所学的内容进行任何更正,或者对问题有答案,请这样做。如果有人知道我可以找到更多信息的地方,我不介意自己进行更多研究。
编辑:我发现前缀委派实际上不会导致地址分配。 DHCP 服务器使用它从另一个 DHCP 服务器获取要使用的前缀。
获取IPv6地址的方法有:
- 无状态地址自动配置 (SLAAC)
- 有状态的 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 获得链路本地地址。我相信这是可选的,它可以简单地使用::/128(未指定)作为其在 DHCP 请求中的源地址,直到它被分配一个地址。
有两种获取地址的方法——正常提交和快速提交。 Normal 是 4 条消息交换(Solicit、Advertise、Request、Reply),Rapid 是 2 条消息交换(Solicit、Reply)。当客户端在Solicit 消息中使用Rapid-Commit 选项请求它时,快速提交就完成了。它与 Normal 基本相同,因为它对我的使用没有影响,所以我现在将忽略它。
此外,消息也有可能通过中继进行代理。从中继发送到服务器的消息是RELAY_FORW 消息,从服务器发送到中继的消息是RELAY_REPL 消息。客户端和服务器之间的实际对话完全封装在OPTION_RELAY_MSG 选项中。对于以下内容,我只处理非中继消息。如果消息被转发,那么很容易获得原始消息并且以下仍然成立。
地址分配如下:
- 客户端向“所有 DHCP 服务器和中继”多播地址发送
Solicit消息。此消息的目的是发现本地链路上 DHCP 服务器的身份。 - DHCP 服务器以
Advertise消息响应本地多播地址。 - 客户端直接向 DHCP 服务器发送一个
Request消息,其中包含表明它想要一个 IP 地址的选项。 问题 4:在我看到的 PCAP 文件中,看起来这条消息仍然发送到多播地址ff02::1:2。有什么理由不直接将其发送到接收广告的 DHCP 服务器? - DHCP 服务器以包含 IP 地址的
Reply进行响应。 - 客户端应执行类似于 SLAAC 方法中的步骤 6 的重复地址检测。
- 节点将此地址分配给接口并可以开始使用它。
这是分配地址的一般方法,但更具体地说,有 3 种方法可以做到这一点:
- 非临时地址分配 (
IA_NA) - 临时地址分配 (
IA_TA) - 前缀委派 (
PD)
所有三种方法都是通过在Request 中包含一个选项来完成的,然后由服务器填充并在Reply 中返回。对于前两个,返回一个完整的 IPv6 地址,然后可以将其分配为接口的 IP 地址。对于第三个,返回一个前缀,类似于 SLAAC 方法中的RA。然后将此前缀与接口标识符一起使用以创建完整的全球 IPv6 地址。
问题 5:在我的 pcap 捕获中,我看到 Solicit 和 Advertise 通常也包含这些选项。这在非快速情况下似乎是多余的,因为Request 和随后的Reply 也必须包含该选项。在Solicit 中包含此选项的目的是什么?在Request 之前,DHCP 服务器在Advertise 中创建IP 地址(或前缀)的目的是什么?
问题 6:RFC 表明可以包含多个 IA_NA(或 IA_TA)选项实例。我假设这意味着该接口将具有多个地址。客户端是否简单地在Request 中包含选项的多个实例以获取多个地址?如果 DHCP 服务器可以提供部分地址,但不能提供全部地址,会发生什么情况?整个Reply 是否表示失败?还是给出一些地址?
发布地址
对于 DHCPv6,可以使用Release 消息释放正在使用的地址。服务器在Reply 中分配的地址可以被客户端使用Decline 消息拒绝而不是被使用。
如果客户端发送Release或Decline失败,服务器将继续为客户端保留地址,直到过期。
问题 7:如果客户端无法发送 Release(或 Decline)并重新启动,它将发起新的 DHCP 请求。 DHCP 服务器会返回旧地址吗?或者它会假设这是一个额外 IP 地址的请求并分配一个新地址?
我不确定 SLAAC 或 DHCP PD 创建的地址是如何发布的(如果有的话)。也许这些地址的释放只是在内部完成,外部设备不需要知道该事件。
正如我在开头所说的,我的目标是跟踪所有当前有效的地址分配。我的计划是:
- 创建一个按地址索引的地图,该地图存储分配给它的客户端 (DUID)。
- 在收到 DHCPv6
Reply到Request、Confirm、Renew、Rebind或Solicit和Rapid-Commit时,请执行以下操作:- 提取
Client-DUID选项 - 对于每个
IA_NA或IA_TA- 对于每个
IA,设置map[address]=Client-DUID - 存储地址的过期时间
- 对于每个
- 提取
- 在收到
Decline或Reply到Release时,执行以下操作- 对于每个
IA_NA或IA_TA- 对于每个
IA,设置删除map[address]
- 对于每个
- 对于每个
- 地址过期后,将从地图中删除
问题 8:如何检测 SLAAC 生成的地址或 DHCP PD 地址?消息中是否有一些字段可用于重新生成完整的 IP 地址?我已经有了前缀,但接口 ID 未知。
这足以维护分配给客户端的 IP 地址列表吗?
【问题讨论】:
-
这是一个很长的问题:)。
-
是的,我已经得到了一些答案,会更新它。
-
这篇文章很长,我稍后会完成这篇文章,这是一个问题,但我从这篇文章中学到了很多东西。谢谢。稍后我会学习并尝试回答一些问题。
-
这里有一些 DAD 的实现细节:criticalindirection.com/2015/06/30/ipv6_dad_floating_ips
-
你可能会在networkengineering.stackexchange.com得到这个问题的更好答案