IPv6 的链路本地、ULA、全球单播、稳定地址和临时地址有什么区别?
一台启用 IPv6 的主机同时拥有多个地址通常是正常现象:接口可能既有 fe80::/10 链路本地地址,又有 fd00::/8 范围内的 ULA,还可能有一个或多个全球单播地址;同一全球前缀下又可能同时出现稳定地址与临时地址。它们并非互斥的五种“地址等级”,而是两个不同维度:链路本地、ULA、全球单播描述地址的作用域与路由属性;稳定地址、临时地址描述接口标识符如何生成和使用。
本文目录(17 节)
快速对照
| 名称 | 典型前缀或形态 | 通常可达范围 | 典型用途 | 不适合直接证明什么 |
|---|---|---|---|---|
| 链路本地地址 | fe80::/10 | 单一二层链路 | 邻居发现、路由器发现、下一跳 | 公网或跨路由器可达 |
| ULA | fc00::/7,实践中本地分配常见 fd00::/8 | 组织内部或互联私域 | 内部服务、VPN、稳定内部编号 | 全球互联网可路由 |
| 全球单播地址 | 当前通用分配主要来自 2000::/3 | 取决于路由与策略,可全球路由 | 公网通信、对外服务 | 防火墙已放行或路径一定通 |
| 稳定地址 | 前缀固定时 IID 通常保持稳定 | 继承其所属前缀的作用域 | 服务端、DNS、ACL、长期连接 | 永久不变或跨网络不变 |
| 临时地址 | 同一前缀下周期性生成新 IID | 继承其所属前缀的作用域 | 客户端外连时降低跨时段关联 | 匿名、加密或免于日志追踪 |
先分清两个维度
fe80::/10、ULA 和全球单播主要回答“这个地址在哪些网络范围有意义、路由器是否应转发”。稳定地址和临时地址则回答“同一前缀后面的接口标识符如何形成、是否随时间轮换”。
因此“临时全球单播地址”是正常组合,“稳定 ULA”也很常见。临时地址不是独立地址空间,稳定地址也不等于全球地址。看到地址字符串时,应同时记录前缀、接口、有效期、首选期、生成方式和路由,而不是只按开头几个十六进制字符下结论。
链路本地地址:IPv6 接口的本链路身份
RFC 4291 定义链路本地地址用于单一链路,路由器不得把目的或源为链路本地的包转发到其他链路。常见地址以 fe80 开头,但规范前缀是 fe80::/10,不能把所有 fe 开头的地址都归为链路本地。
链路本地地址在 IPv6 控制面非常重要。邻居发现、无状态地址自动配置中的路由器通告,以及很多动态路由邻接都会使用它。即使没有获得 ULA 或全球前缀,接口也可能先拥有链路本地地址,所以 ping fe80::... 成功只能证明同一链路上的 IPv6 基础通信,不代表存在默认路由、DNS 或公网连接。
同一个链路本地地址可以在不同接口重复,因此命令通常需要指定区域 ID:
ping -6 fe80::1%eth0
%eth0 不是地址本身的一部分,而是告诉系统从哪个链路解释这个地址。抓包、静态下一跳和故障报告若遗漏接口区域,往往会得到“地址无效”或走错接口的假象。
ULA:可在私域路由,但不是公网地址
RFC 4193 为 Unique Local IPv6 Unicast Address 保留 fc00::/7。其中 L 位为 1 的本地分配形式对应 fd00::/8;规范给出了使用 40 位伪随机 Global ID 生成 /48 的方法,目的是让不同组织合并网络或建立 VPN 时降低前缀冲突概率。
ULA 可以在组织内部被正常路由,也可以跨多个园区、隧道或私有互联使用,并不局限于一个二层链路。它与 IPv4 RFC 1918 地址在运维直觉上相似,但不应简单复制 10.0.0.0/8 式顺序编号。随手使用 fd00::/48 会让许多网络选择相同前缀,未来并网时仍会冲突;应生成足够随机的 Global ID 并登记所有权。
ULA 不应被作为全球互联网路由前缀。它也不会因为“无需 NAT”就自动安全:内部路由、DNS、ACL、防火墙和主机服务仍需明确配置。反过来,ULA 没有公网可达性也不等于必须做 NAT66;内部到互联网的客户端通常可同时拥有 ULA 和全球单播地址,由源地址选择选用合适地址。
全球单播地址:有全球路由语义,不保证实际可达
RFC 4291 的全球单播地址结构由全局路由前缀、子网 ID 和接口标识符组成。IANA 地址空间登记显示 2000::/3 是全球单播的主要分配范围,但具体前缀是否已分配、是否由本地运营商路由,应继续查询 RIR、运营商和本地路由信息,不能仅凭落在 /3 内就认定合法可用。
主机取得全球单播地址只说明地址配置完成了一部分。公网通信还依赖首跳路由器通告或静态默认路由、上游前缀授权、回程路由、防火墙、PMTU、DNS 和应用监听。IPv6 没有传统 NAT44 也不表示入站默认开放;状态防火墙应继续执行最小权限策略。
服务器需要稳定被访问时,通常为服务选择稳定地址并配置 AAAA 记录。客户端外连则可以同时保留稳定地址和临时地址,让操作系统按地址选择规则决定源地址。不要把浏览器访问时观察到的临时源地址写进 DNS。
稳定地址不一定来自 EUI-64
早期无状态自动配置经常从网卡 MAC 派生 Modified EUI-64 接口标识符,容易在不同网络暴露稳定硬件关联。现代系统可能使用 RFC 7217 的稳定但不透明接口标识符:由前缀、接口标识、网络 ID、计数器和本机秘密等输入生成,外部无法仅凭地址反推出 MAC。
RFC 7217 所说的“稳定”通常是对同一前缀或网络保持稳定,并不承诺设备换网络、前缀重编号或秘密重置后地址不变。它也不是临时地址的替代品:稳定地址有利于入站连接、DNS、审计和策略;临时地址侧重客户端发起连接时降低长期可关联性。
运维清单不应再假设所有带 ff:fe 形态的地址都代表当前系统唯一稳定地址,也不应从 IPv6 地址反推资产身份。可靠资产标识应来自配置管理、证书、设备账户或受控 DHCP/DNS 数据。
临时地址:轮换接口标识符,降低地址关联
RFC 8981 更新 IPv6 临时地址扩展。主机在自动配置的前缀下生成随机化接口标识符,并按照首选期与有效期轮换。旧临时地址从 preferred 变为 deprecated 后,不宜再用于新连接,但在 valid lifetime 结束前仍可保留,以免立即中断已有通信。
临时地址的隐私收益是减少外部观察者用一个长期不变的接口标识符跨网络或跨时间关联活动。它不能隐藏网络前缀、运营商、流量时序、账户、Cookie、TLS/HTTP 标识或服务端日志,因此不是匿名工具。
地址轮换也不意味着每个数据包更换源地址。一个 TCP 或 QUIC 连接通常在生命周期内保持选定的源地址;新连接才可能使用新的首选临时地址。排障时若只复制数小时前日志里的地址,当前主机上可能已经看不到它是 preferred,但连接记录仍然有效。
preferred lifetime 与 valid lifetime
IPv6 地址有两个容易混淆的生命周期。Preferred Lifetime 到期后,地址进入 deprecated 状态,源地址选择通常避免它用于新连接;Valid Lifetime 到期后,地址不再有效,应从接口移除。
路由器通告中的前缀信息、DHCPv6、网络管理器和本机隐私策略都会影响这些时间。临时地址频繁消失可能是正常轮换,也可能是上游通告寿命异常。应同时查看地址的 preferred_lft、valid_lft 与收到的 RA,而不是把变化一律归因于“IPv6 不稳定”。
源地址选择不是“第一个地址”
当接口有多个 IPv6 地址时,系统必须为目标选择源地址。RFC 6724 定义默认地址选择规则,包括避免不合适的作用域、优先非 deprecated 地址、偏好匹配标签和更长共同前缀等;操作系统还可能有本地策略表与 RFC 更新。
这意味着访问公网目标时通常应选全球来源,而访问 ULA 目标时倾向选择合适的 ULA。若 DNS 同时返回多个地址、策略表被修改、ULA 没有对应路由或前缀生命周期异常,应用表现可能与管理员“按配置顺序选第一个”的预期不同。
临时地址是否优先用于外连由系统隐私配置和实现决定。要验证实际决策,应对具体目标执行路由查询并发起真实连接,不能只看地址列表。
ULA 与全球地址可以共存
双前缀设计可以让内部服务使用 ULA 获得相对稳定的组织内编号,同时让客户端使用运营商提供的全球前缀访问互联网。两类地址同时配置在接口上是 IPv6 多地址模型的一部分。
但共存会把 DNS 和路由错误暴露得更明显。若内部 DNS 给公网客户端返回仅 ULA 可达的 AAAA,连接会失败;若内部主机同时解析到 ULA 与全球地址却没有正确源地址或回程路由,可能出现长时间回退。应明确 split DNS、地址选择策略与防火墙边界,并逐条验证内部、VPN、互联网三种来源。
不要把已弃用的站点本地地址当 ULA
旧的 fec0::/10 Site-Local 地址已由 RFC 3879 弃用,不应在新网络中部署。ULA 是后续用于本地通信的机制,但它没有模糊的“站点边界”概念,而使用随机 Global ID 和正常路由策略管理范围。
审计历史配置时,看到 fec0 应制定重编号计划,而不是把它与 fc00::/7 混为一谈。文档、ACL 与地址识别代码也应避免用宽泛字符串匹配把两者合并。
DNS、服务端与客户端如何选择地址
对外服务应使用可路由的稳定全球地址、受控防火墙和正确 AAAA;内部服务可按可达边界使用稳定 ULA 或全球地址。客户端浏览器、更新器等主动外连流量可使用临时全球地址,但设备仍需保留可管理的稳定身份,二者职责不同。
不要为临时地址创建长期 AAAA,也不要用短暂源地址做永久 ACL 白名单。若访问控制必须识别用户或设备,应使用身份认证、证书或受控网络边界,而非依赖会轮换的完整 /128。
Linux 上如何辨认
ip -6 address show dev eth0
ip -6 route show
ip -6 route get 2001:4860:4860::8888
输出中的 scope link 对应链路作用域;temporary 或 mngtmpaddr 等标志与内核和管理工具实现相关;deprecated 表示首选期已结束。dynamic 只说明动态配置属性,不等于一定是临时隐私地址。
不同 Linux 发行版、NetworkManager、systemd-
一套分层排障流程
- 用
ip -6 address或系统等效命令列出所有地址、接口、scope 和 lifetime; - 确认目标属于链路本地、ULA 还是全球范围,不凭名称猜测;
- 链路本地测试显式指定接口区域 ID;
- 检查默认路由、目标前缀路由和首跳路由器状态;
- 检查 RA 前缀、M/O 标志与有效期,区分 SLAAC 和 DHCPv6 职责;
- 针对具体目标查询系统选择的源地址;
- 同时验证 DNS 的 A/AAAA、split DNS 与缓存;
- 在主机与网关两侧抓包,确认请求、邻居发现和回包;
- 检查有状态防火墙、ICMPv6 和 PMTU,不能粗暴屏蔽全部 ICMPv6;
- 变更隐私地址策略后测试新连接、长连接、重启与前缀重编号。
常见误区
有 fe80 地址说明 IPv6 正常联网
错误。它只证明接口具备链路本地地址;公网仍需要全球地址、路由、DNS 和可用路径。
ULA 就是把 IPv4 私网地址加长
不准确。ULA 应随机生成 Global ID,可跨组织私域路由,并不要求依赖 NAT66;其冲突控制与 IPv4 顺序私网编号不同。
全球单播地址一定能从互联网访问
错误。前缀授权、上游和回程路由、防火墙、主机监听都可能阻止访问。
稳定地址一定暴露网卡 MAC
错误。RFC 7217 类稳定不透明 IID 可以不嵌入 MAC,并对不同网络形成不同结果。
临时地址会让用户匿名
错误。它主要降低固定 IID 带来的长期关联,不能隐藏前缀、账户、应用标识和流量特征。
FAQ
1. 为什么同一网卡会有三个以上 IPv6 地址?
因为 IPv6 原生支持一接口多地址:链路本地用于本链路控制,ULA 或全球地址承载不同范围通信,稳定与临时地址又可同时服务入站身份和客户端隐私。
2. fe80::1 为什么必须写 %eth0?
链路本地地址在不同接口上可能重复,区域 ID 用于确定它属于哪条链路;跨接口没有唯一解释。
3. ULA 前缀可以随便写成 fd00::/48 吗?
不建议。RFC 4193 通过伪随机 40 位 Global ID 降低独立网络并网冲突,固定使用常见前缀会失去这一优势。
4. ULA 能直接访问互联网吗?
它不具有全球路由语义。主机通常另有全球地址用于互联网通信;是否通过特殊网关转换属于额外架构,不是 ULA 的默认能力。
5. 稳定地址会永远不变吗?
不会。前缀重编号、网络标识变化、系统重装、密钥重置或管理员策略都可能改变它。“稳定”有明确作用范围,不等于永久。
6. 临时地址变成 deprecated 后连接会立刻断吗?
通常不会。Deprecated 地址不再适合新连接,但在 Valid Lifetime 内仍有效,可让已有连接继续工作。
7. 为什么应用没有选我预期的 IPv6 源地址?
系统会综合作用域、deprecated 状态、标签、前缀匹配和本地策略选源,并非简单采用地址列表第一项。应对具体目标查看路由与实际连接。
8. 对外服务器该关闭所有临时地址吗?
服务监听和 DNS 应使用稳定地址;是否同时允许该主机的客户端流量使用临时地址取决于角色和策略。两种地址可以并存,不必用全局开关粗暴处理。