从第一性原理出发,IPIP(IP-in-IP)协议无法直接实现 VPC(Virtual Private Cloud)的核心原因在于:它缺乏一个关键的“多租户标识符”(Network Identifier)。
以下是详细的技术分析:
1. 结论先行
VPC 的本质是多租户隔离与地址空间重叠。IPIP 协议由于其报文头部设计过于简单,没有类似于 VXLAN 中 VNI(Virtual Network Identifier)或 Geneve 中 VNI 的字段,导致在物理网络(Underlay)中无法区分来自不同 VPC 但具有相同私有 IP 地址的流量。
2. 协议层级分析(第一性原理)
IPIP 的报文结构
IPIP 是一种极其精简的隧道协议(RFC 2003),其封装逻辑如下:
[外部 IP 头部 (Outer IP)] [内部 IP 头部 (Inner IP)] [载荷 (Payload)]
- 外部 IP 头部:仅包含物理宿主机的源 IP 和目的 IP。
- 内部 IP 头部:包含虚拟机的源 IP 和目的 IP。
- 中间层:无。它没有任何额外的 Shim Layer(中间层)来携带元数据。
VPC 的核心需求:多租户与地址重叠
在云网络中,租户 A 和租户 B 都可以使用 10.0.0.1 这个网段。
- 当租户 A 的报文到达物理宿主机进行 IPIP 封装后,外部头部只知道要把报文发往某个宿主机。
- 解封装困境:当目的宿主机收到 IPIP 报文并剥掉外部 IP 头部后,它只能看到内部 IP 是
10.0.0.1。此时,宿主机无法通过报文本身得知这个10.0.0.1属于租户 A 的 VPC 还是租户 B 的 VPC,从而无法将其转发到正确的虚拟网卡或 VRF(虚拟路由转发)实例中。
3. IPIP 与主流 VPC 隧道协议的对比
为了支持 VPC,隧道协议必须在 Underlay 和 Overlay 之间插入一个包含“租户 ID”的头部:
| 特性 | IPIP | VXLAN | Geneve / STT |
|---|---|---|---|
| 封装开销 | 20 字节 (最小) | 50 字节 (较大) | 动态 (较大) |
| 租户标识 | 无 | VNI (24-bit) | VNI + TLV Options |
| 支持重叠 IP | 不支持 | 支持 | 支持 |
| 多路径负载 (ECMP) | 差(只有 IP 层信息) | 好(UDP 端口号熵值) | 好(UDP 端口号熵值) |
| 二层语义支持 | 仅限 L3 Over L3 | 支持 L2 Over L3 | 支持 L2/L3 Over L3 |
4. 逻辑上的“变通”方案及其局限性
理论上,如果要用 IPIP 实现 VPC,只能通过以下非主流手段,但它们在工程上都是不可持续的:
-
一对一映射:为每个 VPC 分配一个独立的物理 IP 地址。
- 失效原因:物理机 IP 资源有限,且无法支撑成千上万个 VPC 的扩展性。
-
复杂的控制面路由映射:在宿主机上记录
(外部源IP, 外部目的IP) -> 租户ID的映射表。- 失效原因:如果不同 VPC 的流量在同一对宿主机之间流动,它们的外部 IP 是完全一样的,映射逻辑依然会失效。
5. 总结
IPIP 设计的初衷是点对点的简单隧道(如移动 IP 或基础跨网联通),而非大规模多租户架构。VPC 需要的是有状态的隔离,这种状态必须携带在数据包的头部(如 VNI),而 IPIP 为了极致的精简舍弃了所有元数据空间。
在现代容器网络中(如你熟悉的 Cilium 或 Kube-OVN),虽然可以使用 IPIP 模式(例如在某些没有重叠 IP 需求或简单的跨子网通信场景下),但一旦涉及到严格的 VPC 租户隔离,VXLAN 或 Geneve 始终是标准选择。