DHCPv6 vs SLAAC:设备如何获取 IPv6 地址
了解设备获取 IPv6 地址的两种方式:SLAAC 使用路由器通告,DHCPv6 使用服务器。了解何时使用每种方式。
当设备加入 IPv6 网络时,它需要一个地址。与 DHCP 是标准方法的 IPv4 不同,IPv6 提供两种机制:SLAAC(无状态地址自动配置)和 DHCPv6。了解何时使用每种机制对网络工程师至关重要。
SLAAC:无状态地址自动配置#
SLAAC 允许设备在不维护网络状态的情况下自行配置。路由器定期发送包含网络前缀的路由器通告(RA)消息,设备生成自己的地址。
路由器通告的工作原理#
路由器默认每 200 秒向 ff02::1(全节点多播)多播 RA 消息。设备还可以通过向 ff02::2(全路由器多播)发送路由器请求(RS)来立即请求 RA。
RA 包含:
- 网络前缀(例如,
2001:db8::/64) - 默认网关地址
- 前缀生命周期(有效和首选)
- M 和 O 标志(下面解释)
设备将通告的前缀与自生成的 64 位接口 ID 组合以创建其地址。
接口 ID 生成#
存在两种常见方法:
EUI-64(修改的扩展唯一标识符)
从 MAC 地址派生接口 ID。对于 MAC 00:11:22:33:44:55:
- 在中间插入
ff:fe:00:11:22:ff:fe:33:44:55 - 翻转第 7 位:
02:11:22:ff:fe:33:44:55 - 结果:
2001:db8::211:22ff:fe33:4455
这是确定性的,但会暴露硬件身份,产生隐私问题。
隐私扩展(RFC 4941) 生成随机接口 ID。现代操作系统创建定期更改的临时地址(大多数系统上每天)。设备同时维护稳定地址(用于传入连接)和临时地址(用于出站连接)。
# Linux:查看地址类型
ip -6 addr show eth0
# 你会看到稳定地址的 scope global
# 和隐私地址的 scope global temporarySLAAC 提供什么#
SLAAC 处理:
- IPv6 地址分配
- 默认网关
- 前缀长度
默认情况下它不提供:
- DNS 服务器
- 域搜索列表
- NTP 服务器
RDNSS(递归 DNS 服务器)选项 RFC 8106 允许路由器在 RA 消息中通告 DNS 服务器。大多数现代系统都支持这一点,消除了在简单网络中对 DHCPv6 的需求。
DHCPv6:托管配置#
DHCPv6 的工作方式类似于 DHCPv4:客户端从服务器请求配置。它以两种模式运行。
有状态 DHCPv6#
服务器分配地址并跟踪哪个客户端有哪个地址。客户端执行四消息交换:
- 请求:客户端请求配置
- 通告:服务器提供地址
- 请求:客户端接受提议
- 回复:服务器确认分配
地址以首选和有效生命周期租用,需要续订。
无状态 DHCPv6#
设备使用 SLAAC 获取地址,但查询 DHCPv6 以获取其他选项,如 DNS 服务器、域名或 NTP 服务器。服务器不跟踪地址,因此称为「无状态」。
M 和 O 标志#
路由器通告包含两个关键标志:
M 标志(托管地址配置) 设置为 1 时,设备应使用 DHCPv6 获取地址。SLAAC 地址仍可能根据前缀信息中的 A 标志生成。
O 标志(其他配置) 设置为 1 时,设备应使用 DHCPv6 获取其他选项(DNS、NTP 等),但不包括地址。
标志组合:
M=0, O=0:仅 SLAAC(使用 RDNSS 获取 DNS)M=0, O=1:SLAAC + 无状态 DHCPv6M=1, O=0:DHCPv6 用于地址(罕见配置)M=1, O=1:DHCPv6 用于地址和选项
SLAAC vs DHCPv6 比较#
| 特性 | SLAAC | DHCPv6 |
|---|---|---|
| 地址分配 | 自动(前缀 + 接口 ID) | 服务器分配 |
| 服务器上的状态 | 无 | 有状态跟踪绑定 |
| DNS 配置 | RA 中的 RDNSS(RFC 8106) | 选项 23(DNS 服务器) |
| 地址跟踪 | 不可能 | 完全可见 |
| 客户端复杂性 | 最小 | 需要 DHCPv6 客户端 |
| 故障模式 | 继续工作 | 单点故障 |
| 前缀委派 | 不支持 | 支持(DHCPv6-PD) |
常见配置#
仅 SLAAC(带 RDNSS)#
最适合不需要地址跟踪的简单网络。Linux 上的 radvd.conf 示例:
interface eth0 {
AdvSendAdvert on;
prefix 2001:db8:1::/64 {
AdvOnLink on;
AdvAutonomous on;
};
RDNSS 2001:4860:4860::8888 2001:4860:4860::8844 {
AdvRDNSSLifetime 300;
};
};此配置提供大多数客户端需要的所有内容,无需 DHCPv6。
SLAAC + 无状态 DHCPv6#
当不支持 RDNSS 或需要其他选项时使用。在 radvd 中设置 O 标志:
interface eth0 {
AdvSendAdvert on;
AdvOtherConfigFlag on; # O=1
prefix 2001:db8:1::/64 {
AdvOnLink on;
AdvAutonomous on;
};
};DHCPv6 服务器提供 DNS 和其他选项,但不分配地址。
仅 DHCPv6(托管)#
企业通常更喜欢这样做以实现问责制和访问控制。设置 M 标志:
interface eth0 {
AdvSendAdvert on;
AdvManagedFlag on; # M=1
AdvOtherConfigFlag on; # O=1
prefix 2001:db8:1::/64 {
AdvOnLink on;
AdvAutonomous off; # 不使用 SLAAC
};
};注意:一些客户端仍会生成链路本地地址,并可能创建 SLAAC 地址,尽管 AdvAutonomous off。网络安全策略不应仅依赖于禁用 SLAAC。
何时使用哪个#
使用 SLAAC 时:
- 中小型网络
- 设备受信任
- 不需要地址跟踪
- 优先考虑简单性
- 所有客户端都支持 RDNSS
使用 DHCPv6 时:
- 需要集中地址管理
- 合规性需要地址记录
- 需要前缀委派(ISP 到客户路由器)
- 需要提供 DNS 以外的复杂选项
- Windows 网络(历史上更好的 DHCPv6 支持)
混合方法(SLAAC + 无状态 DHCPv6):
- 许多网络的良好折衷
- 有弹性(如果 DHCPv6 失败,SLAAC 仍然工作)
- 为其他选项提供灵活性
故障排除地址分配#
设备仅有链路本地(fe80::/10)
未收到路由器通告。检查:
# Linux:捕获 RA
tcpdump -i eth0 'icmp6 && ip6[40] == 134'
# 验证路由器正在发送 RA
radvdump设备有 SLAAC 地址但没有 DNS 路由器未发送 RDNSS,或客户端不支持它。检查 RA 内容:
radvdump | grep RDNSS如果缺失,请将 RDNSS 添加到路由器配置或启用无状态 DHCPv6。
DHCPv6 不工作 验证 M 或 O 标志在 RA 中设置:
radvdump | grep -E "M flag|O flag"检查 DHCPv6 服务器正在运行并在 UDP 端口 547 上可达:
# 服务器端
ss -ulnp | grep 547
# 客户端
tcpdump -i eth0 port 547接口上有多个地址 这是正常的。你可能会看到:
- 链路本地地址(始终存在)
- SLAAC 稳定地址(EUI-64)
- SLAAC 临时地址(隐私扩展)
- DHCPv6 地址(如果使用有状态 DHCPv6)
所有这些都是有效的;操作系统根据 RFC 6724 选择适当的源地址。
相关文章#
- 如何在 Windows、macOS、Linux 和路由器上启用 IPv6 - 在各种操作系统和设备上启用和配置 IPv6,包括 SLAAC 和 DHCPv6 设置。
- IPv6 隐私扩展:阻止地址跟踪 - 了解如何使用隐私扩展保护你的 IPv6 地址免受跟踪。
大多数现代网络使用 SLAAC + RDNSS 以实现简单性,或 SLAAC + 无状态 DHCPv6 以实现更广泛的兼容性效果很好。为具有特定合规性或记录要求的环境保留完全托管的 DHCPv6。无论你选择哪个,都要记录你的决定并在整个网络中一致地配置它。