一、概念简介
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 报文后,会:
- 检查外层 IPv4 目的是否为自己(或者 anycast 地址等)。
- 取出 IPv4 的 payload —— 这就是内层 IPv6 报文(原封不动,除非 BR 做额外处理)。
- 删除外层 IPv4 头。
- 将内层 IPv6 报文转发到 IPv6 网络(基于内层 IPv6 dst 做路由查找)。
解封之后实际发送到 IPv6 网络的包:
- IPv6 src:
2001:db0:0071:2d00::1(保持原样) - IPv6 dst:
2001: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 依据哪些“数据”来封装/拆解报文?(总结)
- 6rd 配置参数(ISP 下发,CPE 学到):
6rdPrefix(IPv6 前缀与长度)IPv4MaskLen(例如 8)BR IPv4 地址(通常是单个或一组 BR 的IPv4)
这些参数用于:生成本机 IPv6 前缀、决定把哪些 IPv6 目的发送到 BR、以及封装时把包送到哪个 BR。
- 协议类型:
- 封装使用 IPv4 protocol = 41(这是 IP 协议号,表示 IPv6-in-IPv4)。
- BR 识别到 proto=41 的 IPv4 数据包就会尝试解封装(前提是目标是 BR 或 BR anycast)。
- 路由表 / 匹配规则:
- CE 的路由表会指明:到达某些 IPv6 前缀/目的要走 6rd(更具体:指向本地的
6rd接口,封装到BR IPv4)。 - BR 在解封装后,用内层 IPv6 dst 做常规 IPv6 转发。
- CE 的路由表会指明:到达某些 IPv6 前缀/目的要走 6rd(更具体:指向本地的
- IPv4 地址到 IPv6 前缀的映射规则(用于反向映射或分配):
- CE/BR 约定了如何把 IPv4 地址的某些位嵌入到 IPv6 地址(即
IPv4MaskLen的使用),用于生成每用户的 IPv6 前缀以及 BR 判断目标 IPv6 应该送回哪个 IPv4 地址。
- CE/BR 约定了如何把 IPv4 地址的某些位嵌入到 IPv6 地址(即
注意事项 / 细节(实务上常见的问题)
- 内外层地址变化:
- 内层 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)保证。