第115篇:IPv6 地址配置:SLAAC、有状态 DHCPv6、无状态 DHCPv6
关键词:SLAAC、EUI-64、DHCPv6、有状态DHCPv6、无状态DHCPv6、RA Flag、地址自动配置
一、引言
在前一篇第114篇中,我们深入学习了 NDP 协议,特别是 RA 报文在路由器发现和前缀通告中的作用。RA 报文中的 M 和 O Flag 决定了终端如何获取 IPv6 地址和其他网络参数。
IPv6 的地址配置方式远比 IPv4 丰富,主要包括三种模式:SLAAC(无状态地址自动配置)、有状态 DHCPv6 和无状态 DHCPv6。理解这些配置方式的原理和适用场景,是 IPv6 网络规划的基础。
二、核心概念
2.1 IPv6 地址配置方式对比
| 配置方式 | 地址获取 | 其他参数(DNS等) | 管理复杂度 | 适用场景 |
|---|---|---|---|---|
| SLAAC | 主机自行构造 | 无 | 低 | 简单网络,不需要集中管理 |
| 有状态 DHCPv6 | DHCPv6 服务器分配 | DHCPv6 服务器分配 | 高 | 需要审计、固定地址分配 |
| 无状态 DHCPv6 | 主机自行构造 | DHCPv6 服务器分配 | 中 | SLAAC + DNS 集中管理 |
| SLAAC + 无状态 DHCPv6 | 混合 | 混合 | 中 | 最常用方案 |
| 手动配置 | 管理员手动分配 | 管理员手动分配 | 最高 | 服务器、网络设备等关键节点 |
2.2 RA Flag 与地址配置方式的关系
| M Flag | O Flag | 地址获取方式 | 其他配置获取方式 |
|---|---|---|---|
| 0 | 0 | SLAAC | 无,完全无状态 |
| 0 | 1 | SLAAC | DHCPv6(无状态) |
| 1 | 0 | DHCPv6(有状态) | DHCPv6(有状态) |
| 1 | 1 | DHCPv6(有状态) | DHCPv6(有状态) |
2.3 SLAAC 地址构造原理
SLAAC 中,主机通过 RA 报文获取前缀信息后,自行构造 IPv6 地址:

EUI-64 方式
EUI-64 将主机的 48 位 MAC 地址转换为 64 位接口标识符:
| 步骤 | 操作 | 示例 |
|---|---|---|
| 原始 MAC | 48 位 MAC 地址 | 00e0-fc12-3456 |
| 分割 | 在高 24 位和低 24 位中间插入 fffe | 00e0-fc-ff-fe-12-3456 |
| 反转第 7 位 | 将第 7 位(U/L 位)取反 | 02e0-fc-ff-fe-12-3456 |
| 最终接口 ID | 64 位接口标识符 | 02e0:fcff:fe12:3456 |
注意:EUI-64 会暴露主机的 MAC 地址信息,存在隐私泄露风险。现代操作系统默认使用隐私扩展(Privacy Extensions)生成随机的接口标识符。
2.4 DHCPv6 报文类型
| 报文类型 | 方向 | 功能 |
|---|---|---|
| SOLICIT | 客户端 → 服务器 | 请求服务器信息 |
| ADVERTISE | 服务器 → 客户端 | 通告服务器可服务 |
| REQUEST | 客户端 → 服务器 | 请求地址分配 |
| CONFIRM | 客户端 → 服务器 | 确认当前网络是否仍适用 |
| RENEW | 客户端 → 服务器 | 续租地址 |
| REBIND | 客户端 → 服务器 | 绑定期满前续租 |
| REPLY | 服务器 → 客户端 | 响应客户端请求 |
| RELEASE | 客户端 → 服务器 | 释放地址 |
| DECLINE | 客户端 → 服务器 | 拒绝冲突地址 |
| INFORM | 客户端 → 服务器 | 已有地址,仅请求其他配置 |
三、技术细节
3.1 SLAAC 详细流程

3.2 DHCPv6 服务器部署模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 本地 DHCPv6 服务器 | DHCPv6 服务器直接连接在本链路 | 小型网络 |
| DHCPv6 Relay | 通过 DHCPv6 中继代理转发到远程服务器 | 大型网络 |
| Router as DHCPv6 Server | 路由器同时充当 DHCPv6 服务器 | 接入层简化管理 |
3.3 DHCPv6 Relay 配置
当 DHCPv6 服务器不在本地链路上时,需要通过 DHCPv6 Relay 代理转发报文:

四、实战配置/案例分析
4.1 SLAAC + 无状态 DHCPv6(推荐方案)
# ========== 路由器侧配置 ==========
# 1. 配置接口 IPv6 地址
[HUAWEI] interface GigabitEthernet 0/0/0
[HUAWEI-GigabitEthernet0/0/0] ipv6 enable
[HUAWEI-GigabitEthernet0/0/0] ipv6 address 2001:db8:1::1/64
# 2. 配置 RA 报文,允许 SLAAC(A=1)
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ra other-config enable
# O=1,告知主机使用 DHCPv6 获取 DNS 等配置
# ========== DHCPv6 服务器配置 ==========
# 3. 全局启用 DHCPv6
[HUAWEI] dhcpv6 enable
# 4. 配置 DHCPv6 前缀池(无状态,不分配地址)
[HUAWEI] dhcpv6 pool IPv6POOL
[HUAWEI-dhcpv6-IPv6POOL] dns-server 2001:db8::dns1 2001:db8::dns2
[HUAWEI-dhcpv6-IPv6POOL] domain-name example.com
[HUAWEI-dhcpv6-IPv6POOL] quit
# 5. 在接口上应用 DHCPv6 服务器
[HUAWEI] interface GigabitEthernet 0/0/0
[HUAWEI-GigabitEthernet0/0/0] dhcpv6 server IPv6POOL
# ========== 验证 ==========
[HUAWEI] display dhcpv6 pool IPv6POOL
[HUAWEI] display dhcpv6 client
4.2 有状态 DHCPv6 配置
# ========== 有状态 DHCPv6(服务器分配完整地址) ==========
# 1. 配置 DHCPv6 地址池
[HUAWEI] dhcpv6 pool STATEFUL_POOL
[HUAWEI-dhcpv6-STATEFUL_POOL] prefix 2001:db8:2::/64 valid-lifetime 604800 preferred-lifetime 86400
[HUAWEI-dhcpv6-STATEFUL_POOL] dns-server 2001:db8::dns1
[HUAWEI-dhcpv6-STATEFUL_POOL] domain-name example.com
[HUAWEI-dhcpv6-STATEFUL_POOL] quit
# 2. 在接口上应用
[HUAWEI] interface GigabitEthernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] ipv6 enable
[HUAWEI-GigabitEthernet0/0/1] ipv6 address 2001:db8:2::1/64
[HUAWEI-GigabitEthernet0/0/1] dhcpv6 server STATEFUL_POOL
# 3. RA 设置 M=1,告知主机使用有状态 DHCPv6
[HUAWEI-GigabitEthernet0/0/1] ipv6 nd ra managed-config enable
4.3 DHCPv6 Relay 中继配置
# ========== 接入层交换机(Relay) ==========
[HUAWEI] dhcpv6 enable
[HUAWEI] interface GigabitEthernet 0/0/0
[HUAWEI-GigabitEthernet0/0/0] ipv6 enable
[HUAWEI-GigabitEthernet0/0/0] ipv6 address 2001:db8:3::1/64
# 指定 DHCPv6 服务器地址(通过中继)
[HUAWEI-GigabitEthernet0/0/0] dhcpv6 relay server ipv6 2001:db8::dhcpv6server
[HUAWEI-GigabitEthernet0/0/0] quit
# ========== 核心层路由器(Relay) ==========
[HUAWEI] interface GigabitEthernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] ipv6 enable
[HUAWEI-GigabitEthernet0/0/1] ipv6 address 2001:db8:3::2/64
[HUAWEI-GigabitEthernet0/0/1] dhcpv6 relay server ipv6 2001:db8::dhcpv6server
4.4 故障案例:SLAAC 地址获取失败
场景描述:部署 SLAAC 后,终端无法自动获取 IPv6 地址。
排查过程:
- 检查 RA 报文:
[SW] display ipv6 interface GigabitEthernet 0/0/0
# 接口 IPv6 地址正常,NDP 已启用
[SW] display ipv6 nd ra configuration interface GigabitEthernet 0/0/0
# RA 配置正常
- 抓包分析:
[SW] packet-capture interface GigabitEthernet 0/0/0
# RS 报文正常,但 RA 报文中 Autonomous Flag = 0
- 根因确认:RA 报文中 Autonomous Flag 被手动关闭了,主机收到 RA 后认为不支持 SLAAC,不会自行构造地址。
处理措施:
# 启用 Autonomous Flag
[HUAWEI] interface GigabitEthernet 0/0/0
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ra autonomous-flag enable
# 验证
[HUAWEI] display ipv6 nd ra configuration interface GigabitEthernet 0/0/0
# Autonomous Flag 应显示为 Enable
4.5 故障案例:DHCPv6 地址耗尽
场景描述:有状态 DHCPv6 网络中,部分新接入终端无法获取 IPv6 地址。
排查过程:
- 检查地址池使用情况:
[SW] display dhcpv6 pool STATEFUL_POOL
# 地址池:2001:db8:2::/64
# 已分配地址:16384(达到上限)
# 可用地址:0
- 根因分析:地址池大小为 /64 接口 ID 段,但配置的有效租期过长(604800 秒 = 7 天),大量离线终端的地址占用了地址池资源。
处理措施:
# 方案一:缩短租期
[HUAWEI] dhcpv6 pool STATEFUL_POOL
[HUAWEI-dhcpv6-STATEFUL_POOL] prefix 2001:db8:2::/64 valid-lifetime 86400 preferred-lifetime 43200
[HUAWEI-dhcpv6-STATEFUL_POOL] quit
# 方案二:扩大地址池
[HUAWEI] dhcpv6 pool STATEFUL_POOL
[HUAWEI-dhcpv6-STATEFUL_POOL] prefix 2001:db8:2::/48 valid-lifetime 86400 preferred-lifetime 43200
[HUAWEI-dhcpv6-STATEFUL_POOL] quit
# 方案三:清理已过期但被占用的地址
[HUAWEI] reset dhcpv6 pool STATEFUL_POOL allocated-pool
五、总结
| 项目 | 说明 |
|---|---|
| SLAAC | 主机自行构造地址,配置简单,适合大规模部署 |
| EUI-64 | 基于 MAC 地址构造接口 ID,存在隐私问题 |
| 有状态 DHCPv6 | 服务器分配地址,适合需要审计和集中管理的场景 |
| 无状态 DHCPv6 | SLAAC 分配地址 + DHCPv6 分配 DNS 等,最常用方案 |
| RA Flag | M=0,O=1 为 SLAAC+无状态 DHCPv6;M=1 为有状态 DHCPv6 |
| 华为推荐 | SLAAC + 无状态 DHCPv6(M=0, O=1),兼顾便捷性和可管理性 |
思考
-
SLAAC 使用 EUI-64 构造接口 ID 时,会暴露主机 MAC 地址。如果不希望暴露 MAC 地址,有什么替代方案?
-
在有状态 DHCPv6 中,如果 DHCPv6 服务器故障,正在使用已分配地址的终端会受到影响吗?新终端呢?
-
DHCPv6 和 DHCPv4 在报文交互上有何主要区别?为什么 DHCPv6 的初始请求使用组播而不是广播?
下篇预告:第116篇:IPv6 路由:静态与 OSPFv3 基础