默认即自我配置
IPv6 的一项决定性特征,便是一台主机能在没有任何服务器、也没有任何手动设置之下配置出一个可用的地址。在 IPv4 倚赖 来发放地址之处,IPv6 能从路由器所广播的信息中、在本地把它们构建出来。其结果是单个接口通常会一下子拥有数个地址,每一个用于一种不同的目的,这会让从 IPv4 而来的人感到意外。
链路本地最先
在任何其他事之前,每个 IPv6 接口都在 fe80::/10 中配置一个链路本地地址(工具标注为链路本地的那种类型)。它在本地生成、从不被路由到本地链路之外,且其存在是为了让主机能立即与邻居和路由器交谈——包括去询问如何配置其余的地址。链路本地便是那个引导:它总是在场,而邻居发现一文中的邻居发现机制,便在它之上运行。
路由器通告决定方法
要取得一个全局可路由的地址,主机会侦听路由器通告(Router Advertisement)——路由器所发送的周期性消息(一台主机也可用一个路由器请求 Router Solicitation 来索取它)。该通告携带 on-link 前缀(几乎总是一个 /64),以及两个告诉主机如何自我配置的标志:
- M(Managed)标志说“用 DHCPv6 来取得一个地址”。
- O(Other)标志说“自己配置你的地址,但从 DHCPv6 取得其他设置、如 DNS”。
两个标志都关闭时,主机使用纯粹的无状态自动配置。这便是为何 IPv6 地址分配是一场介于路由器所通告之物与主机所选择之物之间的协商,而非单个服务器在发放租约。
SLAAC:构建你自己的地址
无状态地址自动配置(Stateless Address Autoconfiguration,RFC 4862)便是一台主机用以形成其自身地址的机制:取通告中的 /64 前缀,并附加一个 64 位的接口标识符。这便是一个子网必须是 /64 的全部缘由(见子网划分一文)。没有服务器追踪该分配,这便是“无状态”的含义。
那个接口标识符可以以数种方式形成,而这有着真实的隐私后果:
- 修改的 从接口的 MAC 地址推导出标识符,这一点工具能予以演示。它稳定且便利,但它把硬件地址嵌入主机所用的每一个 IPv6 地址中,让一个远端服务器得以跨网络追踪该设备。
- 稳定的、不透明的标识符(RFC 7217)产生一个按网络稳定、却不泄露任何硬件地址的标识符,在保留某条链路上一致地址的同时,修复了跨网络追踪的问题。
- 临时(隐私)地址(RFC 8981,它废止了较早的 RFC 4941)生成随时间轮换的随机标识符,使出站连接根本不呈现一个长寿命的地址。
现代操作系统通常为入站连接使用一个稳定地址、为出站连接使用一个轮换的临时地址,这便是为何单个接口会显示多个全局地址。
重复地址检测
在一台主机真正使用它所形成的任何地址之前,它会运行重复地址检测(Duplicate Address Detection):它为自己那个试探性的地址发送一个邻居请求(Neighbor Solicitation)并等待。若有人应答,该地址便已在使用之中、不得被认领。 是一份廉价的保险,确保自我配置不产生碰撞,而它倚赖于姊妹一文所描述的那同一套邻居发现消息。
DHCPv6 用于有状态的控制
当一名管理员想集中地追踪并分配地址时,DHCPv6(RFC 8415)提供有状态的分配,颇像 IPv4 的 DHCP:一个服务器租出特定的地址、并记录谁拥有什么。也存在一种无状态的 DHCPv6 模式,它只发放诸如 DNS 服务器之类的配置、而主机仍以 形成其自身的地址,这便是 O 标志所选取的。DHCPv6 也是前缀委派所栖身之处——家用路由器借以接收一整个前缀、以在其身后划分子网的那个机制。
许多地址,乃出于设计
要带走的那个心智模型,便是一台 IPv6 主机在很大程度上是自驾的。它总是有一个链路本地地址,它从路由器通告中习得前缀与配置方法,而依标志之别,它或以 SLAAC 构建自己的全局地址、或从 DHCPv6 租取它们,常常以一个稳定地址与一个轮换的临时地址并肩而告终。当工具向你展示一个地址并标识其类型时,那个类型便告诉你这些路径中是哪一条产生了它。