将高可用性 VPN 连接到 Compute Engine 虚拟机

本页面介绍如何将高可用性 VPN 网关连接到 Google Cloud 中托管的具有外部 IP 地址的 Compute Engine 虚拟机 (VM) 实例。

这些说明创建以下高可用性 VPN 资源:

  • 一个高可用性 VPN 网关
  • 一个对等 VPN 网关
  • 从对等 VPN 网关到每个虚拟机实例的一对 VPN 隧道,用于确保高可用性

如需详细了解 Cloud VPN,请参阅以下资源:

准备工作

  • 查看 Google Cloud 中动态路由的工作原理。

  • 确保您的对等 VPN 网关支持边界网关协议 (BGP)。

  • 确保您有一个或两个具有外部 IP 地址的 Compute Engine 虚拟机。

在 Google Cloud 中设置以下各项,以更轻松地配置 Cloud VPN:

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  1. 如果您使用的是 Google Cloud CLI,请使用以下命令设置项目 ID。此页面上的 gcloud 说明假设您在发出命令前已设置了项目 ID。

    gcloud config set project PROJECT_ID
    
  1. 您还可以通过运行以下命令来查看已设置的项目 ID:

    gcloud config list --format='text(core.project)'
    

创建自定义 VPC 网络和子网

创建高可用性 VPN 网关和隧道对之前,在高可用性 VPN 网关所在区域创建一个虚拟私有云 (VPC) 网络和至少一个子网:

如需为高可用性 VPN 网关启用 IPv6,您必须在创建 VPC 时启用 IPv6 内部地址的分配。此外,您必须将子网配置为使用 IPv6 内部地址。

您还必须在子网中的虚拟机上配置 IPv6。

VPC 子网必须配置为使用内部 IPv6 地址。 使用 gcloud CLI 时,您可以使用 --ipv6-access-type=INTERNAL 标志配置子网。Cloud Router 路由器不会动态通告配置为使用外部 IPv6 地址 (--ipv6-access-type=EXTERNAL) 的子网的路由。

如需了解如何在 VPC 网络和子网中使用内部 IPv6 范围,请参阅内部 IPv6 规范

本文档中的示例还使用了 VPC 全球动态路由模式,该模式的行为如下:

  • Cloud Router 路由器的所有实例会将其获知的 to on-premises 路由应用于 VPC 网络的所有子网。
  • 指向 VPC 网络中所有子网的路由会与本地路由器共享。

创建连接到 Compute Engine 虚拟机实例的高可用性 VPN 网关和隧道

按照本部分中的说明创建高可用性 VPN 网关、对等 VPN 网关资源、隧道和 BGP 会话。

控制台

如果是首次创建 VPN 连接,请使用 VPN 设置向导。VPN 设置向导包括创建高可用性 VPN 网关、对等 VPN 网关资源、隧道和 BGP 会话所需的所有配置步骤。

创建 Cloud HA VPN 网关

  1. 在 Google Cloud 控制台中,转到 VPN 页面。

    转到 VPN

    1. 如果您是首次创建网关,请点击创建 VPN 连接
    2. 如果您已有 Cloud VPN 资源,请点击 VPN 设置向导
  2. 选择高可用性 (HA) VPN

  3. 点击继续

  4. 指定 VPN 网关名称

  5. 网络列表中,选择现有网络或默认网络。

  6. 区域列表中,选择 Compute Engine 虚拟机所在的区域。

  7. 为 VPN 网关选择栈类型:IPv4(单栈)IPv4 和 IPv6(双栈)

  8. 点击创建并继续

控制台页面会显示网关信息。系统会自动为每个网关接口分配两个外部 IP 地址。请记下您网关配置的详细信息,以供后续配置步骤使用。

添加 VPN 隧道

  1. 对等 VPN 网关列表中,选择具有外部 IP 地址的 Compute Engine 虚拟机
  2. 对等 VPN 网关名称列表中,选择现有的对等网关,或点击创建新的对等 VPN 网关

    如果选择现有对等网关,Google Cloud 控制台会根据您在对等网关上配置的对等接口数来选择要配置的隧道数。

    如需创建对等网关,请完成以下步骤:

    1. 为对等 VPN 网关指定名称。
    2. 对等 VPN 网关接口部分中,选择一个或两个接口。您可以将一对隧道连接到每个 Compute Engine 虚拟机实例。如需查看此拓扑的示例,请参阅高可用性 VPN 拓扑
    3. 在每个对等 VPN 接口的字段中,指定用于该接口的外部 IP 地址。

    Cloud Router 路由器列表中,选择一个 Cloud Router 路由器或通过指定以下选项创建路由器。

    1. 要创建新的 Cloud Router 路由器,请指定以下内容:
    2. 名称
    3. 可选的说明
    4. 新路由器的 Google ASN

    您可以使用未在网络中其他位置使用的任何专用 ASN(645126553442000000004294967294)。Google ASN 用于同一个 Cloud Router 路由器上的所有 BGP 会话,且以后不能更改 ASN。

    1. 如需创建路由器,请点击创建

    VPN 隧道部分,展开每个项,填写已创建的 VPN 隧道的详细信息。

    1. 关联的对等 VPN 网关接口部分中,选择要与此隧道以及高可用性 VPN 接口关联的对等 VPN 网关接口和 IP 地址组合。此接口必须与您的实际对等路由器上的接口匹配。
    2. 指定隧道的名称
    3. 指定可选的说明
    4. 指定 IKE 版本。如果您的对等路由器支持 IKEv2,则建议使用此默认设置。如需允许 IPv6 流量,您必须选择 IKEv2。
    5. 使用预共享密钥(共享密钥)指定 IKE 预共享密钥,该密钥必须与您在对等网关上创建的合作伙伴隧道的预共享密钥相对应。如果您尚未在对等 VPN 网关上配置预共享密钥并希望生成预共享密钥,请点击生成并复制。请确保将预共享密钥记录在安全位置,因为在创建 VPN 隧道后将无法检索该密钥。
    6. 点击完成
    7. 创建 VPN 页面上,为其余的隧道对话框重复隧道创建步骤。
  3. 配置完所有隧道后,点击创建并继续

配置 BGP 会话

  1. 点击配置 BGP 会话,以在 Cloud Router 路由器上设置 BGP 会话。如需了解如何创建 BGP 会话,请参阅创建 BGP 会话
  2. 点击保存 BGP 配置

控制台页面会刷新,并显示高可用性 VPN 网关、对等 VPN 网关和 Cloud VPN 隧道信息。

gcloud

创建高可用性 VPN 网关

如需创建高可用性 VPN 网关,请运行以下命令。创建网关后,系统会自动分配两个外部 IPv4 地址,每个地址对应一个网关接口。

gcloud compute vpn-gateways create GW_NAME \
    --network=NETWORK \
    --region=REGION \
    [--stack-type=IP_STACK]

请替换以下内容:

  • GW_NAME:网关的名称
  • NETWORK:Google Cloud 网络的名称
  • REGION:创建网关和隧道的 Google Cloud 区域
  • IP_STACK(可选):要使用的 IP 栈。指定 IPV4_ONLYIPV4_IPV6。 如果未指定此标志,则默认栈类型为 IPV4_ONLY

您创建的网关如以下示例输出所示。系统会自动为每个网关接口分配一个外部 IPv4 地址:

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnGateways/ha-vpn-gw-a].
NAME          INTERFACE0     INTERFACE1     NETWORK     REGION
ha-vpn-gw-a   203.0.113.16   203.0.113.23   network-a   us-central1

创建对等 VPN 网关资源

根据高可用性需求,您可以创建一个或一对对等 VPN 网关资源。

如需创建第一个对等 VPN 网关,请运行以下命令:

 gcloud compute external-vpn-gateways create PEER_GW_NAME1 \
     --interfaces 0=PEER_GW_IP_0,1=PEER_GW_IP_1

如需创建第二个对等 VPN 网关,请运行以下命令:

gcloud compute external-vpn-gateways create PEER_GW_NAME2 \
    --interfaces 0=PEER_GW_IP_1,1=PEER_GW_IP_0

替换以下内容:

  • PEER_GW_NAME1:代表第一个对等 VPN 网关的名称
  • PEER_GW_NAME2:代表第二个对等 VPN 网关的名称
  • PEER_GW_IP_1:第一个 Compute Engine 虚拟机的外部 IP 地址
  • PEER_GW_IP_0:第二个 Compute Engine 虚拟机的外部 IP 地址

您创建的对等 VPN 网关资源如以下示例所示,PEER_GW_IP_0PEER_GW_IP_1 显示了 Compute Engine 虚拟机的外部 IP 地址:

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/externalVpnGateways/peer-gw].
NAME          INTERFACE0     INTERFACE1
peer-gw-1   203.0.113.16   203.0.113.23
Peer-gw-2   203.0.113.23   203.0.113.16

创建 Cloud Router

要创建 Cloud Router 路由器,请运行以下命令:

gcloud compute routers create ROUTER_NAME \
    --region=REGION \
    --network=NETWORK \
    --asn=GOOGLE_ASN

请替换以下内容:

  • ROUTER_NAME:Cloud VPN 网关所在区域中的 Cloud Router 路由器的名称
  • REGION:您在其中创建网关和隧道的 Google Cloud 区域
  • NETWORK:Google Cloud 网络的名称
  • GOOGLE_ASN:您尚未在对等网络中使用的任何专用 ASN(645126553442000000004294967294);Google ASN 将用于同一个 Cloud Router 路由器上的所有 BGP 会话,且以后无法更改

输出类似于以下内容:

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/routers/router-a].
NAME       REGION        NETWORK
router-a   us-central1   network-a

添加 VPN 隧道

创建四个 VPN 隧道,高可用性 VPN 网关上的每个接口使用两个隧道。创建 VPN 隧道时,请将 VPN 隧道的对等端指定为您之前创建的外部 VPN 网关。

一个 VPN 隧道必须连接到外部 VPN 网关的 interface 0,另一个 VPN 隧道必须连接到外部 VPN 网关的 interface 1

gcloud compute vpn-tunnels create TUNNEL_NAME_IF0 \
    --peer-external-gateway=PEER_GW_NAME1 \
    --peer-external-gateway-interface=PEER_EXT_GW_IF0 \
    --region=REGION \
    --ike-version=IKE_VERS \
    --shared-secret=SHARED_SECRET \
    --router=ROUTER_NAME \
    --vpn-gateway=GW_NAME \
    --interface=INT_NUM_0
gcloud compute vpn-tunnels create TUNNEL_NAME_IF1 \
    --peer-external-gateway=PEER_GW_NAME1 \
    --peer-external-gateway-interface=PEER_EXT_GW_IF1 \
    --region=REGION \
    --ike-version=IKE_VERS \
    --shared-secret=SHARED_SECRET \
    --router=ROUTER_NAME \
    --vpn-gateway=GW_NAME \
    --interface=INT_NUM_1
gcloud compute vpn-tunnels create TUNNEL_NAME_IF2 \
    --peer-external-gateway=PEER_GW_NAME2 \
    --peer-external-gateway-interface=PEER_EXT_GW_IF0 \
    --region=REGION \
    --ike-version=IKE_VERS \
    --shared-secret=SHARED_SECRET \
    --router=ROUTER_NAME \
    --vpn-gateway=GW_NAME \
    --interface=INT_NUM_1
gcloud compute vpn-tunnels create TUNNEL_NAME_IF3 \
    --peer-external-gateway=PEER_GW_NAME2 \
    --peer-external-gateway-interface=PEER_EXT_GW_IF1 \
    --region=REGION \
    --ike-version=IKE_VERS \
    --shared-secret=SHARED_SECRET \
    --router=ROUTER_NAME \
    --vpn-gateway=GW_NAME \
    --interface=INT_NUM_1

替换以下内容:

  • TUNNEL_NAME_IF0TUNNEL_NAME_IF1TUNNEL_NAME_IF2TUNNEL_NAME_IF3:隧道的名称;通过添加网关接口名称来为隧道命名有助于以后识别隧道
  • PEER_GW_NAME:之前创建的外部对等网关的名称
  • PEER_EXT_GW_IF0PEER_EXT_GW_IF1:之前在外部对等网关上配置的接口号
  • IKE_VERS1 用于 IKEv1 或 2 用于 IKEv2;如果可能,对于 IKE 版本,请使用 IKEv2。如果您的对等网关需要 IKEv1,请将 --ike-version 2 替换为 --ike-version 1。如需允许 IPv6 流量,您必须指定 IKEv2。
  • SHARED_SECRET:您的预共享密钥(共享密钥),必须与您在对等网关上创建的合作伙伴隧道的预共享密钥相对应;如需查看建议,请参阅生成强预共享密钥
  • GW_NAME:高可用性 VPN 网关的名称
  • INT_NUM_0:您之前创建的高可用性 VPN 网关上第一个接口的编号 0
  • INT_NUM_1:您之前创建的高可用性 VPN 网关上第二个接口的编号 1
  • 可选:--vpn-gateway-region 是运行高可用性 VPN 网关的区域。其值应与 --region 相同。如果未指定,则系统会自动设置此选项。该选项会替换此命令调用中的默认计算/区域属性值。

    命令输出如以下示例所示:

    Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnTunnels/tunnel-a-to-on-prem-if-0].
    NAME                       REGION        GATEWAY       VPN_INTERFACE   PEER_GATEWAY  PEER_INTERFACE
    tunnel-a-to-on-prem-if-0   us-central1   ha-vpn-gw-a   0               peer-gw       0
    
    Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnTunnels/tunnel-a-to-on-prem-if-1].
    NAME                       REGION        GATEWAY       VPN_INTERFACE   PEER_GATEWAY  PEER_INTERFACE
    tunnel-a-to-on-prem-if-1   us-central1   ha-vpn-gw-a   1               peer-gw       1
    
    Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnTunnels/tunnel-a-to-on-prem-if-0].
    NAME                       REGION        GATEWAY       VPN_INTERFACE   PEER_GATEWAY  PEER_INTERFACE
    tunnel-a-to-on-prem-if-2   us-central1   ha-vpn-gw-b   0               peer-gw       0
    
    Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnTunnels/tunnel-a-to-on-prem-if-1].
    NAME                       REGION        GATEWAY       VPN_INTERFACE   PEER_GATEWAY  PEER_INTERFACE
    tunnel-a-to-on-prem-if-3   us-central1   ha-vpn-gw-b   1               peer-gw       1
    

配置 BGP 会话

如需了解如何创建 BGP 会话,请参阅创建 BGP 会话

API

创建 Cloud HA VPN 网关

如需创建高可用性 VPN 网关,请使用 vpnGateways.insert 方法发出 POST 请求:

   POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/vpnGateways
   {
     "name": "ha-vpn-gw-a",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/network-a",
     "stackType": "IPV4_IPV6"
   }

stackType 字段为可选字段。有效值为 IPV4_IPV6IPV4_ONLY。如果未指定 stackType,则默认为 IPV4_ONLY

创建对等 VPN 网关资源

如需创建外部 VPN 网关资源,请使用 externalVpnGateways.insert 方法发出 POST 请求。

     POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/externalVpnGateways
     {
       "name": "my-peer-gateway",
       "interfaces": [
         {
           "id": 0,
           "ipAddress": "192.0.2.1"
         },
         {
           "id": 1,
           "ipAddress": "192.0.2.2"
         }
         {
           "id": 1,
           "ipAddress": "192.0.2.2"
         },
         {
           "id": 0,
           "ipAddress": "192.0.2.1"
         }
       ],
       "redundancyType": "FOUR_IPS_REDUNDANCY"
     }
 

如需创建具有两个接口的对等 VPN 网关,或创建两个具有一个接口的外部 VPN 网关,请使用 TWO_IPS_REDUNDANCY 设置。如需创建具有四个接口的对等 VPN 网关,请指定四个接口 ID 和 ipAddress,并将 redundancyType 指定为 FOUR_IPS_REDUNDANCY

创建 Cloud Router

如需创建 Cloud Router 路由器,请使用 routers.insert 方法发出 POST 请求:

 POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/routers
 {
   "name": "router-a",
   "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/network-a"
 }

添加 VPN 隧道

如需创建四个 VPN 隧道(高可用性 VPN 网关上的每个接口使用两个),请使用 vpnTunnels.insert 方法发出 POST 请求。为获得服务等级协议 (SLA) 承诺的 99.9% 正常运行时间,您必须在高可用性 VPN 网关的每个接口上创建一个隧道。

  1. 如需创建第一个隧道,请运行以下命令:

       POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/vpnTunnels
       {
         "name": "ha-vpn-gw-a-tunnel-0",
         "ikeVersion": 2,
         "peerExternalGateway": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/externalVpnGateways/my-peer-gateway",
         "peerExternalGatewayInterface": 0,
         "router": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/routers/router-a",
         "sharedSecret": "SHARED_SECRET",
         "vpnGateway": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/vpnGateways/ha-vpn-gw-a",
         "vpnGatewayInterface": 0
       }
    

    如果您计划在与此隧道关联的 BGP 会话中启用 IPv6,则必须为 ikeVersion 指定 2

  2. 如需创建其他隧道,请重复此命令,但更改以下参数:

    • name
    • peerExternalGatewayInterface
    • sharedSecretsharedSecretHash(如果需要)
    • vpnGatewayInterface:更改为其他高可用性 VPN 网关接口的值 - 在此示例中,请将此值更改为 1

配置 BGP 会话

如需了解如何创建 BGP 会话,请参阅创建 BGP 会话

API

如需为高可用性 VPN 网关创建完整配置,请使用以下部分中的 API 命令。这些部分使用的所有字段值均为示例值。

如需创建高可用性 VPN 网关,请使用 vpnGateways.insert 方法发出 POST 请求:

   POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/vpnGateways
   {
     "name": "ha-vpn-gw-a",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/network-a",
     "stackType": "IPV4_IPV6"
   }

stackType 字段为可选字段。有效值为 IPV4_IPV6IPV4_ONLY。如果未指定 stackType,则默认为 IPV4_ONLY

验证配置

控制台

如要验证配置,请转到摘要和提醒页面:

  1. 此页面的摘要部分列出了高可用性 VPN 网关和对等 VPN 网关配置文件的信息。对于每个 VPN 隧道,您都可以查看 VPN 隧道状态BGP 会话名称BGP 会话状态 以及 MED 值(通告路由的优先级)。
  2. 此页面的提醒部分列出了在 Cloud VPN 和对等 VPN 之间建立完全可正常运行的 VPN 连接所需完成的步骤。
  3. 查看此页面上的信息后,点击确定

gcloud

如需验证 Cloud Router 路由器配置,请按以下步骤操作:

  • 列出 Cloud Router 路由器选择的 BGP IP 地址。如果您向现有 Cloud Router 路由器添加了新接口,则新接口的 BGP IP 地址会使用最高的索引编号列出。使用 BGP IP 地址 peerIpAddress 配置您的对等 VPN 网关:

    gcloud compute routers get-status ROUTER_NAME \
       --region=REGION \
       --format='flattened(result.bgpPeerStatus[].name,
         result.bgpPeerStatus[].ipAddress, result.bgpPeerStatus[].peerIpAddress)'
    

    管理两个 Cloud VPN 隧道(索引 0 和索引 1)的 Cloud Router 路由器的预期输出如以下示例所示,并符合以下条件:

    • GOOGLE_BGP_IP_0 表示 Cloud VPN 网关 interface 0 上隧道的 Cloud Router 路由器接口的 BGP IP 地址;PEER_BGP_IP_0 表示其对等方的 BGP IP 地址。
    • GOOGLE_BGP_IP_1 表示 Cloud VPN 网关 interface 1 上隧道的 Cloud Router 路由器接口的 BGP IP 地址;PEER_BGP_IP_1 表示其对等方的 BGP IP 地址。
      result.bgpPeerStatus[0].ipAddress:      169.254.0.1 GOOGLE_BGP_IP_0
      result.bgpPeerStatus[0].name:           bgp-peer-tunnel-a-to-on-prem-if-0
      result.bgpPeerStatus[0].peerIpAddress:  169.254.0.2 PEER_BGP_IP_0
      result.bgpPeerStatus[1].ipAddress:      169.254.1.1 GOOGLE_BGP_IP_1
      result.bgpPeerStatus[1].name:           bgp-peer-tunnel-a-to-on-prem-if-1
      result.bgpPeerStatus[1].peerIpAddress:  169.254.1.2 PEER_BGP_IP_1
    
  • 您还可以使用以下命令获取 Cloud Router 路由器配置的完整列表:

    gcloud compute routers describe ROUTER_NAME \
       --region=REGION
    

    完整的列表如以下示例所示:

    bgp:
      advertiseMode: DEFAULT
      asn: 65001
    bgpPeers:
    - interfaceName: if-tunnel-a-to-on-prem-if-0
      ipAddress: 169.254.0.1
      name: bgp-peer-tunnel-a-to-on-prem-if-0
      peerAsn: 65002
      peerIpAddress: 169.254.0.2
    - interfaceName: if-tunnel-a-to-on-prem-if-1
      ipAddress: 169.254.1.1
      name: bgp-peer-tunnel-a-to-on-prem-if-1
      peerAsn: 65004
      peerIpAddress: 169.254.1.2
    creationTimestamp: '2018-10-18T11:58:41.704-07:00'
    id: '4726715617198303502'
    interfaces:
    - ipRange: 169.254.0.1/30
      linkedVpnTunnel: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnTunnels/tunnel-a-to-on-prem-if-0
      name: if-tunnel-a-to-on-prem-if-0
    - ipRange: 169.254.1.1/30
      linkedVpnTunnel: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/vpnTunnels/tunnel-a-to-on-prem-if-1
      name: if-tunnel-a-to-on-prem-if-1
      kind: compute#router
      name: router-a
      network: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/network-a
      region: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1
      selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-central1/routers/router-a
    

API

如需验证 Cloud Router 路由器配置,请使用 routers.getRouterStatus 方法发出 GET 请求,并使用空请求正文:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/routers

后续步骤