不是所有隧道都可以实现 VPC

0 阅读3分钟

从第一性原理出发,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”的头部:

特性IPIPVXLANGeneve / 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,只能通过以下非主流手段,但它们在工程上都是不可持续的:

  1. 一对一映射:为每个 VPC 分配一个独立的物理 IP 地址。

    • 失效原因:物理机 IP 资源有限,且无法支撑成千上万个 VPC 的扩展性。
  2. 复杂的控制面路由映射:在宿主机上记录 (外部源IP, 外部目的IP) -> 租户ID 的映射表。

    • 失效原因:如果不同 VPC 的流量在同一对宿主机之间流动,它们的外部 IP 是完全一样的,映射逻辑依然会失效。

5. 总结

IPIP 设计的初衷是点对点的简单隧道(如移动 IP 或基础跨网联通),而非大规模多租户架构。VPC 需要的是有状态的隔离,这种状态必须携带在数据包的头部(如 VNI),而 IPIP 为了极致的精简舍弃了所有元数据空间。

在现代容器网络中(如你熟悉的 Cilium 或 Kube-OVN),虽然可以使用 IPIP 模式(例如在某些没有重叠 IP 需求或简单的跨子网通信场景下),但一旦涉及到严格的 VPC 租户隔离,VXLAN 或 Geneve 始终是标准选择。