问题排查

本指南可帮助您解决 Cloud NAT 的常见问题。

常见问题

虚拟机无需 Cloud NAT 即可意外访问互联网

如果您的虚拟机 (VM) 实例或容器实例无需 Cloud NAT 即可访问互联网,但您不想让它们访问互联网,请检查以下问题:

  • 确定虚拟机的网络接口是否具有外部 IP 地址。如果网络接口分配有外部 IP 地址,Google Cloud 会自动对来源与该接口的主内部 IP 地址匹配的数据包执行一对一 NAT。如需了解详情,请参阅 Cloud NAT 规范

    如需确定虚拟机是否具有外部 IP 地址,请参阅为现有实例更改或分配外部 IP 地址

  • 确保您的 Google Kubernetes Engine (GKE) 集群是一个专用集群。非专用集群中的每个节点虚拟机都具有外部 IP 地址,因此每个节点都可以使用 Virtual Private Cloud (VPC) 网络中下一个跃点为默认互联网网关而不依赖 Cloud NAT 的路由。如需了解详情,包括非专用集群如何与 Cloud NAT 网关互动,请参阅 GKE 互动

  • 列出您的 VPC 网络中的路由,查找可通过不同于默认互联网网关的下一个跃点提供互联网连接的路由。例如:

    • 下一个跃点是虚拟机、内部 TCP/UDP 负载平衡器或 Cloud VPN 隧道的自定义静态路由可能会间接提供互联网连接。例如,内部 TCP/UDP 负载平衡器的下一个跃点虚拟机或后端虚拟机本身可能有外部 IP 地址,或者 Cloud VPN 隧道可能连接到提供互联网访问权限的网络。

    • Cloud Router 在您的 VPC 网络中通过本地网络获知的自定义动态路由可能会连接到提供互联网访问权限的网络。

  • 请记住,您的 VPC 网络中的其他自定义路由的优先级可能高于其下一个跃点是默认互联网网关的路由。如需了解 Google Cloud 如何评估路由,请参阅路由适用范围和顺序

不会生成任何日志

某些日志会被排除

  • 验证是否启用了 NAT 日志记录,以及您的日志过滤条件是否未排除要保留的日志。您可以清除日志过滤条件,以免排除任何内容。

  • Cloud NAT 不会记录单个事件。如果出站流量庞大,NAT 日志记录会受限,与虚拟机的机器类型成正比。转换或错误日志可能会被舍弃,并且无法确定在限制期间省略的内容。

丢包的原因是资源不足

如果您看到使用 Cloud NAT 的虚拟机造成的数据包丢失,则可能是因为数据包丢失时没有足够的可用 NAT 源 IP 地址和源端口元组供虚拟机使用(端口耗尽)。五元组(NAT 源 IP 地址、源端口和目标三元组)不能在强制的 120 秒延迟内重用。

如果没有足够的 NAT 元组可用,则 dropped_sent_packets_count 原因OUT_OF_RESOURCES。如需详细了解指标,请参阅使用虚拟机实例指标

如需增加每个虚拟机的端口数,请参阅更改为与 NAT 关联每个虚拟机分配的 NAT 端口的默认数量下限

丢包的原因是端点独立冲突

如果您看到来自使用 Cloud NAT 的虚拟机的丢包,并且已启用端点独立映射,则丢包可能是由端点独立冲突引起的。如果是,则 dropped_sent_packets_count 原因ENDPOINT_INDEPENDENT_CONFLICT。如需详细了解指标,请参阅使用虚拟机实例指标

您可以使用以下方法降低端点独立冲突的可能性:

  • 停用端点独立映射。 这样,来自给定来源 IP 地址和端口的新连接可以使用不同于之前所用的 NAT 来源 IP 地址和端口。 停用或启用端点独立映射不会中断已建立的连接。

  • 提高每个虚拟机实例的 NAT 端口的默认数量下限,以便端口预留过程可以将更多 NAT 来源 IP 地址和端口元组分配给每个客户端虚拟机。这样可以降低为以下两个或更多客户端 IP 地址和临时来源端口元组分配相同的 NAT 来源 IP 地址和来源端口元组的可能性。

  • 将虚拟机实例配置为使用更多临时来源端口:

    • 对于 Linux 虚拟机:

      • 您可使用以下命令查看已配置的端口范围:

        cat /proc/sys/net/ipv4/ip_local_port_range
        
      • 您可以使用以下命令将 ip_local_port_range 设置为临时来源端口数最大值 (64,512):

        echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
        
    • 对于 Windows 虚拟机:

      • 您可使用以下命令查看已配置的端口范围:

        netsh int ipv4 show dynamicport tcp
        netsh int ipv4 show dynamicport udp
        
      • 您可以使用以下命令将临时来源 TCP 和 UDP 端口的数量设置为可能的最大值 (64,512):

        netsh int ipv4 set dynamicport tcp start=1024 num=64512
        netsh int ipv4 set dynamicport udp start=1024 num=64512
        
      • 在 GKE 节点上,您可以使用具有特权的 DaemonSet 自动完成此配置。

  • 对于 GKE 集群,请对发送到相关目标的数据包停用在每个节点上执行的来源 NAT。您可以使用以下两种方式之一来执行此操作:

需要分配更多 IP 地址

如果实例无法访问互联网,并且您手动分配 IP 地址,则可能需要添加更多 IP 地址。

如果您在 Cloud Console 中看到“要允许所有实例访问互联网,您至少需要再分配 x 个 IP 地址”这一消息,则需要分配更多 IP 地址。如需了解详情,请参阅 NAT IP 地址

您可以通过对消息 nat_allocation_failed 定义提醒政策来监控此问题。

常见问题解答

Cloud NAT 的地区限制

我可以在多个地区中使用同一个 Cloud NAT 网关吗?

不可以。Cloud NAT 网关不能与多个区域、VPC 网络或 Cloud Router 路由器相关联。

如果您需要为其他区域或 VPC 网络提供连接,请为其创建其他 Cloud NAT 网关。

我可以在单个区域中使用多个 Cloud NAT 网关吗?

可以。如果满足以下任一条件,您可以在 VPC 网络的同一个区域中使用多个 Cloud NAT 网关:

  • 每个网关均针对不同的子网进行配置。

  • 在单个子网中,每个网关均针对不同的 IP 地址范围进行配置。

使用自定义 NAT 映射将 NAT 网关映射到特定子网或 IP 地址范围。

如需了解详情,请参阅子网 IP 地址范围适用性

Cloud NAT 网关使用的外部 NAT IP 地址是全球性还是地区性的?

Cloud NAT 网关使用地区性外部 IP 地址作为 NAT IP 地址。即使是地区性的,它们也可公开路由。如需了解可以分配 NAT IP 地址的不同方式,请参阅 NAT IP 地址

当 Cloud NAT 能够使用和不能使用时

Cloud NAT 是否会应用于 GKE 节点虚拟机等具有外部 IP 地址的实例?

通常不会。如果虚拟机的网络接口具有外部 IP 地址,则 Google Cloud 始终对从网络接口的主要内部 IP 地址发送的数据包执行 1 对 1 NAT,而不使用 Cloud NAT。但是,Cloud NAT 仍然可以为通过同一网络接口的别名 IP 地址范围发送的数据包提供 NAT 服务。如需了解更多详情,请参阅 Cloud NAT 规范GKE 互动

我可以使用 Cloud NAT 在 VPC 网络中的虚拟机之间通信吗?

不可以,Cloud NAT 只能连接到互联网。

我是否可以使用 Cloud NAT 将 VPC 网络连接到其他网络以解决 IP 地址重叠问题?

否,Cloud NAT 无法应用于下一个跃点不是默认互联网网关的任何自定义路由。例如,Cloud NAT 无法应用于发送到下一个跃点 Cloud VPN 隧道的流量,即使目标位置是可公开路由的 IP 地址也是如此。

Cloud NAT 是否允许其网络接口缺少外部 IP 地址的来源虚拟机向具有外部 IP 地址的目标虚拟机或负载平衡器发送流量,即使来源和目标位于同一个 VPC 网络中?

是。网络路径涉及通过默认互联网网关将流量从 VPC 网络发出,然后在同一网络中接收。

当源虚拟机将数据包发送到目标位置时,Cloud NAT 会在将数据包传送到第二个实例之前执行源 NAT (SNAT)。 Cloud NAT 会对从第二个实例到第一个实例的响应执行目标 NAT (DNAT)。如需查看分步说明示例,请参阅 NAT 流

不支持垃圾传入连接

Cloud NAT 是否允许入站连接(例如 SSH)到没有外部 IP 地址的实例?

否,Cloud NAT 不支持垃圾传入连接。如需了解详情,请参阅 Cloud NAT 规范

如果您需要连接到没有外部 IP 地址的虚拟机,请参阅连接到没有外部 IP 地址的实例。例如,在 Cloud NAT 示例 Compute Engine 设置过程中,您使用 Identity-Aware Proxy 连接到没有外部 IP 地址的虚拟机。

Cloud NAT 和端口

为什么虚拟机拥有固定数量的端口(默认为 64 个)?

Cloud NAT 网关为虚拟机提供 NAT 时,它会根据端口预留程序预留源地址和源端口元组。

如需了解详情,请参阅端口预留示例

我可以更改为虚拟机预留的端口数下限吗?

可以。您可以在创建新的 Cloud NAT 网关时提高或降低每台虚拟机的端口数下限,也可以稍后通过修改此下限来实现此目的。每个 Cloud NAT 网关都会根据端口预留程序预留源地址和源端口元组。

如需详细了解如何降低端口数下限,请参阅下一个问题

创建 Cloud NAT 网关后,我可以减少每台虚拟机的最小端口数吗?

可以;不过,降低最小端口数可能会导致端口预留程序为每台虚拟机预留更少的端口数。发生这种情况时,现有的 TCP 连接可能会被重置,并且必须重新建立连接。

将 NAT 映射从主要和次要范围切换到仅主要范围时,分配给每个实例的其他端口是否会立即释放?

不会。次要范围使用的其他任何端口会由实例保留,直到每个虚拟机的端口数下限设置值减小。当 Cloud NAT 配置为映射子网的次要(别名)范围时,Cloud NAT 会根据端口预留过程为每个实例至少分配 1024 个端口。

通过切换到仅主要范围,Cloud NAT 会保留已分配这些端口的实例的其他已分配端口。更改 Cloud NAT 仅应用于主要范围的范围后,分配给这些实例的实际端口数不会更改,直到每个虚拟机的端口数下限设置值也减小。

如需减小分配给这些实例的端口数量,请在切换到主要范围后,必须减小每个虚拟机的端口数下限设置值。减小该值之后,Cloud NAT 会自动下调每个实例分配的端口数量,从而减少端口消耗。

Cloud NAT 和其他 Google 服务

能否通过 Cloud NAT 访问 Google API 和服务?

当您为子网的主要 IP 范围启用 Cloud NAT 时,Google Cloud 会自动启用专用 Google 访问通道。如需了解详情,请参阅专用 Google 访问通道互动

后续步骤