了解 GENEVE 格式

通用网络虚拟化封装 (GENEVE) 是一种网络封装协议,可使用额外的元数据封装原始数据包。借助此类额外的元数据,可以实现灵活且可扩展的网络虚拟化。

下图显示了 GENEVE 数据包的标头格式。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |Ver|  Opt len  |O|C|   Rsvd.   |         Protocol type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Virtual network identifier (VNI)       |     Rsvd.     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的 GENEVE 标头字段:

字段 说明 字段长度
Ver GENEVE 协议的版本。唯一支持的版本是零 (0)。 如需了解详情,请参阅隧道标头字段 2 位
Opt len 选项字段的长度,以 4 字节为单位表示,不包括 8 字节的固定隧道标头。 如需了解详情,请参阅隧道标头字段 6 位
O 控制数据包位。如需了解详情,请参阅隧道标头字段 1 位
C 关键选项位。如需了解详情,请参阅隧道标头字段 1 位
Rsvd 预留字段,在传输时必须为零 (0),在接收时必须忽略。如需了解详情,请参阅隧道标头字段 6 位
协议类型 协议类型允许任何以太网类型,但网络安全集成仅允许 IPv4 (0x0800) 或 IPv6 (0x86DD)。 16 位
虚拟网络标识符 (VNI) 虚拟网络元素的唯一标识符。 网络安全集成不会填充此字段,这意味着 VNI 设置为零 (0)。如需了解详情,请参阅带外集成 GENEVE 24 位
Rsvd 预留字段,在传输时必须为零 (0),在接收时必须忽略。如需了解详情,请参阅隧道标头字段 8 位

特定于Google Cloud的 GENEVE 选项

GENEVE 标头使用类型-长度-值 (TLV) 格式来表示其选项。这意味着,每个选项都采用以下方式进行编码:类型标识符、指示值大小的长度字段以及值本身。此格式具有灵活性和可扩展性,因为可以添加新选项,而不会中断现有实现。 以下部分介绍了选项的顺序和数量。请注意,随着产品不断发展,选项的数量和顺序会有所变化。因此,为确保设备实现向前兼容,请基于 TLV 字段解析 GENEVE 标头。

特定于 Google Cloud 的 GENEVE 选项如下所示:

  • 广告联盟 ID(广告联盟 Cookie)
  • 端点 ID(端点 Cookie)
  • 个人资料 ID

广告网络 ID

网络 ID 选项(也称为“网络 Cookie”)用于标识与 Google Cloud中采用 GENEVE 封装的流量相关联的虚拟网络。 此选项由选项类 0x0132 (Google) 和类型 1(网络 ID)标识。选项数据包含 32 位,其中前 28 位表示不透明的网络 ID。其余 4 位的用途如下面的图表所示。

下图显示了 GENEVE 数据包中的选项格式。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=01    |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Network cookie                    |R|R|T|D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的选项字段:

字段 说明 字段长度
期权类别 标识定义了相应选项的组织或实体。 值 0x0132 表示 Google 是定义实体。 16 位
类型 用于标识类中选项的类型。值 0x1 表示“网络 ID”选项。 如需了解详情,请参阅隧道选项 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为零 (0),并且在接收时必须忽略。 3 位
Len 选项载荷的长度,以 4 字节为增量。网络 ID 载荷为 32 位(4 字节),因此此选项的长度设置为 1。 5 位
网络 Cookie 用于标识虚拟网络的不透明网络 Cookie。 28 位
R 预留以供日后实现。在传输时必须设置为零 (0),在接收时必须忽略。 2 位
T 指示封装数据包的 TLS 分流。未使用。 1 位
D 表示原始数据包的方向。0 表示入站数据包,1 表示原始镜像虚拟机的出站数据包。 1 位

端点 ID

端点 ID 选项(也称为“端点 Cookie”)可唯一标识捕获点,即 Google Cloud虚拟机上的网络接口控制器。此选项由选项类 0x0132 (Google) 和类型 2(端点 ID)标识。选项数据是一个 128 位的不透明值。

下图显示了 GENEVE 数据包中的选项格式。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |     Type=02   |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                        Endpoint cookie                        +
      |                                                               |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的选项字段:

字段 说明 字段长度
期权类别 标识定义了相应选项的组织或实体。 值 0x0132 表示 Google 是定义实体。 16 位
类型 用于标识类中选项的类型。值 0x2 表示“端点 ID”选项。 如需了解详情,请参阅隧道选项 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为零 (0),并且在接收时必须忽略。 3 位
Len 以 4 字节为增量的有效载荷长度。端点 ID 载荷为 128 位(16 字节),因此此选项的长度设置为 4。 5 位
端点 Cookie 捕获点(虚拟机网卡)的不透明标识符。 128 位

个人资料 ID

配置文件 ID 选项用于标识应用于流量的镜像安全配置文件组。此选项由选项类 0x0132 (Google) 和类型 3(个人资料 ID)标识。选项数据是一个 64 位标识符,对应于安全配置文件组中的 data_path_id 字段。目标设备可能会根据配置文件组标识符强制执行安全政策。

下图显示了 GENEVE 数据包中的选项格式。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=03    |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Profile ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的选项字段:

字段 说明 字段长度
期权类别 标识定义了相应选项的组织或实体。 值 0x0132 表示 Google 是定义实体。 16 位
类型 用于标识类中选项的类型。值 0x3 表示“配置文件 ID”选项。 如需了解详情,请参阅隧道选项 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为零,在接收时必须忽略。 3 位
Len 选项载荷的长度,以 4 字节为增量。个人资料 ID 载荷为 64 位(8 字节),因此此选项的长度设置为 2。 5 位
个人资料 ID 镜像安全配置文件组的标识符。 64 位

Network Security Integration 的 GENEVE 标头格式

本部分介绍了网络安全集成服务使用的 GENEVE 标头格式。

IPv4 标头

GENEVE 数据包格式通过 IPv4 将紧凑型隧道标头封装在 UDP 中。小型固定隧道标头提供控制信息以及基本功能和互操作性。

下图显示了 GENEVE 数据包的 IPv4 标头字段。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |Version|  IHL  |Type of service|          Total length         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         Identification        |Flags|     Fragment offset     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Time to live | Proto=17 (UDP)|        Header checksum        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         Source address                        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                      Destination address                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图所示的 IPv4 标头字段:

字段 说明
Proto=17(对于 GENEVE,始终为 UDP) 表示封装的载荷使用 UDP 协议。
来源地址 本地子网的网关 IP 地址。
目标地址 客户自有负载均衡器的 VIP。

UDP 标头

UDP RFC 0768 标头封装了数据,同时保持了以太网和 IP 地址的无连接语义。它还为执行等价多路径 (ECMP) 的路由器提供熵。

下图显示了封装在 UDP 中的 Geneve 数据包的标头格式。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |      Source port = <hash>     |   Dest port = 6081 (Geneve)   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |           UDP length          |          UDP checksum         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图所示的 UDP 标头字段:

字段 说明
来源端口 整个 16 位范围内的不透明哈希。对于属于单个封装流(双向)的所有数据包,该值均相同。
目标端口 GENEVE 流量的指定目标端口号,设置为 6081。
UDP 长度 UDP 数据报的总长度,包括 UDP 标头和封装的 GENEVE 数据包。
UDP 校验和 用于检测错误的 UDP 数据报的校验和值。

带外集成 GENEVE

本部分介绍了网络安全集成服务(尤其是带外集成)所使用的 GENEVE 标头格式。带外集成使用 GENEVE 隧道封装和传送镜像数据包。数据包寻址到收集器的内部负载均衡器虚拟 IP 地址 (VIP),并带有 Google Cloud特定的元数据(例如网络 Cookie)。

带外集成中使用的特定于 Google Cloud的 GENEVE 选项包括网络 Cookie、端点 Cookie 和配置文件 ID。如需了解详情,请参阅特定于Google Cloud的 GENEVE 选项

下图展示了如何在带外集成中使用特定于 Google Cloud的 GENEVE 选项。

       0                    1                   2                  3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=0|  Opt len  |O|C|   Rsvd    |         Protocol type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Virtual network identifier (VNI) = 0   |     Rsvd.     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=01    |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Network cookie                    |R|R|T|D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=02    |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                        Endpoint cookie                        +
      |                                                               |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=03    |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Profile ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

带内集成 GENEVE

带内集成使用 GENEVE 隧道封装和传送拦截的数据包。生产者的内部负载均衡器虚拟 IP 地址 (VIP) 会接收带有 Google Cloud特定元数据(例如网络 Cookie)注释的数据包。

带内集成使用以下 Google Cloud专用 GENEVE 选项:网络 Cookie、端点 Cookie 和配置文件 ID。如需了解详情,请参阅特定于Google Cloud的 GENEVE 选项

带内集成支持使用逻辑双向 GENEVE 隧道将数据包重新注入到原始端点,该隧道由两个单向 GENEVE 隧道组成。提供方网络设备拦截并检查数据包后,可以丢弃或重新注入数据包。如需重新注入数据包,设备会执行以下操作:

  • 使用原始 GENEVE 标头(相同选项)重新封装数据包。
  • 交换外部 IP 标头中的来源地址和目标地址。
  • 确保校验和正确无误。

下图展示了如何在带内集成中使用特定于 Google Cloud的 GENEVE 选项。

       0                    1                   2                  3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=0|  Opt len  |O|C|   Rsvd    |         Protocol type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Virtual network identifier (VNI) = 0   |     Rsvd.     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=01    |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Network Cookie                    |R|R|T|D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=02    |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                        Endpoint Cookie                        +
      |                                                               |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=03    |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Profile ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

GENEVE 封装和 MTU 要求

最大传输单元 (MTU) 是指以太网帧内可容纳的包括 IP 报头、第 4 层协议报头和第 4 层数据在内的最大 IP 数据包的大小(以字节为单位)。如需了解详情,请参阅最大传输单元

在 Google Cloud 网络中,允许的 MTU 为 8896 字节。不过,对于 Network Security Integration,需要保留 396 字节用于 GENEVE 封装开销。这种保留需求对消费者网络和生产者网络都有影响:

  • 使用方网络 MTU:使用方网络的 MTU 不得超过 8500 字节。此限值可确保有足够的空间来容纳 GENEVE 开销,而不会超出最大 MTU。

  • 生产者网络 MTU:生产者网络的 MTU 必须比消费者网络的 MTU 至少大 396 字节。此许可可容纳额外的 GENEVE 封装。

如果没有足够的 MTU 限制来容纳 GENEVE 封装,则可能会丢弃数据包。这种情况可能发生在虚拟网络级层,也可能发生在虚拟机的操作系统中。

后续步骤