IPv6 地址、SLAAC 与双栈迁移
内容摘要:IPv4 地址 32 位已耗尽(01、07),IPv6(RFC 8200)用 128 位地址与简化的头部重新设计了网络层。本章讲清 IPv6 地址结构与分类、扩展头、依赖 ICMPv6/NDP(06)的无状态自动配置(SLAAC)、DHCPv6,以及现实中最重要的双栈共存与迁移(含 Happy Eyeballs)。
难度:中级 | 前置知识:06 NDP 邻居发现、07 IPv4 编址 | 所属层次:网络层(L3)
一、为什么需要 IPv6
- 地址耗尽:IPv4 约 43 亿地址早已分配殆尽,NAT(19)只是缓解、破坏了端到端连通性。IPv6 有
2¹²⁸ ≈ 3.4×10³⁸个地址。 - 头部简化:IPv6 固定 40 字节头,取消头部校验和(交给上层与链路层 CRC,03)、取消路由器分片(改由源端 PMTUD,09),转发更高效。
- 即插即用:SLAAC 让主机无需 DHCP 即可自动获址(本章第四节)。
- 内建能力:邻居发现(NDP)、地址自动配置、组播替代广播(06)。
二、IPv6 报文头
| 字段 | 位宽 | 语义 | 对应 IPv4 | 说明 |
|---|---|---|---|---|
| 版本 | 4 | 6 | 版本 | — |
| 流量类别 | 8 | DSCP+ECN | TOS | QoS(QoS 与高可用) |
| 流标签 | 20 | 标识同一流 | 无 | 便于按流处理/ECMP(10) |
| 载荷长度 | 16 | 载荷字节数(不含本头) | 总长度 | — |
| 下一个头(Next Header) | 8 | 上层协议或扩展头类型 | 协议 | 解复用键 + 扩展头链(02) |
| 跳数限制(Hop Limit) | 8 | 每跳减 1,0 则丢弃 | TTL | 语义同 TTL(07) |
| 源/目的地址 | 各 128 | 端到端地址 | 源/目的 IP | — |
设计对比:IPv6 头固定 40 字节且字段更少(无 IHL、无分片字段、无头校验和),可选功能移到扩展头。这让核心路由器转发更快,代价是扩展头链解析复杂度(见下)。
三、扩展头(Extension Headers)
IPv6 用扩展头链承载可选功能,通过「下一个头」字段串联:
| 扩展头 | 用途 | 处理者 |
|---|---|---|
| 逐跳选项(Hop-by-Hop Options) | 每跳都要检查(如 Jumbogram、路由器告警) | 每个路由器 |
| 路由(Routing) | 指定途经节点(部分类型因安全弃用) | 途经节点 |
| 分片(Fragment) | 仅源端分片(IPv6 路由器不分片) | 源与目的 |
| 目的选项(Destination Options) | 仅目的处理 | 目的主机 |
| 认证/封装安全载荷(AH/ESP) | IPsec(VPN 与隧道) | 端点 |
安全与性能注意:扩展头链可被滥用(超长头链、分片规避检测),防火墙需能穿透解析(防火墙与访问控制、网络安全)。IPv6 分片只在源端做——若路径 MTU 不足,路由器回送 ICMPv6「Packet Too Big」,源端据此减小(PMTUD,09)。
四、IPv6 地址表示与分类
1、表示法
128 位写作 8 组 16 位十六进制,用 : 分隔,可压缩:
- 前导零省略:
2001:0db8:0000:0000:0000:0000:0000:0001→2001:db8:0:0:0:0:0:1 - 连续全零段用
::压缩一次:→2001:db8::1(::全文只能出现一次) - 前缀:
2001:db8::/32,前缀长度同 CIDR 思想(07),接口 ID 通常占后 64 位(/64是最常见的子网)。
2、地址分类
| 类型 | 前缀 | 作用域 | 说明 |
|---|---|---|---|
| 链路本地(Link-Local) | fe80::/10 | 单链路 | 每个 IPv6 接口必有,NDP/路由协议用它,不跨路由器 |
| 全局单播(GUA) | 2000::/3(如 2001:db8::/32 文档) | 全球 | 可路由到公网的「公网 IPv6」 |
| 唯一本地(ULA) | fc00::/7(实际 fd00::/8) | 站点内 | 类似 IPv4 私有地址(07) |
| 组播(Multicast) | ff00::/8 | 视范围 | IPv6 无广播,全用组播(ff02::1=所有节点) |
| 环回 | ::1/128 | 本机 | 等价 127.0.0.1 |
| 未指定 | ::/128 | — | 等价 0.0.0.0 |
关键认知:IPv6 一个接口通常同时有多个地址——至少一个
fe80::链路本地 + 一个(或多个)全局单播。这与「一接口一 IP」的 IPv4 直觉不同,排障时要全部查看(分层故障排查)。
3、本机实测(macOS,2026-09-07)
# macOS
ifconfig en0 | grep inet6
# Linux
ip -6 addr show dev eth0真实输出(全局地址已按规范脱敏为 2001:db8::/32 文档前缀,保留真实的 flags 语义):
inet6 fe80::1c95:43f7:963b:b3f8%en0 prefixlen 64 secured scopeid 0xf ← 链路本地(必有)
inet6 2001:db8:ce00:902d:18ae:21c3:b1d4:183c prefixlen 64 autoconf secured ← 全局(SLAAC 自动配置)解读:
fe80::...是链路本地地址(%en0是作用域标识 zone id,链路本地必须带接口名);第二个是autoconf(SLAAC 自动配置,见下节)得到的全局地址;secured表示用了 RFC 7217 稳定隐私接口 ID(非基于 MAC,防追踪,见第七节)。一接口两地址,与 IPv4 直觉不同。
五、SLAAC 与 DHCPv6:两种获址方式
1、无状态地址自动配置(SLAAC)
SLAAC(Stateless Address Autoconfiguration,RFC 4862) 让主机无需 DHCP 服务器自动配置全局地址,依赖 NDP 的路由器通告(RA,06):
- 接口 ID 生成:早期用 EUI-64(从 MAC 派生,可被追踪);现代用 RFC 7217 稳定隐私地址或**临时地址(RFC 8981,隐私扩展)**避免追踪(对应本机
securedflag)。 - RA 标志位决定获址方式:
M(Managed,用 DHCPv6 拿地址)、O(Other,用 DHCPv6 拿 DNS 等其他配置)。
2、SLAAC vs DHCPv6 对比
| 维度 | SLAAC | DHCPv6(RFC 8415) |
|---|---|---|
| 是否需服务器 | 否(靠路由器 RA) | 是 |
| 状态 | 无状态 | 有状态(记录租约) |
| 地址控制 | 主机自选接口 ID | 服务器集中分配 |
| DNS 下发 | 靠 RA 的 RDNSS 选项或 DHCPv6 | 是 |
| 适用 | 家庭/简单网络 | 企业需集中管理/审计 |
实践:许多网络混用——SLAAC 配地址 + DHCPv6(
O位)下发 DNS。Android 长期不支持有状态 DHCPv6,这是纯 DHCPv6 方案的现实约束([待验证/时效],以设备文档为准)。
六、双栈与迁移(现实重点)
IPv4 到 IPv6 不是「一夜切换」,而是长期共存。主流策略是双栈(dual-stack):主机同时拥有 IPv4 与 IPv6,按目标可达性选择。
- Happy Eyeballs(RFC 8305/8305bis):双栈客户端并发尝试 IPv6 与 IPv4 连接,优先 IPv6 但快速回退,避免「IPv6 配了却不通」导致的长超时。浏览器、
curl等已内建。 - 过渡技术:NAT64/DNS64(IPv6-only 客户端访问 IPv4 服务)、464XLAT、6to4/6rd/Teredo(隧道,多数已弃用或小众)。
- 双栈的运维代价:两套地址、两套路由、两套防火墙规则都要维护与验证——「IPv4 通不代表 IPv6 通」,反之亦然,排障必须双协议分别验证(分层故障排查)。
七、最小可复现实验
1、实验目标
- 查看接口的多个 IPv6 地址与作用域。
- 验证 IPv6 连通与「一接口多地址」。
2、平台与工具
- 本机验证环境:macOS 26.6.2,
ifconfig、ping6。Linux 用ip -6。
3、执行命令与本机实测
# 查看 IPv6 地址(本机可跑,见第四节输出)
ifconfig en0 | grep inet6 # macOS
# ip -6 addr show dev eth0 # Linux
# IPv6 连通(本机可跑,仅文档域名 example.com)
ping6 -c 2 example.com # macOS
# ping -6 -c 2 example.com # Linux本机实测 ping6(2026-09-07):
16 bytes from 2606:4700:10::ac42:93f3, icmp_seq=0 hlim=43 time=194.882 ms
16 bytes from 2606:4700:10::ac42:93f3, icmp_seq=1 hlim=43 time=221.374 ms
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 194.882/208.128/221.374/13.246 ms解读:
hlim=43(Hop Limit,IPv6 版 TTL)说明经过若干跳;RTTmin/avg/max/std-dev = 194/208/221/13ms展示了分布而非单值(呼应 03 的「不要只看平均值」)。此为本机到公网的单点观测,随位置变化。
4、双栈选路观察(本机可跑)
# 对比 A 与 AAAA 记录(DNS,[15](../#三、完整目录))
dig +short example.com A
dig +short example.com AAAA
# curl 默认 Happy Eyeballs;强制指定协议对比
curl -sS -o /dev/null -w 'used=%{remote_ip}\n' -4 https://example.com/ # 强制 IPv4
curl -sS -o /dev/null -w 'used=%{remote_ip}\n' -6 https://example.com/ # 强制 IPv65、SLAAC 实验(需 Linux,本环境未执行)
在隔离拓扑(20)用 radvd 发 RA,观察客户端 SLAAC 获址与 DAD:
# [未在本环境执行] Linux;router 命名空间发 RA
ip netns exec cli ip -6 addr show dev veth-c # 观察 autoconf 地址出现
ip netns exec cli ip -6 route show # 观察默认路由来自 RA6、结论边界与清理
- 地址与 RTT 为单机/单点观测;SLAAC 实验须在 Linux 隔离环境执行。只读命令无需清理。
八、错误示例与常见误区
| 误区 | 纠正 |
|---|---|
| 「一个接口只有一个 IPv6 地址」 | 至少链路本地 + 全局,常多个(临时/隐私地址)。 |
| 「IPv6 有广播」 | 无广播,全用组播(ff02::1 等)。 |
| 「IPv6 路由器会分片」 | 不会;仅源端分片,靠 PMTUD(09)。 |
| 「IPv4 通则 IPv6 也通」 | 两套独立栈,需分别验证。 |
| 「配了 AAAA 就万事大吉」 | IPv6 路径若不通,Happy Eyeballs 才能救;服务端与防火墙也要支持 v6。 |
| 「链路本地地址能跨路由器」 | fe80::/10 仅单链路有效,需带 %接口 作用域。 |
九、性能影响
- 头部简化:固定头 + 无逐跳校验和,转发更高效;但扩展头链解析可能抵消(性能观测)。
- PMTUD 依赖:IPv6 强依赖 ICMPv6「Packet Too Big」;若被防火墙误丢,出现黑洞(09、网络安全)——不得盲目禁 ICMPv6(本库红线)。
- Happy Eyeballs 开销:并发尝试略增连接建立开销,但显著改善「v6 半死不活」时的体验。
十、安全风险与加固
- 禁用 ICMPv6 会瘫痪 IPv6:ICMPv6 承载 NDP、PMTUD、DAD,不能像某些人对 ICMPv4 那样全禁(09)。需按类型精细放行。
- RA 欺骗 / RA Guard:伪造 RA 冒充网关或下发恶意前缀(06、网络安全);交换机启用 RA Guard。
- 隐私地址:EUI-64 暴露 MAC 可被追踪;用 RFC 7217/8981 稳定/临时地址(本机
securedflag)。 - 双栈攻击面翻倍:防火墙必须同时覆盖 v4 与 v6,否则「v4 拦了、v6 漏了」(防火墙与访问控制)。
十一、版本与平台差异
- IPv6=RFC 8200、地址架构=RFC 4291、SLAAC=RFC 4862、DHCPv6=RFC 8415、Happy Eyeballs=RFC 8305、稳定接口 ID=RFC 7217、临时地址=RFC 8981。
- 平台:Linux
ip -6、sysctl net.ipv6.*;macOSifconfig/ping6;Windowsnetsh interface ipv6。Android 对有状态 DHCPv6 的支持是现实约束。
十二、常见问题与排查方向
- 「IPv6 拿不到全局地址」:查是否收到 RA、RA 的
M/O标志、DAD 是否冲突(06)。 - 「IPv6 能 ping 通但网页打不开」:可能 PMTUD 黑洞(大包被丢)——查是否误丢 ICMPv6 PTB(09)。
- 「v6 优先但很慢」:Happy Eyeballs 未生效或 v6 路径质量差;对比
-4/-6时延。 - 「防火墙对 v6 失效」:确认 v6 规则与 v4 对等(防火墙与访问控制)。
十三、清理与恢复
- 只读命令无副作用;实验新增地址/路由/
radvd配置用对应del/停服务清理(见 20)。
十四、关联章节
- 上一章:07 IPv4 报文、编址与子网划分
- 下一章:09 ICMP、MTU 与路径发现
- 强相关:06 NDP 邻居发现、15 DNS(A/AAAA)、防火墙与访问控制
检索关键词
IPv6 报文头 40 字节 Next Header 扩展头链 IPv6 地址压缩 :: 链路本地 fe80 全局单播 GUA ULA fd00 SLAAC RFC 4862 RA 标志 M O 位 DHCPv6 EUI-64 隐私地址 RFC 7217 双栈 Happy Eyeballs RFC 8305 NAT64 DNS64 ICMPv6 不能全禁
权威来源
- RFC 8200(IPv6)、RFC 4291(IPv6 地址架构)
- RFC 4862(SLAAC/DAD)、RFC 8415(DHCPv6)、RFC 4861(NDP)
- RFC 8305(Happy Eyeballs v2)、RFC 7217(稳定接口 ID)、RFC 8981(临时地址)
- Linux
ip(8)、各操作系统 IPv6 官方文档
报文与地址语义以上述 RFC 为准,
verified_at: 2026-09-07;IPv6 地址与ping6输出为 macOS 26.6.2 本机真实执行,全局地址已按脱敏规范替换为文档前缀,保留 flags 语义。SLAAC/radvd实验未在本环境执行(macOS 无 netns/ip)。
