Cloud NAT 概览

借助 Cloud NAT(网络地址转换),专用 Google Kubernetes Engine (GKE) 集群和没有外部 IP 地址的 Google Cloud 虚拟机实例也可将出站数据包发送到互联网,并接收任何已建立的相应入站响应数据包。

架构

Cloud NAT 是一种软件定义的分布式代管式服务。它并非基于代理虚拟机或设备。Cloud NAT 会配置 Andromeda 软件,该软件为您的 Virtual Private Cloud (VPC) 网络提供支持,从而为没有外部 IP 地址的虚拟机提供来源网络地址转换 (SNAT)。此外,Cloud NAT 还会对建立的入站响应数据包执行目标网络地址转换 (DNAT)。

传统 NAT 与 Cloud NAT(点击可放大)。
传统 NAT 与 Cloud NAT(点击可放大)

Cloud NAT 结合 VPC 网络中的静态路由来实施出站 NAT,其中该网络中的后续跃点为默认互联网网关。在基本配置中,VPC 网络中的默认路由符合此要求。

Cloud NAT 不会实现来自互联网的未经请求的入站连接。仅针对用作对出站数据包的响应而到达的数据包执行 DNAT。

优势

Cloud NAT 具有以下优势:

  • 安全

    您可以减少各个虚拟机对外部 IP 地址的需求。根据出站防火墙规则,没有外部 IP 地址的虚拟机可以访问互联网上的目标。例如,您的虚拟机可能只需访问互联网即可下载更新或完成预配。

    如果您使用手动 NAT IP 地址分配来配置 Cloud NAT 网关,则可以放心地与目标方共享一组常用的外部来源 IP 地址。例如,目标服务可能只允许来自已知外部 IP 地址的连接。

  • 可用性

    Cloud NAT 是一种软件定义的分布式代管式服务。它既不依赖于项目中的任何虚拟机,也不依赖于单个物理网关设备。您可以在 Cloud Router 路由器上配置 NAT 网关,以便为 NAT 提供控制平面,并保存您指定的配置参数。Google Cloud 可在运行 Google Cloud 虚拟机的物理机器上运行和维护进程。

  • 可伸缩性

    您可配置 Cloud NAT 来自动扩缩其使用的 NAT IP 地址数量,Cloud NAT 还支持属于代管式实例组的虚拟机,包括已启用自动扩缩的虚拟机。

  • 性能

    Cloud NAT 不会降低每个虚拟机的网络带宽。Cloud NAT 可直接与 Google 的 Andlomeda 软件定义网络配合使用。如需了解详情,请参阅 Compute Engine 文档中的网络带宽

规范

您可配置 Cloud NAT 来为发送自以下地址的数据包提供互联网 NAT:

  • 虚拟机的网络接口的主要内部 IP 地址,前提是该网络接口未分配有外部 IP 地址。如果该网络接口具有外部 IP 地址,则由于该接口符合 Google Cloud 互联网访问要求,因此 Google Cloud 会自动对其来源与该接口的主要内部 IP 地址匹配的数据包执行一对一 NAT。如果接口上存在外部 IP 地址,则始终优先使用此地址,而且始终执行一对一 NAT,而不是使用 Cloud NAT。

  • 为虚拟机的网络接口分配的别名 IP 范围:即使网络接口分配有外部 IP 地址,您也可以配置 Cloud NAT 网关,对其来源在该接口的别名 IP 范围内的数据包提供 NAT。接口上的外部 IP 地址绝不会对别名 IP 地址执行一对一 NAT。

Cloud NAT 允许向这些连接发送出站响应和建立的入站响应。每个 Cloud NAT 网关都会对建立的响应数据包执行出站流量来源网络地址转换 (SNAT) 和目标网络地址转换 (DNAT)。

Cloud NAT 不会允许来自互联网的未经请求的入站请求,即使防火墙规则允许这些请求。如需了解详情,请参阅适用的 RFC

每个 Cloud NAT 网关都与一个 VPC 网络、地区和 Cloud Router 路由器相关联。Cloud NAT 网关和 Cloud Router 路由器提供了一个控制平面 - 数据平面中并未涉及这两项服务,因此数据包不会通过 Cloud NAT 网关或 Cloud Router 路由器。

路由和防火墙规则

Cloud NAT 依赖于后续跃点是默认互联网网关的自定义静态路由。要充分利用 Cloud NAT 网关,您的 VPC 网络需要下一个跃点是默认互联网网关的默认路由。如需了解详情,请参阅路由交互

Cloud NAT 没有任何 Google Cloud 防火墙规则要求。防火墙规则直接应用于 Compute Engine 虚拟机的网络接口,而非 Cloud NAT 网关。

您无需创建任何特殊防火墙规则来允许连接到或从 NAT IP 地址连接。当 Cloud NAT 网关为虚拟机的网络接口提供 NAT 时,适用的出站防火墙规则将在 NAT 之前被评估为网络接口的数据包。入站防火墙规则将在 NAT 处理完数据包后进行评估。

子网 IP 地址范围适用性

Cloud NAT 网关可以为发送自虚拟机网络接口的数据包提供 NAT 服务,但前提是该网络接口未分配有外部 IP 地址。您可配置 Cloud NAT 网关来为虚拟机网络接口的主要内部 IP 地址和/或别名 IP 范围提供 NAT。要进行此配置,您可以选择应将网关应用到的子网 IP 地址范围

您可配置 Cloud NAT 网关来为以下各项提供 NAT:

  • 相应地区中所有子网的主要和次要 IP 地址范围。单个 Cloud NAT 网关为符合条件的虚拟机的主要内部 IP 地址和所有别名 IP 范围提供 NAT,其中这些虚拟机的网络接口使用该地区中的子网。此选项仅对每个地区使用一个 NAT 网关。

  • 相应地区中所有子网的主要 IP 地址范围。单个 Cloud NAT 网关为符合条件的虚拟机的子网主要 IP 地址范围内的主要内部 IP 地址和别名 IP 范围提供 NAT,其中这些虚拟机的网络接口使用该地区中的子网。您可在该地区创建其他 Cloud NAT 网关,来为符合条件的虚拟机的子网次要 IP 地址范围内的别名 IP 范围提供 NAT。

  • 自定义子网 IP 地址范围。您可在必要时根据 Cloud NAT 配额和限制创建任意数量的 Cloud NAT 网关。您可以选择每个网关应提供哪个子网主要或次要 IP 地址范围是可以选择的。

带宽

使用 Cloud NAT 网关不会更改虚拟机可使用的出站或入站带宽量。如需了解带宽规范(因机器类型而异),请参阅 Compute Engine 文档中的网络带宽

包含多个网络接口的虚拟机

如果您配置的虚拟机包含多个网络接口,则每个接口必须位于单独的 VPC 网络中。因此,需满足以下条件:

  • Cloud NAT 网关只能应用于虚拟机的单个网络接口。单独的 Cloud NAT 网关可以为同一虚拟机提供 NAT,在这种情况下,每个网关都会应用于单独的接口。

  • 在多网络接口虚拟机中,一个接口可能具有外部 IP 地址,因此不符合 Cloud NAT 的要求,但如果另一接口没有外部 IP 地址,且向您配置了要应用到相应子网 IP 地址范围的 Cloud NAT 网关,则该接口可符合 NAT 的要求。

NAT IP 地址和端口

创建 Cloud NAT 网关时,您可以选择让网关自动分配地区级外部 IP 地址。或者,您也可以手动为网关分配固定数量的地区级外部 IP 地址。如需详细了解每种方法,请参阅 NAT IP 地址

您可以配置每个 Cloud NAT 网关为每个虚拟机(该网关应为这台虚拟机提供 NAT 服务)预留的来源端口数量。应为其提供 NAT 的虚拟机由您配置该网关以提供服务的子网 IP 地址范围决定。如需了解详情,请参阅端口和端口预留过程。

适用的 RFC

按照 RFC 5128 中的定义,Cloud NAT 支持端点独立映射和依赖于端点的过滤。您可以启用或停用端点独立映射。默认情况下,NAT 网关使用端点独立映射。

端点独立映射是指,如果虚拟机将来自给定内部 IP 地址和端口对的数据包发送到多个不同的目的地,网关会将所有数据包映射到相同的 NAT IP 地址和端口对,无论数据包的目的地为何。如需详细了解与“端点独立映射”相关的详情和影响,请参阅同时重用端口和端点独立映射

依赖于端点的过滤是指,仅当来自互联网的响应数据包是来自虚拟机已向其发送过数据包的 IP 地址和端口时,才允许这些响应数据包进入。过滤依赖于端点,与端点映射类型无关。此功能始终启用,且用户无法配置。

如需详细了解端口和连接之间的关系,请参阅端口和连接以及 NAT 流示例

Cloud NAT 是 RFC 3489 中定义的端口受限锥 NAT。

NAT 遍历

如果启用了端点独立映射,Cloud NAT 可兼容常见的 NAT 遍历协议(如 STUN 和 TURN,如果您部署自己的 STUN 或 TURN 服务器):

  • 在建立通信通道后,STUN(Session Traversal Utilities for NAT 的缩写,RFC 5389)允许直接与 NAT 后面的虚拟机之间通信。
  • TURN(Traversal Using Relays around NAT 的缩写,RFC 5766)允许通过第三服务器(该服务器具有外部 IP 地址)与 NAT 后面的虚拟机之间通信。每个虚拟机都连接到服务器的外部 IP 地址,并且该服务器会中继两个虚拟机之间的通信。TURN 更强大,但消耗的带宽和资源更多。

NAT 超时

Cloud NAT 网关使用以下超时。

超时 Cloud NAT 默认值 可配置

UDP 映射空闲超时

RFC 4787 REQ-5

30 秒

TCP 已建立的连接空闲超时

RFC 5382 REQ-5

1200 秒(20 分钟)

TCP 临时连接空闲超时

RFC 5382 REQ-5

30 秒

注意:无论您为此超时设置的值如何,Cloud NAT 可能还需要 30 秒才能使用 NAT 来源 IP 地址和来源端口元组处理新连接。

ICMP 映射空闲超时

RFC 5508 REQ-2

30 秒
在将 5 元组重复用于新的 TCP 连接之前的超时 (NAT 来源 IP 地址和来源端口元组与目标地址、目标端口和协议的组合) 120 秒(2 分钟)

如需了解详情,请参阅重用 TCP 来源端口的延迟时间

产品交互

以下部分介绍了 Cloud NAT 与其他 Google Cloud 产品之间的重要交互。

路由交互

Cloud NAT 网关只能使用后续跃点为默认互联网网关的路由。每个 VPC 网络均以默认路由开始,该路由的目标为 0.0.0.0/0,它的下一个跃点是默认互联网网关。如需了解重要的背景信息,请参阅路由概览

以下示例说明了可能导致 Cloud NAT 网关无法使用的情况:

  • 如果您创建一个自定义静态路由,并将其后续跃点设置为任何其他类型的自定义静态路由下一跃点,则目标 IP 与该路由目标相匹配的数据包会发送到上述下一个跃点,而不是默认互联网网关。例如,如果您要使用运行 NAT、防火墙或代理软件的虚拟机实例,则必须创建自定义静态路由,将流量作为下一个跃点定向到这些虚拟机。下一个跃点虚拟机需要外部 IP 地址。因此,来自依赖于下一个跃点虚拟机的虚拟机的流量以及下一个跃点虚拟机本身的流量都无法使用 Cloud NAT。

  • 如果您创建的自定义静态路由的下一个跃点是 Cloud VPN 隧道,则 Cloud NAT 不会使用该路由。例如,使用目标 0.0.0.0/0 和下一个跃点 Cloud VPN 隧道的自定义静态路由会将流量引导至该隧道,而非默认互联网网关因此,Cloud NAT 网关将无法使用该路由。即使对于更具体的目标(包括 0.0.0.0/1128.0.0.0/1)也是如此。

  • 如果本地路由器向管理 Cloud VPN 隧道或 Cloud Interconnect 互连连接 (VLAN) 的 Cloud Router 路由器通告自定义动态路由,则 Cloud NAT 网关不能使用该路由。例如,如果您的本地路由器通告目标为 0.0.0.0/0 的自定义动态路由,则 0.0.0.0/0 会被定向到 Cloud VPN 隧道或 Cloud Interconnect 连接 (VLAN)。即使对于更具体的目标(包括 0.0.0.0/1128.0.0.0/1)也是如此。

专用 Google 访问通道交互

Cloud NAT 从不对发送到所选 Google API 和服务的外部 IP 地址的流量执行 NAT。当您将 Cloud NAT 网关配置为应用于主要或次要子网域范围时,Google Cloud 会自动为子网 IP 地址范围启用专用 Google 访问通道。只要网关为子网范围提供 NAT,专用 Google 访问通道就会在该范围内有效,无法手动停用。

Cloud NAT 网关不会更改专用 Google 访问通道的工作方式。如需了解详情,请参阅专用 Google 访问通道

共享 VPC 交互

共享 VPC 允许单个组织中的多个服务项目在宿主项目中共用共享 VPC 网络。要为使用共享 VPC 网络的服务项目中的虚拟机提供 NAT,您必须在宿主项目中创建 Cloud NAT 网关。

VPC 网络对等互连交互

Cloud NAT 网关与单个地区和单个 VPC 网络中的子网 IP 地址范围相关联。即使对等互连网络中的虚拟机与网关位于同一地区,在一个 VPC 网络中创建的 Cloud NAT 网关也无法向使用 VPC 网络对等互连连接的其他 VPC 网络中的虚拟机提供 NAT。

GKE 交互

Cloud NAT 网关可以为专用集群(这是一种 VPC 原生集群)中的节点和 Pod 执行 NAT。您必须对 Cloud NAT 网关进行配置,至少应用于您的集群所用子网的以下子网 IP 地址范围:

  • 子网主要 IP 地址范围(由节点使用)
  • 集群中用于 Pod 的子网次要 IP 地址范围
  • 集群中用于 Service 的子网次要 IP 地址范围

若要为整个专用集群提供 NAT,最简单的方法是配置 Cloud NAT 网关,使其应用到该集群所有子网 IP 地址范围中。

如需了解有关 VPC 原生集群如何使用子网 IP 地址范围的背景信息,请参阅 VPC 原生集群的 IP 范围

当 Cloud NAT 网关经过配置要为专用集群提供 NAT 时,它会为每个节点虚拟机预留 NAT 来源 IP 地址和来源端口。Pod 可以使用这些 NAT 来源 IP 地址和来源端口,因为 Pod IP 地址是作为分配给每个节点虚拟机的别名 IP 地址范围实现的。由于可能的 Pod IP 地址范围最小为 256 个 IP 地址(子网掩码为 /24),因此 Cloud NAT 端口预留过程为每个节点至少预留 1024 个来源 IP 地址和来源端口。如需了解 Pod IP 地址范围和 VPC 原生集群,请参阅 Pod 的子网次要 IP 地址范围

GKE 与 Cloud NAT 无关,当 Pod 将数据包发送到互联网时,GKE 会使用在每个节点上运行的软件执行 SNAT,除非您更改了集群的 IP 伪装配置。如果您需要对 Pod 的出站流量进行精细控制,可以使用网络政策

在某些情况下,Cloud NAT 也可用于非专用集群,包括 VPC 原生集群和基于路由的集群。由于非专用集群中的节点具有外部 IP 地址,因此从该节点的主要内部 IP 地址发送的数据包绝不会被 Cloud NAT 处理。但是,如果出现以下情况,Cloud NAT 网关则可以处理从非专用集群中的 Pod 发送的数据包:

  • 对于 VPC 原生集群,Cloud NAT 网关被配置为应用到集群的 Pod 的次要 IP 地址范围。

  • 集群的 IP 伪装配置未配置为针对从 Pod 发送到互联网的数据包在集群内执行 SNAT。

Cloud Load Balancing 交互

Google Cloud 外部负载平衡器和运行状况检查系统使用特殊路由与虚拟机进行通信。后端虚拟机不需要外部 IP 地址,Cloud NAT 网关也不负责管理负载平衡器和运行状况检查的通信。如需了解详情,请参阅 Cloud Load Balancing 概览运行状况检查概览

示例

以下示例说明了 Cloud NAT 概念。

基本 NAT 配置

Cloud NAT(点击可放大)。
Cloud NAT(点击可放大)

在此示例中:

  • nat-gw-us-east 网关已配置为应用到 us-east1 地区中 subnet-1 的主要 IP 地址范围。如果虚拟机的网络接口没有外部 IP 地址,则该虚拟机可以使用其主要内部 IP 地址或 subnet-1 的主要 IP 地址范围 10.240.0.0/16 内的别名 IP 范围向互联网发送流量。

  • 如果虚拟机的网络接口没有外部 IP 地址,并且主要内部 IP 地址位于 subnet-2,则它无法访问互联网,因为没有 Cloud NAT 网关适用于该子网的任何 IP 地址范围。

  • nat-gw-eu 网关已配置为应用到 europe-west1 地区中 subnet-3 的主要 IP 地址范围。如果虚拟机的网络接口没有外部 IP 地址,则该虚拟机可以使用其主要内部 IP 地址或 subnet-3 的主要 IP 地址范围 192.168.1.0/24 内的别名 IP 范围向互联网发送流量。

GKE 示例

对 GKE 进行 Cloud NAT(点击可放大)。
对 GKE 进行 Cloud NAT(点击可放大)

在此例中,您希望对容器进行 NAT 转换。如需为所有容器和 GKE 节点启用 NAT,您必须选择子网 1 的所有 IP 范围作为 NAT 候选项。不要仅对 container1container2 启用 NAT。

后续步骤