ping6.net
基础知识

DHCPv6 vs SLAAC:设备如何获取 IPv6 地址

了解设备获取 IPv6 地址的两种方式:SLAAC 使用路由器通告,DHCPv6 使用服务器。了解何时使用每种方式。

ping6.net2024年12月14日3 min read
IPv6DHCPv6SLAAC自动配置路由器通告

当设备加入 IPv6 网络时,它需要一个地址。与 DHCP 是标准方法的 IPv4 不同,IPv6 提供两种机制:SLAAC(无状态地址自动配置)和 DHCPv6。了解何时使用每种机制对网络工程师至关重要。

TL;DR - 快速摘要

要点:

  • SLAAC 是无状态的,通过路由器通告自动配置——不需要服务器
  • DHCPv6 提供集中控制和地址跟踪,类似于 DHCPv4
  • 路由器通告中的 M 和 O 标志控制使用哪种方法

跳转至: 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

  1. 在中间插入 ff:fe00:11:22:ff:fe:33:44:55
  2. 翻转第 7 位:02:11:22:ff:fe:33:44:55
  3. 结果:2001:db8::211:22ff:fe33:4455

这是确定性的,但会暴露硬件身份,产生隐私问题。

隐私扩展(RFC 4941) 生成随机接口 ID。现代操作系统创建定期更改的临时地址(大多数系统上每天)。设备同时维护稳定地址(用于传入连接)和临时地址(用于出站连接)。

# Linux:查看地址类型
ip -6 addr show eth0
 
# 你会看到稳定地址的 scope global
# 和隐私地址的 scope global temporary

SLAAC 提供什么#

SLAAC 处理:

  • IPv6 地址分配
  • 默认网关
  • 前缀长度

默认情况下它不提供:

  • DNS 服务器
  • 域搜索列表
  • NTP 服务器

RDNSS(递归 DNS 服务器)选项 RFC 8106 允许路由器在 RA 消息中通告 DNS 服务器。大多数现代系统都支持这一点,消除了在简单网络中对 DHCPv6 的需求。

DHCPv6:托管配置#

DHCPv6 的工作方式类似于 DHCPv4:客户端从服务器请求配置。它以两种模式运行。

有状态 DHCPv6#

服务器分配地址并跟踪哪个客户端有哪个地址。客户端执行四消息交换:

  1. 请求:客户端请求配置
  2. 通告:服务器提供地址
  3. 请求:客户端接受提议
  4. 回复:服务器确认分配

地址以首选和有效生命周期租用,需要续订。

无状态 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 + 无状态 DHCPv6
  • M=1, O=0:DHCPv6 用于地址(罕见配置)
  • M=1, O=1:DHCPv6 用于地址和选项

SLAAC vs DHCPv6 比较#

特性SLAACDHCPv6
地址分配自动(前缀 + 接口 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 选择适当的源地址。

相关文章#

大多数现代网络使用 SLAAC + RDNSS 以实现简单性,或 SLAAC + 无状态 DHCPv6 以实现更广泛的兼容性效果很好。为具有特定合规性或记录要求的环境保留完全托管的 DHCPv6。无论你选择哪个,都要记录你的决定并在整个网络中一致地配置它。