4. IPv6地址自动配置机制
IPv6 相比 IPv4 最显著的变化之一,是把“地址从哪来”这件事从单一 DHCP 扩展成了多种自动配置机制。终端接入网络后,可能通过路由器通告(RA)自行拼出地址,也可能向 DHCPv6 服务器申请地址,还可能只从 DHCPv6 获取 DNS 等参数而地址仍由 SLAAC 生成。理解这些机制的边界与组合方式,是部署 IPv6 接入网络的基础。
一、三种机制的本质区别
SLAAC(无状态地址自动配置)依赖 ICMPv6 的路由器请求(RS)与路由器通告(RA)。主机收到 RA 后,用 RA 中的网络前缀加上自己生成的接口标识(IID)拼出完整的 /64 地址。IID 通常由 EUI-64 转换或隐私扩展随机生成。SLAAC 不需要服务器记录谁用了哪个地址,因此称为“无状态”。
DHCPv6 有状态配置则由服务器统一分配地址并维护租约,类似 IPv4 DHCP。RA 中的 M 标志(Managed Address Configuration)置 1 时,主机被要求通过 DHCPv6 获取地址。
DHCPv6 无状态配置只分配 DNS、域名等参数,不分配地址。此时 RA 的 O 标志(Other Configuration)置 1,地址仍由 SLAAC 生成。这是实际网络中最常见的组合:SLAAC 出地址,DHCPv6 发 DNS。
二、RA 标志与地址来源的对应关系
RA 报文中的 A 标志、M 标志、O 标志共同决定主机行为。A 标志(Autonomous Address-Configuration)置 1 表示该前缀可用于 SLAAC;M 标志置 1 表示地址由 DHCPv6 提供;O 标志置 1 表示其他配置由 DHCPv6 提供。三者组合决定了终端最终采用哪种方式,这也是部署时最需要核对的地方。
三、部署验证的关键观察点
在 Linux 终端上,最直接的验证方式是查看接口地址与路由。执行 ip -6 addr show dev eth0,若看到 scope global dynamic 且带 mngtmpaddr 或 noprefixroute 标记的地址,通常说明地址来自 SLAAC;若地址由 DHCPv6 分配,则常伴随 valid_lft 与 preferred_lft 的租约倒计时。
# 查看 RA 收到的前缀与标志
rdisc6 eth0
# 查看地址来源与生命周期
ip -6 addr show dev eth0
# 查看 DHCPv6 客户端状态(以 dhclient 为例)
dhclient -6 -v eth0
# 查看 DNS 是否来自 DHCPv6
resolvectl status eth0
判断地址来源时,可以结合前缀与 IID 特征:SLAAC 地址的 IID 常为 EUI-64 转换(含 ff:fe)或随机隐私地址;DHCPv6 地址的 IID 由服务器分配,通常无固定规律。若 RA 中同时置了 A=1 与 M=1,主机可能同时拥有 SLAAC 地址和 DHCPv6 地址,此时需要明确哪一个是主用地址。
四、无状态与有状态配置的对比
| 对比项 | SLAAC | DHCPv6 有状态 | DHCPv6 无状态 |
|---|---|---|---|
| 地址来源 | RA 前缀 + 主机 IID | DHCPv6 服务器 | RA 前缀 + 主机 IID |
| 服务器记录 | 无 | 有租约绑定 | 无地址租约 |
| DNS 下发 | RA 的 RDNSS/DNSSL | DHCPv6 选项 | DHCPv6 选项 |
| RA 标志 | A=1, M=0, O=0 | M=1 | M=0, O=1 |
| 典型场景 | 小型网络、快速接入 | 需要审计与集中管理 | 地址自动、DNS 集中 |
五、部署中的常见问题与排查
如果终端只拿到链路本地地址 fe80::/10,说明没有收到可用的 RA 前缀。此时应检查路由器是否开启 send_ra、接口是否被 net.ipv6.conf.eth0.accept_ra 禁用,以及中间交换机是否过滤了 ICMPv6。若地址有但无法上网,重点看默认路由是否通过 RA 下发,以及 DNS 是否可达。
net.ipv6.conf.all.forwarding 与 accept_ra 的取值,否则会出现“地址正常但无默认路由”的现象。
对于需要同时使用 SLAAC 与 DHCPv6 的网络,建议在路由器上明确设置 M 与 O 标志,避免终端行为不一致。验证时可用 tcpdump -i eth0 icmp6 抓取 RA,确认标志位与预期一致,再结合终端地址表判断最终生效的配置方式。