IPv6地址分配

Tre*_*nin 6 dhcp ipv6

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

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

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


获取IPv6地址的方法有:

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

SLAAC

SLAAC用于小型网络,为接口生成IPv6地址.它需要(几乎)没有配置,基本上如下工作:

  1. 当接口联机时,客户端将使用其接口ID地址和链接本地前缀(FE80::/10)生成链接本地IPv6地址.
  2. 要验证此地址是唯一的,NS会向该地址发送Neighbor Solicitation()消息.如果有回复,则该地址正在使用中且无法使用.自动配置中止,配置应手动进行. 问题1a:这里真的没有倒退吗?
  3. 假设在超时时段结束时没有收到回复,则假定该地址是唯一的,并将其指定为接口的链路本地地址.

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

  4. 节点等待接收Router Advertisement(RA),或者向RS所有路由器的多播组发送Router Solicitation()消息.当RS路由器收到a时,它会响应RA.在RA将包含一个前缀.

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

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

有状态DHCPv6

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

有两种获取地址的方法 - 正常和快速提交.正常是一个4消息交换(Solicit,Advertise,Request,Reply),和快速是2消息交换(Solicit,Reply).当客户端Rapid-CommitSolicit消息中使用选项请求快速提交时.它与Normal基本相同,因为它对我的使用没有任何影响,我现在暂时忽略它.

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

地址分配如下:

  1. 客户端向Solicit"所有DHCP服务器和中继"多播地址发送消息.此消息的目的是发现本地链路上的DHCP服务器的标识.
  2. DHCP服务器响应Advertise本地多播地址的消息.
  3. 客户端Request直接向DHCP服务器发送消息,其中的选项指示它希望拥有IP地址.问题4:在我看到的PCAP文件中,看起来此消息仍然发送到多播地址ff02::1:2.是什么原因导致这不是直接发送到收到Advertise的DHCP服务器?
  4. DHCP服务器以Reply包含IP地址的响应进行响应.
  5. 客户端应执行类似于SLAAC方法中步骤6的重复地址检测.
  6. 节点将此地址分配给接口,并可以开始使用它.

这是分配地址的一般方法,但更具体地说,有三种方法可以实现:

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

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

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

问题6:RFC表明可以包含IA_NA(或IA_TA)选项的多个实例.我认为这意味着接口将具有多个地址.客户端是否只是在Request获取多个地址中包含该选项的多个实例?如果DHCP服务器可以提供一些但不是所有地址会发生什么?整个Reply表明失败了吗?或者是给出了一些地址?


发布地址

对于DHCPv6,可以使用Release消息释放正在使用的地址.Reply客户端可以拒绝服务器在a中分配的地址,Decline而不是使用消息.

如果客户端无法发送ReleaseDecline,则服务器将继续保留客户端的地址,直到它过期.

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

我不确定如何PD释放SLAAC或DHCP创建的地址.也许这些地址的发布只在内部完成,没有外部设备需要知道该事件.


正如我在开始时所说,我的目标是跟踪当前有效的所有地址分配.我的计划是做以下事情:

  • 创建由地址索引的映射,该映射存储分配给它的客户端(DUID).
  • 在收到的DHCPv6的ReplyRequest,Confirm,Renew,Rebind,或SolicitRapid-Commit,请执行以下操作:
    • 提取Client-DUID选项
    • 对于每个IA_NAIA_TA
      • 每个IA,集map[address]=Client-DUID
      • 存储地址的到期时间
  • 收到a DeclineReplya后Release,请执行以下操作
    • 对于每个IA_NAIA_TA
      • 对于每个IA,设置删除map[address]
  • 当地址过期时,它将从地图中删除

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

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

Tre*_*nin 2

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

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


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

答:没有自动回退机制。可以实施其中之一,但这将是定制的。

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

答案:是的

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

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

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

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


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

谢谢!!