我第一次在终端里看到 fe80::1 的时候,完全不知道这是个什么东西。不像 IPv4 的 192.168.1.1 那样一眼就能看懂,IPv6 地址看起来像一串乱码。搞明白它的结构花了我不少时间,但这时间花得值——因为它直接影响你怎么配代理、怎么排查网络问题、怎么理解子网划分。

这篇只聚焦一件事:IPv6 地址从里到外到底长什么样、有哪些类型、是怎么生成的。适合已经知道 IPv6 基本概念、想在地址层面深入的技术读者。

这篇文章讲:地址格式与 :: 压缩规则、五种 Unicast 地址类型及识别方法、SLAAC/DHCPv6/EUI-64 三种生成机制、手动配置命令。IPv4 对比和网站 IPv6 检测在另外两篇里,这里不展开。

地址格式:8 组十六进制与 :: 压缩

一个完整的 IPv6 地址是 128 位,写成 8 组 4 位十六进制数,每组用冒号分隔。比如:

2001:0db8:0000:0000:0000:ff00:0042:8329

这个地址读起来太费劲了——128 位拆成 8 段,每段还要补前导零。好在 RFC 5952 定义了压缩规则,让 IPv6 地址在实际使用中没那么长。

规则一:每组的前导零可以省略

上面那个地址压缩后变成:

2001:db8:0:0:0:ff00:42:8329

0db8 变成 db80042 变成 42。每组至少保留一个字符,所以 0000 压缩成 0 而不是删掉。

规则二:连续的零组可以用 :: 替代——但只能用一次

真正让 IPv6 地址变短的是双冒号压缩。上面那个地址中间有三组连续的零,可以直接写成:

2001:db8::ff00:42:8329

因为 :: 代表”这里省略了若干个全零组”,如果允许用两次,接收方就没办法判断每组省略了多少。比如 2001::1::2 就完全没法解析——没人知道中间应该还原几组零。

踩坑提醒:很多教程只说 :: 可以把连续零压缩,但不讲一个隐性问题——IPv6 地址里如果有多个零段但不是连续的,你只能用 :: 压缩其中最长的那段。比如 2001:0:0:1:0:0:0:1,后面三段连续零用 :: 比前面两段合算,正确写法是 2001:0:0:1::1,不是 2001::1:0:0:0:1。我见过有人因为压缩策略没选对,生成了一堆不一致的地址格式,在日志匹配时浪费了半天。

RFC 5952 还规定了标准写法必须用小写字母,防止大小写不一致导致字符串比较出错。你可能会在一些老设备或老文档里看到大写,但从 RFC 的角度这是不规范的。

核心观点:IPv6 地址看着长不是因为设计臃肿,而是因为 128 位就是 128 位。压缩规则的存在让地址在实际使用中远比原始格式短。

网络前缀与接口标识符

IPv6 地址在逻辑上分成两半:网络前缀(Network Prefix)+ 接口标识符(Interface ID)。标准划分是 64 位前缀 + 64 位接口 ID,也就是 /64

/64 不是瞎定的——它跟 SLAAC(无状态自动配置)深度绑定。SLAAC 需要 64 位的接口 ID 空间来容纳 EUI-64 生成的标识符,如果前缀不是 /64,SLAAC 就没办法正常工作。所以你在分配 IPv6 子网时,绝大多数情况都该用 /64。

前缀的长度可以小于 /64(比如运营商给你分一个 /56 甚至 /48),让你在下面继续划多个 /64 子网。如果你做代理网络,拿到一个 /48 意味着你下面可以分出 65536 个 /64,每个 /64 又有海量可用地址——这个地址富裕度跟 IPv4 时代完全不是一个量级。

2001:db8:1234:5678:0211:22ff:fe33:4455
|---------- 网络前缀 ----------|--- 接口 ID ---|
           (/64)                    (64 bits)
IPv6 地址结构(128 位) 网络前缀(64 bits) 接口标识符(64 bits) 示例: 2001:0db8:1234:5678 : 0211:22ff:fe33:4455 常用地址类型速查 Global Unicast(公网) 2000::/3 → 2xxx: 或 3xxx: 开头 全球唯一,不需要 NAT,代理出口首选 Link-Local(本地链路) fe80::/10 → fe80: 开头 不能跨路由器,仅本网段有效 Unique Local(私网) fc00::/7 → 实际用 fd00: 开头 组织内部使用,不出公网 Loopback(回环) ::1/128 等价于 127.0.0.1,本机通信
图:IPv6 128 位地址结构分解与四种常用地址类型

核心观点:/64 是 IPv6 子网的事实标准。除非你有明确的特殊需求(比如点对点链路用 /127),否则永远用 /64。

五种 Unicast 地址类型

IPv6 没有广播地址,但单播地址比 IPv4 复杂得多。以下五种你会实际遇到:

1. Global Unicast —— 公网上的唯一身份

等价于 IPv4 的公网 IP。地址通常以 2000::/3 开头——实际看到的地址以 2 或 3 开头,比如 240e:...2001:...。这是你用来在公网上通信的地址,全球唯一,不需要 NAT。

一个常用的判断方法:在终端跑 ipconfig(Windows)或 ip addr(Linux),看到 2 或 3 开头的地址,大概率是你的公网 IPv6。

2. Link-Local —— 只在本网段内有效

fe80::/10 开头,每个启用了 IPv6 的网络接口都会自动生成一个。Link-Local 地址不能跨路由器通信——它只在你设备直连的那个网段内有效。

踩坑提醒:新手最容易搞混的就是这个——看到终端里有一个 fe80:: 开头的地址就以为 IPv6 通了,实际上这只是一个 Link-Local,连路由器都出不去。判断你有没有真正的公网 IPv6 能力,要看有没有 2000::/3 范围内的地址。

Link-Local 的典型用途是邻居发现协议(NDP)、路由器发现、以及作为默认网关地址。你家路由器的默认网关大概率就是一个 fe80::1

3. Unique Local —— 私网地址的 IPv6 版本

fc00::/7 开头(实际部署中几乎都是 fd00::/8),等价于 IPv4 的私网地址(192.168.x.x、10.x.x.x)。可以在组织内部自由使用,不会路由到公网。

跟 IPv4 私网地址的关键区别:Unique Local 是全局唯一的(理论上,因为生成算法用了随机数),不同组织的 Unique Local 地址几乎不会冲突。比 IPv4 私网的地址冲突问题好太多了。

4. Loopback —— 自己跟自己说话

::1/128,等价于 IPv4 的 127.0.0.1。注意 IPv6 的 Loopback 只有一个地址,不像 IPv4 那样整个 127.0.0.0/8 都是。

5. Unspecified —— 还没有地址

::/128,即全零地址。等价于 IPv4 的 0.0.0.0,表示”我还没有 IP 地址”。DHCP 客户端在拿到地址之前会用这个作为源地址。

快速识别表

地址开头 类型 能出路由器? 典型用途
2xxx:3xxx: Global Unicast ✅ 能 公网通信、代理出口
fe80: Link-Local ❌ 不能 邻居发现、网关通信
fd00: Unique Local ❌ 不能 内网通信、跨站点 VPN
::1 Loopback ❌ 不能 本机回环

Multicast 和 Anycast 的区别

IPv6 没有广播(Broadcast),取而代之的是组播(Multicast,以 ff00::/8 开头)和任播(Anycast)。Multicast 是一对多——同一组地址的所有设备都能收到。Anycast 是一对最近——多个设备共享同一个地址,流量被路由到最近的那台。Anycast 在 CDN 和 DNS 根服务器中大量使用,但对普通的代理和采集场景影响不大,这里不展开。

核心观点:看到 2 开头的地址才能出公网,fe80 开头的只在本网段有效。这个判断方法在排查代理出口问题时直接能帮你定位是设备没拿到公网 IPv6 还是路由没配。

SLAAC:无状态自动配置

SLAAC(Stateless Address Autoconfiguration)是 IPv6 最独特的机制——设备不需要 DHCP 服务器就能自动拿到一个全局可路由的地址。

工作流程很简单:

  1. 设备启动后,路由器定期发送 RA(Router Advertisement)消息,里面包含了网络前缀信息
  2. 设备拿到前缀后,自己生成接口 ID(64 位),跟 64 位前缀拼接成完整地址
  3. 地址生成后,设备做 DAD(Duplicate Address Detection,重复地址检测)确认没人占用

SLAAC 之所以叫”无状态”,是因为路由器不需要记录哪个设备用了哪个地址——设备自己生成,路由器只管发前缀。这对大规模部署非常友好,尤其适合物联网场景。

但 SLAAC 有一个明显的局限:它不能下发 DNS 服务器地址。这在早期是个大问题——设备拿到了 IPv6 地址却没有 DNS,上不了网。后来通过 RDNSS(Recursive DNS Server,RFC 8106)扩展解决了,但需要路由器和客户端同时支持。

你在 Windows 上跑 ipconfig 或 Linux 上跑 ip addr show,如果看到多个 Global Unicast 地址,其中一个大概率是 SLAAC 生成的。

DHCPv6 与 SLAAC 的区别

DHCPv6 跟 IPv4 的 DHCP 在概念上类似,但工作方式有本质区别。IPv4 的 DHCP 既分配地址又下发网关和 DNS,而 IPv6 的 DHCPv6 默认不分配默认网关——网关信息由 RA 提供。

特性 SLAAC DHCPv6
地址分配 设备自己生成 服务器分配
DNS 下发 RDNSS(需路由器支持) 原生支持
地址管理 无状态——路由器不记 有状态——服务器跟踪租约
适用场景 家庭、物联网、零配置 企业——需要集中管控

企业网络通常用 DHCPv6,因为管理员需要精确控制每个设备的地址。家庭环境 SLAAC 就够了——你不需要给家里的每台手机手工分配 IP。

核心观点:SLAAC 适合”即插即用”,DHCPv6 适合”需要管控”。很多人纠结用哪个,其实大多数家庭路由器默认同时开启,手机会优先尝试 SLAAC,拿不到再用 DHCPv6。

EUI-64:MAC 地址到 IPv6 的转换

EUI-64 是 SLAAC 下生成接口 ID 的一种方法——用网卡的 MAC 地址推导出一个 64 位的接口标识符。算法不复杂,但有一个容易搞错的细节。

MAC 地址是 48 位,EUI-64 需要 64 位,中间差了 16 位。这 16 位被固定为 FFFE,插在 MAC 地址的中间:

MAC:  00:11:22:33:44:55
       ↓ 插入 FFFE
      00:11:22:FF:FE:33:44:55
       ↓ 翻转第 7 位(U/L 位)
      02:11:22:FF:FE:33:44:55  ← 接口 ID

第 7 位翻转这一步是最容易搞错的——MAC 地址的第一个字节 00(二进制 00000000),第 7 位翻转后变成 02(二进制 00000010)。这个位在 MAC 地址中表示”本地管理 vs 全局管理”,翻转后确保 EUI-64 生成的地址不会跟原始 MAC 地址混淆。

踩坑提醒:网上不少教程写 EUI-64 时直接插 FFFE 就算完事,漏了第 7 位翻转这一步。结果就是生成的地址跟实际设备上的不一致,查了半天不知道哪里出错。如果你在手动计算 EUI-64 地址,记得第一步永远是检查并翻转第一个字节的第 7 位。

另外,SLAAC 不一定用 EUI-64 来生成接口 ID。现代操作系统很多默认使用 RFC 7217 的语义不透明地址生成方式,它不暴露 MAC 地址信息——这在隐私层面是个重要改进,下节细讲。

核心观点:EUI-64 的逻辑链是 “MAC → 插 FFFE → 翻第 7 位”,但现代系统很多已弃用,改用语义不透明方式。如果你做代理网络,用 /64 子网手动分配接口 ID 通常比依赖自动生成更可控。

隐私扩展:为什么地址会变

EUI-64 有一个致命问题——因为接口 ID 是从固定的 MAC 地址推导的,不管你在哪个网络,同一个设备的接口 ID 永远一样。这意味着跟踪用户变得异常容易。你在公司用的是 2001:db8::0211:22ff:fe33:4455,回家连上家里的 IPv6 网络,前缀变了但接口 ID 还是同一个——广告追踪器一眼就能认出你。

IPv6 隐私扩展(Privacy Extensions,RFC 4941)解决了这个问题:设备定期生成随机的临时地址用于出站连接,并且每隔一段时间轮换一次。你电脑上可能会同时有多个 IPv6 地址——一个是 SLAAC 生成的稳定地址(用于入站连接,比如 SSH),几个是隐私扩展生成的临时地址(用于出站浏览)。

Windows 默认开启隐私扩展,你可以在 PowerShell 里确认:

netsh interface ipv6 show privacy

如果你在做代理 IP 业务,隐私扩展导致的地址频繁变化既是好事也是麻烦事。对被采集的目标网站来说,源 IP 频繁变化会降低同一用户的追踪能力;但对需要固定出口的场景(比如账号登录操作),你得用静态 IPv6 地址或者关掉隐私扩展。

核心观点:IPv6 地址会变是设计如此,不是 bug。隐私扩展保护了用户,但做代理运维时需要清楚哪些场景该保留、哪些场景该关掉。

手动配置命令

三个主流平台的配置方法:

# Linux —— 给 eth0 加一个固定 IPv6 地址
ip addr add 2001:db8:1::100/64 dev eth0

# Windows —— 给"以太网"接口配固定 IPv6
netsh interface ipv6 add address "以太网" 2001:db8:1::100

# macOS —— 给 en0 配固定地址
sudo ifconfig en0 inet6 2001:db8:1::100 prefixlen 64

配完之后记得加上默认网关:

# Linux/Mac
ip -6 route add default via 2001:db8:1::1

# Windows
netsh interface ipv6 add route ::/0 "以太网" 2001:db8:1::1
踩坑提醒:手动配了 IPv6 地址但忘了配默认网关,这是最经典的故障场景。ping 本网段通,ping 外网不通,查了半天防火墙规则,最后发现是没配网关。IPv6 不像 IPv4 那样常常 DHCP 自动下发网关(除非你开了 SLAAC),手动配置时一定记得补网关。

下一步看什么

搞清楚了 IPv6 地址的结构、类型和生成机制,接下来有两个方向取决于你的需求:

如果你的下一步是技术决策——想知道 IPv6 和 IPv4 的实际差异有多大、要不要迁移到 IPv6、迁移的成本怎么评估,有一篇 IPv4 和 IPv6 的逐项技术对比和迁移路径 会帮你把决策所需的依据全部理清。

如果你想动手——想知道怎么检测一个网站支不支持 IPv6、怎么在路由器上配端口转发,网站 IPv6 检测和端口转发的实操指南 有完整的命令和排错步骤。