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