一. Link-Local Address 的生成方式
生成 “链路本地地址”,有 2 种方式
▷ 手动配置
▷ 自动配置
其中 “自动配置” 根据算法,又分为
▷ eui64:根据 mac 地址换算而来
▷ stable_secret:跟随网络环境的变化而变化,处于固定网络环境时其值将固定
▷ random:随机生成
二. Global Address 的生成方式
生成 “全球单播地址”(或者 “唯一本地地址”),有两种方式
▷ 手动配置
▷ 自动配置
其中 “自动配置” 根据获取方式,又分为
▷ 无状态(Stateless)
根据路由通告报文 RA(Router Advertisement)包含的 prefix 前缀信息自动配置 IPv6 地址,组成方式是 Prefix + (EUI64 or 随机)。Stateless 也称为 SLAAC(Stateless address autoconfiguration)
▷ 有状态(Stateful)
通过 DHCPv6 方式获得 IPv6 地址
其中 “有状态” 又分为 2 种
▷ 有状态 DHCPv6(Stateful DHCPv6)
IPv6 地址、其他参数(如 DNS)均通过 DHCPv6 获取
▷ 无状态 DHCPv6(Stateless DHCPv6)
IPv6 地址依然通过路由通告 RA 方式生成,其他参数(如 DNS)通过 DHCPv6 获取
为了避免混淆,在此解释下有状态、无状态到底是什么。
首先,请明确一点,有状态、无状态仅针对于 IPv6 地址分配方式,并不包含其他参数.
▷ 有状态:可控、可管理
在网络中存在一个 IP 地址管理者,它能够识别客户端,根据不同的客户端,分配对应的 IPv6 地址,客户端与服务端之间需要维护 IP 地址的租期及续约。目前实现这种效果的,就是 DHCPv6 协议,IP 地址管理者就是 DHCPv6 Server
▷ 无状态:不可控、难管理
在网络中只有网关,没有 IP 地址管理者。因此无人去识别客户端,每个客户端根据网关发送的相同的 RA 报文内容,自行配置 IPv6 地址
三. RA 报文中 3 个关键的 Flag
RA 报文中存在 3 个关键的 flag bit:
flag type | 状态 | 置位(bit) | 含义 |
---|---|---|---|
Autonomous flag(A flag) 表示是否配置无状态 IP。 在一个 RA 报文中,可存在多个 prefix,比如 2401::/64、2402::/64、2403::/64,每个 prefix 都可以独立配置 A flag。 | on | 1 | 表示客户端应当在该 prefix 范围内自动生成 IPv6 地址(客户端通过 DAD 自行保证地址可用),并配置子网路由条目、网关。 |
off | 0 | 表示客户端不应当在该 prefix 范围内自动生成 IPv6 地址,但是可以配置子网路由条目、网关。 | |
Managed flag(M flag) 表示是否配置有状态 IP。 M flag 是 RA 报文的全局参数,一个 RA 报文只有一个 M flag。 | on | 1 | 表示在 stateless 流程结束后开始 stateful 流程,也就是告诉客户端可以通过 DHCPv6 来获得 IPv6 地址和其他参数(如 DNS 列表) |
off | 0 | 表示不通过 DHCPv6 来获得 IPv6 地址。 | |
Other flag( O flag) 表示是否通过 DHCPv6 获得除 IP 以外的其他参数(如 DNS 列表)。 O flag 也是 RA 报文中的全局参数,一个 RA 报文只有一个 O flag。 注意:仅当 M flag 为 off 时,该参数才会被读取。 | on | 1 | 当 M flag 为 on,或者 M flag 为 off 且至少有一个 A flag 为 on 时,将通过 DHCPv6 获得其他参数。 |
off | 0 | 当 M flag 为 on 时,依然将通过 DHCPv6 获得其他参数;当 M flag 也为 off 时,将不通过 DHCPv6 获得其他参数。 |
四. 流程示意图
无状态和有状态并不是相互对立的,可以同时存在,也就是一张网卡上可以同时出现通过 RA 生成的 IP 以及通过 DHCPv6 获得的 IP。通过下面这张笔者绘制的流程图可知晓其中奥秘。
从图中可以看到,顺序为:
1️⃣ Stateless 自动配置“链路本地地址”
2️⃣ Stateless 自动配置“全球地址”(或“唯一本地地址”)
3️⃣ Stateful 自动配置“全球地址”(或“唯一本地地址”)和其他参数,其中 Stateful 阶段中存在 Stateful DHCPv6 或 Stateless DHCPv6
注意:
部分客户端操作系统或网络管理器当 Stateless 阶段没有收到 RA 报文后,就到此结束,不会走 Stateful 阶段,比如 CentOS 7、Ubuntu 17 的默认逻辑都是这样,而 windows server 2012 就会继续走 Stateful 阶段。
五. 测试获得 IP 效果
测试环境:客户端基于 CentOS 7+NetworkManager(即系统默认的网络管理方式)进行测试
▪ 网关会发送 RA 报文,包含一个 prefix
▪ DHCPv6 Server 会分配 IP、DNS
测试内容:测试 M、O、A flag 在所有排列组合的情况下
▪ 客户端是否会通过 RA 报文配置无状态 IP
▪ 客户端是否会通过 RA 报文配置 prefix 子网路由
▪ 客户端是否会通过 RA 报文配置 gateway
▪ 客户端是否会通过 DHCPv6 获得有状态 IP
▪ 客户端是否会通过 DHCPv6 获得 DNS
测试结果:
六. 应用场景(选择无状态还是有状态)
何时采用无状态、何时采用有状态,关键看应用场景。核心在于是否需要控制IP地址,比如保持IP不变,如果需要控制,就采用有状态;如果无需控制,就采用无状态。
▷ 服务端领域:如对外提供服务,通常需要采用有状态IP。因为业务IP的突然变化容易导致业务中断(除非做好服务发现)
▷ 客户端领域:如移动设备、办公室内PC机,只需要上IPv6互联网,并不需要对外提供服务,可以采用无状态IP
七. 后续内容
由于篇幅有限,本文尚未贴出实验的详细配置。将会在《IPv6系列》后续文章里,贴出实验的完整信息,包括RA、DHCPv6的配置,以及客户端的配置,敬请关注。
附. 参考文档
http://www.6deploy.eu/tutorials/080-6deploy_ipv6_autoconfiguration_mechs_v0_4.pdf
https://cshihong.github.io/2018/02/01/DHCPv6基础/
via:IPv6系列-彻底弄明白有状态与无状态配置IPv6地址-有状态和无状态ipv6 作者:小慢哥本人
2019-10-09 08:29:30
https://www.51cto.com/article/603898.html