使用路由

本页面介绍如何创建和管理 Google Cloud VPC 网络的路由。本页面假定您熟悉路由概览中介绍的不同类型的 Google Cloud 路由及其特性。

每个新网络都具有两种由系统生成的路由:默认路由(您可以将其移除或替换);以及子网路由(每个子网具有一个对应的子网路由)。除非删除相应的子网本身,否则无法移除子网路由。

除了由系统生成的路由外,您还可以创建其他自定义静态路由

检查路由

列出 VPC 网络的路由

您可以使用以下任一方法查看路由:

Console

要列出所有网络的路由,请执行以下操作:

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 您可以使用过滤路由文本框来限制显示的路由。 例如,您可以输入 VPC 网络的名称,然后按 Enter 键,以显示特定网络的路由。
  3. 全部标签页显示所有路由类型。如果仅查看自定义动态路由,请点击动态标签页。

gcloud

如需列出默认路由子网路由自定义静态路由,请使用以下 gcloud 命令,需将 NETWORK_NAME 替换为您的网络名称:

gcloud compute routes list --filter="network=NETWORK_NAME"

gcloud compute routes list 不会显示自定义动态路由。如需查看动态路由,您必须查询知悉该路由的 Cloud Router 路由器的状态。请使用以下命令作为模板,需将 CLOUD_ROUTER_NAME 替换为 Cloud Router 的名称,并将 REGION 替换为其地区:

gcloud compute routers get-status CLOUD_ROUTER_NAME \
    --region=REGION \
    --format="flattened(result.bestRoutes)"

API

在您的 VPC 网络中列出默认路由子网路由自定义静态路由

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes?filter=network="NETWORK_URL

请将占位符替换为有效值:

  • PROJECT_ID 是您的 VPC 网络所在项目的 ID。
  • NETWORK_URL 是包含所要列出路由的 VPC 网络的网址。

如需了解详情,请参阅 routes.list 方法。

列表路由 API 不会显示自定义动态路由。如需查看动态路由,您必须查询知悉该路由的 Cloud Router 路由器的状态。如需了解详情,请参阅 Cloud Router 文档

描述路由

如需查看系统生成的路由和自定义静态路由(包括目标和下一个跃点)的详细信息,请执行以下操作:

Console

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 点击某个路由的名称。

gcloud

如需查看系统生成的路由和自定义静态路由的详细信息,请使用以下 gcloud 命令,需将 ROUTE_NAME 替换为要检查的路由的名称:

gcloud compute routes describe ROUTE_NAME --format="flattened()"

API

描述系统生成的路由或自定义静态路由以查看其详细信息。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes/ROUTE_NAME

请将占位符替换为有效值:

  • PROJECT_ID 是您的路由所在项目的 ID。
  • ROUTE_NAME 是要描述的路由的名称。

如需了解详情,请参阅 routes.get 方法。

虚拟机路由

您可以按照本部分中的说明,来查看虚拟机实例的给定网络接口的适用路由和有效路由。有效路由是考虑路由顺序的适用路由的子集。

网络接口的适用路由

您可以使用 Cloud Console 来查看虚拟机网络接口的适用路由。这种查看方式会将可用于出站流量的路由的列表缩小到一定的范围。

如需查看虚拟机的特定网络接口的适用路由,请执行以下操作:

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 在列表中找到虚拟机实例。在更多操作菜单 () 中,选择查看网络详情
  3. 如果某个实例具有多个网络接口,请在网络接口详情部分中选择要查看的网络接口。
  4. 点击路由标签,以查看适用于该网络接口的所有路由(按路由名称排序)。

路由分析和有效路由

路由分析可帮助您确定有效路由,这种分析会将适用的路由和路由顺序纳入考虑范围。路由会按目标 IP 范围列出,因此您可以确定使用哪种适用的路由将流量发送到给定目标范围。

例如,一个网络接口可能会使用多个适用的路由。如需了解详细信息,请参阅路由概览中的路由顺序

如需按路由适用性和路由顺序查看路由,请使用路由分析:

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面并找到要查看的实例。
    转到“虚拟机实例”页面
  2. 在该实例的更多操作菜单 () 中,选择查看网络详情
  3. 如果某个实例具有多个网络接口,请在网络接口详情部分中选择要查看的网络接口。
  4. 网络分析部分,选择路由分析标签。
  5. 查看出现的表(按照从最具体的 IP 地址范围到最宽泛的 IP 地址范围的顺序排列),以确定适用于给定目标范围的路由。

路由分析标签的示例输出如下:

虚拟机实例的有效路由(点击可放大)
虚拟机实例的有效路由(点击可放大)

添加和移除路由

添加静态路由

请按照以下步骤创建新的静态路由。在创建之前,请确保您熟悉以下内容:

  • 自定义静态路由的目标范围和 VPC 网络中任何子网路由的目标范围都不能相同,而且前者不能比后者更具体。

    • 使用 VPC 网络对等互连来连接两个 VPC 网络时,一个网络中的自定义静态路由的目标和两个网络中任何子网路由的目标都不能相同,而且前者不能比后者更具体。Google Cloud 会拒绝在这方面与子网路由相冲突的自定义静态路由。
  • 为避免在使用自动模式网络时发生冲突,请不要创建目标在 10.128.0.0/9 范围内的静态路由。如需了解详情,请查看为自动模式网络保留的 IP 范围

  • 自定义静态路由的目标不能与任何内部分配的范围重叠。

  • 在创建将虚拟机用作下一跃点的自定义静态路由之前,请确保您熟悉充当下一个跃点的实例。如果选择下一个跃点实例,Google Cloud 仅验证在创建路由时虚拟机是否存在。

  • 如果您使用网络标记创建路由,则只有具有该标记的虚拟机才会接收该路由。但是,已标记的 VM 仍会接收所有没有网络标记的路由。

Console

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 点击创建路由
  3. 指定该路由的名称说明
  4. 选择将应用该路由的现有网络
  5. 指定目标 IP 范围以定义该路由的目标。
  6. 指定该路由的优先级。只有在多个路由具有等效目标时,才会使用优先级来确定路由顺序。 如需了解详情,请参阅静态路由参数
  7. 如需使该路由仅适用于具有匹配网络标记的部分实例,请在实例标记字段中指定标记。将该字段留空以使路由适用于网络中的所有实例,或选择内部 TCP/UDP 负载平衡器作为路由的下一个跃点。网络标记不适用于将内部 TCP/UDP 负载平衡器作为下一个跃点的路由。
  8. 为该路由选择下一个跃点

    • 默认互联网网关可创建通向互联网的路由。
    • 指定实例允许您按名称选择实例。 流量将路由到该实例(或同一区域中同名的任何替换实例),即使该实例的 IP 地址发生更改也是如此。
    • 指定 IP 地址允许您输入 VPC 网络中现有实例的 IP 地址。如需了解有效的下一个跃点 IP 地址的重要限制,请参阅静态路由的下一个跃点
    • 指定 VPN 隧道允许您选择现有的 Cloud VPN 隧道作为下一个跃点。隧道必须使用基于政策的路由,或者必须是基于路由的 VPN
    • 指定内部 TCP/UDP 负载平衡器的转发规则会显示一个文本框,允许您将现有的内部 TCP/UDP 负载平衡器指定为下一个跃点。

    如需详细了解不同类型的下一个跃点,请参阅“路由概览”中的静态路由的下一个跃点

  9. 点击创建

gcloud

使用以下 gcloud 命令创建新的自定义静态路由:

gcloud compute routes create ROUTE_NAME \
    --destination-range=DEST_RANGE \
    --network=NETWORK \
    NEXT_HOP_SPECIFICATION

请将占位符替换为有效值:

  • ROUTE_NAME 是该路由的名称。
  • DESTINATION_RANGE 表示该路由适用的目标 IP 地址。最宽泛的目标是 0.0.0.0/0
  • NETWORK 是包含该路由的 VPC 网络的名称。
  • NEXT_HOP_SPECIFICATION 表示自定义静态路由的下一个跃点。您必须将下面其中一项指定为下一个跃点。如需详细了解不同类型的下一个跃点,请参阅“路由概览”中的静态路由的下一个跃点
    • --next-hop-gateway=default-internet-gateway:通过此类型的下一个跃点,可将流量发送到 VPC 网络之外,包括发送到互联网或专用 Google 访问通道的 IP 地址。
    • --next-hop-instance=INSTANCE_NAME--next-hop-instance-zone=ZONE:通过此类型的下一个跃点,可按名称和区域将流量定向到现有虚拟机实例。流量将被发送到与路由位于同一网络中的虚拟机网络接口的主要内部 IP 地址。
    • --next-hop-address=ADDRESS:通过此类型的下一个跃点,可将流量定向到现有虚拟机实例的 IP 地址。
    • --next-hop-ilb=FORWARDING_RULE_NAME--next-hop-ilb-region=REGION:将此类型的下一个跃点与内部 TCP 负载平衡配合使用,可将流量分配到由内部转发规则名称和区域指定的负载平衡器。负载平衡器通过线缆串接设备的方式在运行状况良好的后端(在这些后端,负载平衡器对客户端透明)之间分配流量。
    • --next-hop-vpn-tunnel=VPN_TUNNEL_NAME--next-hop-vpn-tunnel-region=REGION:通过此类型的下一个跃点,可将流量定向到使用静态路由的 Cloud VPN 隧道。

如需详细了解不同类型的下一个跃点,请参阅“路由概览”中的静态路由的下一个跃点

如需使自定义静态路由仅适用于精选虚拟机(按网络标记),请添加 --tags 标志并指定一个或多个网络标记。如需详细了解网络标记与自定义静态路由如何协同工作,请参阅“路由概览”中的适用路由。您可以将标记用于任何自定义静态路由,但下一个跃点规范为 --next-hop-ilb 的路由除外。

如需详细了解 gcloud 语法,请参阅 SDK 文档

API

创建一个新的自定义静态路由。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes
{
  "destRange": "DESTINATION_RANGE",
  "name": "ROUTE_NAME",
  "network": "NETWORK_NAME",
  "priority": PRIORITY,
  "NEXT_HOP_SPECIFICATION": VALUE
}

请将占位符替换为有效值:

  • PROJECT_ID 是创建您的路由所在项目的 ID。
  • DESTINATION_RANGE 表示该路由适用的目标 IP 地址。最宽泛的目标是 0.0.0.0/0
  • ROUTE_NAME 是路由的名称。
  • NETWORK_NAME 是包含该路由的 VPC 网络的名称。
  • NEXT_HOP_SPECIFICATIONVALUE 表示自定义静态路由的下一个跃点。对于 NEXT_HOP_SPECIFICATION,您必须仅指定以下下一个跃点字段中的一个:nextHopIpnextHopGatewaynextHopInstancenextHopIlbnextHopVpnTunnel。如需详细了解不同类型的下一个跃点,请参阅“路由概览”中的静态路由的下一个跃点

如需了解详情,请参阅 routes.insert 方法。

删除路由

您可以删除由系统生成的默认路由或任何自定义静态路由。对于其他类型的路由:

  • 除非删除相应的子网,否则不能删除子网路由

  • 要删除 Cloud Router 获悉的动态路由,您需要配置其 BGP 对等路由器以停止路由通告。

Console

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 选中要删除的规则旁边的复选框。
  3. 点击删除
  4. 再次点击删除进行确认。

gcloud

使用以下 gcloud 命令删除自定义静态路由,需将 ROUTE_NAME 替换为要移除的路由的名称:

gcloud compute routes delete ROUTE_NAME

API

删除自定义静态路由以将其从您的 VPC 网络中移除。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/routes/ROUTE_NAME

请将占位符替换为有效值:

  • PROJECT_ID 是您的路由所在项目的 ID。
  • ROUTE_NAME 是要删除的路由的名称。

如需了解详情,请参阅 routes.delete 方法。

操作顺序

在您发出添加或删除路由的请求时,您的更改将被暂存,然后以最终一致的方式传播到网络中的各个实例。如果更改请求的状态为 PENDINGRUNNING,则表示该请求尚未处理。处理完毕后,更改请求的状态为 DONE

如果您发出一系列更改请求,则更改可能按任何顺序应用。您提交更改请求的顺序不一定就是服务处理请求的顺序。此外,不同实例可能会在不同时间实施这些更改。

为实例启用 IP 转发

默认情况下,Google Cloud 会对数据包执行严格的来源和目标检查,以便:

  • 只有在数据包的来源与网络中某个实例接口的内部 IP 地址相匹配时,该虚拟机实例才能发送数据包。
  • 只有在数据包的目标与网络中某个实例接口的 IP 地址相匹配时,数据包才会传送给该实例。

因此,默认情况下,虚拟机无法转发由另一个虚拟机发出的数据包。

如需将某个虚拟机用作路由的下一个跃点,该虚拟机需要接收目标并非该虚拟机自身的数据包。由于虚拟机要转发这些数据包,所以数据包的来源不同于该虚拟机自己的内部 IP。为了实现此目标,您必须为虚拟机启用 IP 转发。启用 IP 转发后,Google Cloud 不会强制执行数据包来源和目标检查。

Console

  1. 转到“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 点击管理、磁盘、网络、SSH 密钥
  4. 点击网络
  5. 点击修改按钮以选择网络接口。
  6. 对于网络接口,从 IP 转发菜单中选择开启
  7. 指定任何其他实例参数。
  8. 点击创建

gcloud

使用 gcloud 创建实例时,请在命令中添加 --can-ip-forward 标志:

gcloud compute instances create ... --can-ip-forward

API

创建实例时,请使用 canIpForward 字段启用 IP 转发。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "canIpForward": true,
  ...other fields
}

请将占位符替换为有效值:

  • PROJECT_ID 是将创建实例的项目的 ID。
  • ZONE 是将在其中创建实例的 Google Cloud 区域。

如需了解详情,请参阅 instances.insert 方法。

后续步骤

  • 要了解路由,请参阅路由概览
  • 如需了解 Google Cloud VPC 网络,请参阅 VPC 概览
  • 请参阅使用 VPC,了解如何创建和修改 VPC 网络。