6rd-tunnel

一、概念简介

6rd(IPv6 Rapid Deployment) 是一种在 IPv4 网络上快速部署 IPv6 的过渡机制。
它通过 IPv6 over IPv4 隧道,让用户即使在没有原生 IPv6 的网络中,也能使用 IPv6。

它是从早期的 6to4 技术演化而来,但由 ISP(而非用户)来控制,因此更可靠、更易管理。

🌐 一句话概括

6rd 就是 ISP 在 IPv4 网络上用隧道方式封装 IPv6 数据包,让用户在没有原生 IPv6 的环境下也能使用 IPv6。


二、基本原理

6rd 的机制是:

  • 用户的 IPv6 数据包 被 CE 封装在 IPv4 报文里(IPv6-over-IPv4)
  • 通过 IPv4 网络传输;
  • 到达 ISP 侧的 6rd Border Relay(BR)
  • BR 解封装并将数据转发到 IPv6 网络。 传输示意:
[用户主机 IPv6]
       ↓
[6rd CPE or CE(家用路由器)]
  └── 封装 IPv6 in IPv4
       ↓
[ISP IPv4 网络]
       ↓
[6rd Border Relay]
  └── 解封装后发往 IPv6 网络
       ↓
[互联网 IPv6 目标]

IPv6 报文被封装在 IPv4 报文中,通过 IPv4 网络传输,直到边界路由器(BR)解封装后进入原生 IPv6 网络。

为什么需要在ipv6地址中嵌入ipv4地址

关键点是:

6rd 是 无状态(stateless)隧道
BR(边界路由器)不保存任何映射表

也就是说,当 BR 收到一个 IPv4 封装的 6rd 报文时,它必须仅凭 IPv6 报文中的地址结构,就能知道:

  • 要转发给哪个 CE;
  • IPv4 头应该封装成什么源/目的地址。 IPv4 头只是用于“运输”,而 IPv6 地址中的 IPv4 嵌入部分才是6rd 的定位系统,让 BR 在无状态条件下知道“这个 IPv6 属于哪个 IPv4 网络的客户”。

三、地址结构

首先,在配置6rd时,需要获得以下配置参数

  • 6rdPrefix(IPv6 前缀与长度)
  • IPv4MaskLen(例如 8)
  • BR IPv4 地址(通常是单个或一组 BR 的IPv4)
  • CE IPv4 地址 (一般是路由器的公网地址)

6rd 的 IPv6 地址由以下部分组成:

|<---- 6rdPrefix ---->|<---- IPv4嵌入部分 ---->|<-- 子网ID -->|<-- 主机ID -->|

定义:

  • 6rdPrefix:ISP 提供的 IPv6 前缀(长度为 PLEN)
  • IPv4MaskLen:ISP 在 IPv4 网络中共享的前缀长度(例如 8 表示前 8 位是共用的)
  • IPv4嵌入部分CE IPv4 地址中剩余的 (32 - IPv4MaskLen) 位,用于区分不同用户的部分
  • 用户 IPv6 前缀长度:
PrefixLen = PLEN + (32 - IPv4MaskLen)

CE会使用PrefixLen为内网的网段,然后通过SLAAC协议DHCPv6协议为内网配置地址。


四、嵌入机制详解

假设:

6rdPrefix = 2001:db0::/28
IPv4MaskLen = 8
IPv4地址 = 203.0.113.45 = 0x CB 00 71 2D

IPv4 拆解:

11001011.00000000.01110001.00101101
↑--------↑-------------------------↑
  前8位(ISP共用)  后24位(嵌入IPv6)

嵌入部分是:

00000000.01110001.00101101 → 0x00712D

于是 IPv6 地址拼接为:

IPv6 = 2001:db0:0071:2d00::/52

计算:

PrefixLen = 28 + (32 - 8) = 52

因此用户的 IPv6 前缀是 /52,可进一步划分出多个 /56 或 /64 子网。

注意:具体排列可能因 CPE 实现不同而略有不同(按比特顺序拼入),但逻辑是:
取 IPv4 地址中除前 IPv4MaskLen 位外的后 (32 - IPv4MaskLen) 位嵌入 IPv6 地址。


五、6rd报文发送流程

  • 内网主机(Host)发出的 IPv6 源地址:2001:db0:0071:2d00::1,这个地址是由对应的CE路由器分配的。
  • 目标 IPv6(远端服务器):2001:4860:4860::8888(示例)
  • CPE(CE)公网 IPv4 地址:203.0.113.45
  • ISP 的 6rd Border Relay(BR)IPv4 地址:198.51.100.1
  • ISP 给的 6rdPrefix:2001:db0::/28
  • ISP 配置的 IPv4MaskLen = 8(因此嵌入 24 位 IPv4 到 IPv6)

我们从 Host 向远端服务器发起一个普通的 IPv6 包开始。

步骤 1 — 主机生成原始 IPv6 报文(内层,未封装)

主机在本地网络上产生的 IPv6 报文(只列关键字段):

  • 内层 IPv6 源(src)2001:db0:0071:2d00::1
  • 内层 IPv6 目的(dst)2001:4860:4860::8888
  • 其它:Hop Limit、Payload(TCP/UDP)等照常。

这是“原始 IPv6 报文”,此时根本没有 IPv4 头。

步骤 2 — CPE(CE)决定是否封装

CE 会基于其路由/配置来决定该 IPv6 报文是否通过 6rd 隧道送出。CE 通常有这些配置项(由 ISP 下发,常见通过 DHCP):

  • 6rdPrefix(例如 2001:db0::/28
  • IPv4MaskLen(例如 8
  • 6rd-BR IPv4 地址(例如 198.51.100.1
  • 以及本机公网 IPv4(203.0.113.45

判断逻辑(常见实现):

  • 如果内层 IPv6 dst 不在本地链路、而是需要通过 ISP 的 IPv6 互联(或路由表指向 6rd),CE 会对该内层 IPv6 报文封装成 IPv4(protocol = 41)并把 outer IPv4 dst 指向 BR 的 IPv4。

步骤 3 — CE 封装后发出的外层 IPv4 报文(IPv6-in-IPv4)

封装后外层 IPv4 报文的关键字段如下:

  • 外层 IPv4 源(src)203.0.113.45(CE 的公网 IPv4)
  • 外层 IPv4 目的(dst)198.51.100.1(BR 的 IPv4)
  • IPv4 Protocol 字段41(表示 IPv6-in-IPv4)
  • 外层 IPv4 TTL:例如 64(按普通 IPv4 路由处理,沿途会递减)
  • Payload:完整的 内层 IPv6 报文(源 dst 与原样保留)

因此在 IPv4 网络中跑的是:IPv4(src=CE, dst=BR, proto=41) / IPv6(src=host, dst=remote) / L4...

重要:内层 IPv6 的 src/dst 完全保留,不被改写(CE 只把它当做 payload 封装)。任何 TCP/UDP 校验和也仍然针对内层 IPv6 + L4 有效。

步骤 4 — 在 IPv4 网络中传输

  • IPv4 报文按常规 IPv4 路由被转发到 BR(中间路由器只处理外层 IPv4 头:源/目的/TTL、分片等)。
  • 路由器只会修改/影响外层 IPv4头(例如递减 TTL、可能造成分片),对内层 IPv6 内容不做处理(除非做深度检查)。

步骤 5 — BR 收到包并解封装(decapsulation)

BR 接收到 proto=41 的 IPv4 报文后,会:

  1. 检查外层 IPv4 目的是否为自己(或者 anycast 地址等)。
  2. 取出 IPv4 的 payload —— 这就是内层 IPv6 报文(原封不动,除非 BR 做额外处理)。
  3. 删除外层 IPv4 头。
  4. 将内层 IPv6 报文转发到 IPv6 网络(基于内层 IPv6 dst 做路由查找)。

解封之后实际发送到 IPv6 网络的包:

  • IPv6 src2001:db0:0071:2d00::1(保持原样)
  • IPv6 dst2001:4860:4860::8888(保持原样)
  • 然后 BR 按常规 IPv6 路由把它交给下一跳(可能是上游 IPv6 网络或目标)的路由器。

返回路径(对端响应)的大致行为

远端服务器回应 IPv6 报文,路径到达 BR:

  • BR 知道如何把返回的 IPv6 发回客户的 IPv6 前缀(因为 BR 根据 6rd 的映射,把 IPv6 前缀映射到相应的 IPv4 源)。
  • BR 将 对端返回的内层 IPv6 报文 再次封装到 IPv4:IPv4(src=BR IPv4=198.51.100.1, dst=CE IPv4=203.0.113.45, proto=41) / IPv6(src=remote, dst=host) / ...
  • CE 收到后解封,把 IPv6 包送到内网主机。

CE/BR 依据哪些“数据”来封装/拆解报文?(总结)

  1. 6rd 配置参数(ISP 下发,CPE 学到):
    • 6rdPrefix(IPv6 前缀与长度)
    • IPv4MaskLen(例如 8)
    • BR IPv4 地址(通常是单个或一组 BR 的IPv4)
      这些参数用于:生成本机 IPv6 前缀、决定把哪些 IPv6 目的发送到 BR、以及封装时把包送到哪个 BR。
  2. 协议类型
    • 封装使用 IPv4 protocol = 41(这是 IP 协议号,表示 IPv6-in-IPv4)。
    • BR 识别到 proto=41 的 IPv4 数据包就会尝试解封装(前提是目标是 BR 或 BR anycast)。
  3. 路由表 / 匹配规则
    • CE 的路由表会指明:到达某些 IPv6 前缀/目的要走 6rd(更具体:指向本地的 6rd 接口,封装到 BR IPv4)。
    • BR 在解封装后,用内层 IPv6 dst 做常规 IPv6 转发。
  4. IPv4 地址到 IPv6 前缀的映射规则(用于反向映射或分配):
    • CE/BR 约定了如何把 IPv4 地址的某些位嵌入到 IPv6 地址(即 IPv4MaskLen 的使用),用于生成每用户的 IPv6 前缀以及 BR 判断目标 IPv6 应该送回哪个 IPv4 地址。

注意事项 / 细节(实务上常见的问题)

  • 内外层地址变化
    • 内层 IPv6 地址不因封装而改变。
    • 外层 IPv4 地址在外网部分可见(CE 的公网与 BR 的公网)。
  • NAT 的问题
    • 6rd 需要 CE 拥有公网 IPv4(或可路由的 IPv4)。如果 CE 在 NAT 后,6rd 无法正常工作(因为 BR 无法直接把包返回到私有地址)。部分运营商可能不在 NAT 环境下部署 6rd。
  • MTU / 分片
    • 封装会增加外层 IPv4 头(至少 +20 字节),可能导致需要分片或 PMTU 问题。IPv6 端通常期望 PMTU 工作,CE/BR 与 PMTUD 配合很重要。
  • TTL / Hop Limit
    • 外层 IPv4 的 TTL 在 IPv4 网络上递减;内层 IPv6 的 Hop Limit 在被 BR 解封后,才会由之后的 IPv6 路由器递减(封装路径上并不改变内层的 Hop Limit)。
  • 分片处理
    • 如果内层 IPv6 报文使得封装后的外层 IPv4 报文超过链路 MTU,封装端(CE)或路由器可能会进行 IPv4 分片,或丢弃并发送 ICMP(取决于 DF 标志等)。这会影响性能与可靠性。
  • 多 BR / Anycast
    • ISP 可能使用 anycast 的 BR IPv4 地址集合,CE 只需把外层 dst 指向 BR 集合地址,由网络决定到达最近的 BR。
  • 校验与完整性
    • IPv4 头的校验和仅覆盖外层 IPv4 头;内层 IPv6 的有效性由 IPv6/传输层校验(TCP/UDP checksum)保证。