构建高吞吐量 VPN

本教程介绍了如何创建高吞吐量的安全 VPN 并测试其速度。

目前,一项常见但关键的需求是在 Google Cloud 与其他云端或本地系统之间进行安全通信。幸运的是,Google Cloud 可帮助您轻松创建安全的互联网安全协议 (IPsec) 虚拟专用网 (VPN) 来实现此目标。如果单个隧道不足以提供所需的吞吐量,Google Cloud 可通过跨多个隧道顺畅分配流量来提供额外的带宽。

目标

创建 VPN

  • 创建和配置适用于 VPN 的 Google Cloud 项目。
  • 创建一个名为 cloud 的 Virtual Private Cloud (VPC) 和一个名为 on-prem(本地)的 VPC,前者用来模拟您的 Google Cloud 网络,后者用来模拟外部网络。
  • cloud VPC 创建 VPN 网关、转发规则和地址。
  • 形成新 VPN 的隧道,并通过它路由流量。
  • on-prem VPC 重复上述 VPN 创建过程,创建第二个 VPN。

测试 VPN

  • 使用 Compute Engine 创建虚拟机 (VM) 以进行吞吐量负载测试。
  • 使用 iperf 测试单个 VPN 的吞吐速度。
  • 同时通过两个 VPN 路由流量,并使用 iperf 测试吞吐速度提升情况。

费用

本教程使用 Google Cloud Platform 的计费组件,包括:

假设每种资源您都要使用一整天,则根据此价格计算器,运行本教程的估计价格约为 $10.01。

准备工作

  1. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  2. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  3. 启用 Google Compute Engine API。

    启用 API

  4. 查看并熟悉如何使用 Google Cloud 创建 VPN;同时也要熟读 VPC 网络概览

创建 cloud VPC

在本部分中,您将执行以下操作:

  • 创建 VPC 以模拟您的云生产网络。
  • 允许常见类型的流量流过 VPC。
  • 创建用于部署主机的子网。

  1. 转至 Cloud Shell。

    打开 Cloud Shell

  2. 在 Cloud Shell 中,创建与您的 Google Cloud 项目关联的名为 cloud 的自定义 VPC。此 VPC 允许您使用非默认 IP 地址,但不包含任何默认防火墙规则:

    gcloud compute networks create cloud --subnet-mode custom
    
  3. 启用 SSHicmp,因为在负载测试期间,您需要使用安全 shell 与虚拟机通信:

    gcloud compute firewall-rules create cloud-fw --network cloud --allow tcp:22,icmp
    
  4. 在此 VPC 中创建一个子网,并指定一个区域和 IP 范围。在此解决方案中,您将使用 10.0.1.0/24us-east1 区域:

    gcloud compute networks subnets create cloud-east --network cloud \
        --range 10.0.1.0/24 --region us-east1
    

创建 on-prem VPC

在本部分,您将创建 on-prem VPC 或要连接到 cloud 的任何网络的模拟。实际上,您已经拥有了所需的资源,但是为了创建隧道并验证配置,请按照下列步骤操作:

  1. 使用 gcloud 命令行工具,新建一个与项目关联的自定义子网 VPC。将新的 VPC 命名为 on-prem

    gcloud compute networks create on-prem --subnet-mode custom
    
  2. on-prem VPC 中的主机启用 SSHicmp,因为在负载测试期间您需要使用安全外壳来与虚拟机通信:

    gcloud compute firewall-rules create on-prem-fw --network on-prem --allow tcp:22,icmp
    
  3. 指定区域的子网前缀。在此示例中,您将 192.168.1.0/24 分配给 us-central1 区域:

    gcloud compute networks subnets create on-prem-central \
        --network on-prem --range 192.168.1.0/24 --region us-central1
    

创建 VPN 网关

每个环境都需要 VPN 网关才能进行安全的外部通信。请按照以下步骤为您的 cloud VPC 和 on-prem VPC 创建初始网关:

  1. on-prem VPC 和 us-central1 区域中创建一个名为 on-prem-gw1 的 VPN 网关:

    gcloud compute target-vpn-gateways create on-prem-gw1 --network on-prem --region us-central1
    
  2. cloud VPC 和 us-east1 区域中创建一个名为 cloud-gw1 的 VPN 网关:

    gcloud compute target-vpn-gateways create cloud-gw1 --network cloud --region us-east1
    

在本地和 Google Cloud 网络之间创建一个基于路由的 VPN 隧道

您已创建 VPN 网关,现在需要为每个网关配置一个静态的外部 IP 地址,以便 VPC 外部的系统可与它们通信。以下步骤显示了如何在 cloud VPC 和 on-prem VPC 上创建 IP 地址和路由:

  1. cloud-gw1 VPN 网关分配 IP:

    gcloud compute addresses create cloud-gw1 --region us-east1
    
  2. on-prem-gw1 VPN 网关分配 IP:

    gcloud compute addresses create on-prem-gw1 --region us-central1
    
  3. 保存在前述步骤中创建的地址,方便您在后续的命令中使用。

    1. 首先,对于 cloud-gw1 网关:

      cloud_gw1_ip=$(gcloud compute addresses describe cloud-gw1 \
          --region us-east1 --format='value(address)')
      
    2. 其次,对于 on-prem-gw1 网关:

      on_prem_gw_ip=$(gcloud compute addresses describe on-prem-gw1 \
          --region us-central1 --format='value(address)')
      
  4. cloud VPC 上为 IPsec 创建转发规则。您需要在两个方向上都创建转发规则。

    1. 转发来自 cloud-gw1 的封装安全载荷 (ESP) 协议:

      gcloud compute forwarding-rules create cloud-1-fr-esp --ip-protocol ESP \
          --address $cloud_gw1_ip --target-vpn-gateway cloud-gw1 --region us-east1
      
    2. 转发来自 cloud-gw1UDP:500 流量:

      gcloud compute forwarding-rules create cloud-1-fr-udp500 --ip-protocol UDP \
          --ports 500 --address $cloud_gw1_ip --target-vpn-gateway cloud-gw1 --region us-east1
      
    3. 转发来自 cloud-gw1UDP:4500 流量:

      gcloud compute forwarding-rules create cloud-fr-1-udp4500 --ip-protocol UDP \
          --ports 4500 --address $cloud_gw1_ip --target-vpn-gateway cloud-gw1 --region us-east1
      
  5. 以相同的方式,为 on-prem VPC 的 IPsec 隧道创建转发规则。此步骤允许 IPsec 隧道退出防火墙,并且必须像前述步骤一样执行以下协议:

    1. 转发来自 on-prem-gw1 的 ESP 协议:

      gcloud compute forwarding-rules create on-prem-fr-esp --ip-protocol ESP \
          --address $on_prem_gw_ip --target-vpn-gateway on-prem-gw1 --region us-central1
      
    2. 转发 UDP:500 流量,用于从 on-prem-gw1 建立 IPsec 隧道:

      gcloud compute forwarding-rules create on-prem-fr-udp500 --ip-protocol UDP --ports 500 \
          --address $on_prem_gw_ip --target-vpn-gateway on-prem-gw1 --region us-central1
      
    3. 转发 UDP:4500 流量,用于传输来自 on-prem-gw1 的加密流量:

      gcloud compute forwarding-rules create on-prem-fr-udp4500 --ip-protocol UDP --ports 4500 \
          --address $on_prem_gw_ip --target-vpn-gateway on-prem-gw1 --region us-central1
      
  6. 生成一个 Secret,您将在下一步用到它,到时您将创建并验证 on-prem-tunnel1 隧道和 cloud-tunnel1 隧道。如需详细了解如何创建和安全存储 Secret,请参阅 Secret 管理

  7. 使用上一步生成的 Secret,为本地网络创建隧道 on-prem-tunnel1,为云端网络创建隧道 cloud-tunnel1。每个网络都必须有一个 VPN 网关,并且必须匹配 Secret。在以下两个命令中,将 [MY_SECRET] 替换为您生成的 Secret。

    1. 创建从 on-premcloud 的 VPN 隧道:

      gcloud compute vpn-tunnels create on-prem-tunnel1 --peer-address $cloud_gw1_ip \
          --target-vpn-gateway on-prem-gw1 --ike-version 2 --local-traffic-selector 0.0.0.0/0 \
          --remote-traffic-selector 0.0.0.0/0 --shared-secret=[MY_SECRET] --region us-central1
      
    2. 创建从 cloudon-prem 的 VPN 隧道:

      gcloud compute vpn-tunnels create cloud-tunnel1 --peer-address $on_prem_gw_ip \
          --target-vpn-gateway cloud-gw1 --ike-version 2 --local-traffic-selector 0.0.0.0/0 \
          --remote-traffic-selector 0.0.0.0/0 --shared-secret=[MY_SECRET] --region us-east1
      
  8. 现在您已经创建了网关并构建了隧道,接着您需要通过两个隧道添加来自先前创建的子网的路由。

    1. 通过隧道将来自 on-prem VPC 的流量路由到 cloud 10.0.1.0/24 范围:

      gcloud compute routes create on-prem-route1 --destination-range 10.0.1.0/24 \
          --network on-prem --next-hop-vpn-tunnel on-prem-tunnel1 \
          --next-hop-vpn-tunnel-region us-central1
      
    2. 通过隧道将来自 cloud VPC 的流量路由到 on-prem 192.168.1.0/24 范围:

      gcloud compute routes create cloud-route1 --destination-range 192.168.1.0/24 \
          --network cloud --next-hop-vpn-tunnel cloud-tunnel1 --next-hop-vpn-tunnel-region us-east1
      

通过 VPN 测试吞吐量

此时,您已在 on-prem VPC 和 cloud VPC 之间建立了安全路径。要测试吞吐量,您将使用 iperf,它是一种用于网络负载测试的开源工具。此外,您需要在每个环境中部署一个虚拟机,一个用于发送流量,另一个用于接收流量。

单 VPN 负载测试

  1. cloud VPC 创建虚拟机。在本例中,其名称是 cloud-loadtest,使用 Debian Linux 映像作为操作系统。如果您现在已有项目,可省略此步骤并使用现有资源。请注意,虚拟机的带宽为 2 Gbps * vCPU,因此您最少需要 4 个 vCPU。

    gcloud compute instances create "cloud-loadtest" --zone "us-east1-b" \
        --machine-type "n1-standard-4" --subnet "cloud-east" \
        --image-family "debian-9" --image-project "debian-cloud" --boot-disk-size "10" \
        --boot-disk-type "pd-standard" --boot-disk-device-name "cloud-loadtest"
    
  2. on-prem VPC 创建虚拟机。此示例使用与 cloud VPC 中相同的 Debian 映像。如果您已有资源,请忽略此步骤。在本例中,其名称是 on-prem-loadtest

    gcloud compute instances create "on-prem-loadtest" --zone "us-central1-a" \
        --machine-type "n1-standard-4" --subnet "on-prem-central" \
        --image-family "debian-9" --image-project "debian-cloud" --boot-disk-size "10" \
        --boot-disk-type "pd-standard" --boot-disk-device-name "on-prem-loadtest"
    
  3. 打开 on-prem 网络防火墙上的 TCP 端口 5001 以接受 iperf 请求:

    gcloud compute firewall-rules create on-prem-iperf-fw --network on-prem --allow tcp:5001
    
  4. 使用 SSH 连接到每个虚拟机并安装 iperf 的副本。要在 Debian 上安装 iperf,请使用以下命令行:

    sudo apt-get install iperf
    
  5. on-prem-loadtest 虚拟机上,运行以下命令:

    iperf -s -i 5 -p 5001
    

    您已在虚拟机上创建了一个 iperf 服务器,它每 5 秒报告一次虚拟机的状态。

  6. cloud-loadtest 虚拟机上,运行以下命令:

    iperf -c 192.168.1.2 -P 20 -x C -p 5001
    

现在您已经创建了一个包含 20 个流的 iperf 客户端,它将在 10 秒的测试后报告吞吐量值:

iperf 测试

请观察 [SUM] 吞吐量值,如果结果足以满足您的流量需求,则可以停止后续操作。但是,如果您需要额外的吞吐量,则需要创建和使用额外的隧道。

多个 VPN 负载测试

如果路由匹配,Google Cloud VPN 网关将按流量执行等价多路径路由 (ECMP),以跨多个隧道进行负载平衡,并提供更高的聚合吞吐量。由于负载平衡是按流量进行的,因此单个流量不会带来任何好处,但多个流量却可以。

  1. cloud-gw1 所在的区域中再创建一个 cloud VPN 网关 cloud-gw2

    gcloud compute target-vpn-gateways create cloud-gw2 --network cloud --region us-east1
    
  2. cloud-gw2 创建地址:

    gcloud compute addresses create cloud-gw2 --region us-east1
    
  3. 存储 cloud-gw2 的地址:

    cloud_gw2_ip=$(gcloud compute addresses describe cloud-gw2 \
        --region us-east1 --format='value(address)')
    
  4. cloud-gw2 上创建转发规则:

    gcloud compute forwarding-rules create cloud-2-fr-esp --ip-protocol ESP \
        --address $cloud_gw2_ip --target-vpn-gateway cloud-gw2 --region us-east1
    gcloud compute forwarding-rules create cloud-2-fr-udp500 --ip-protocol UDP --ports 500 \
        --address $cloud_gw2_ip --target-vpn-gateway cloud-gw2 --region us-east1
    gcloud compute forwarding-rules create cloud-fr-2-udp4500 --ip-protocol UDP --ports 4500 \
        --address $cloud_gw2_ip --target-vpn-gateway cloud-gw2 --region us-east1
  5. 创建从 on-premcloud-gw2 的隧道,将 [MY_SECRET] 替换为您生成的 Secret:

    gcloud compute vpn-tunnels create on-prem-tunnel2 --peer-address $cloud_gw2_ip \
        --target-vpn-gateway on-prem-gw1 --ike-version 2 --local-traffic-selector 0.0.0.0/0 \
        --remote-traffic-selector 0.0.0.0/0 --shared-secret=[MY_SECRET] --region us-central1
    
  6. 创建从 cloud-gw2on-prem 的隧道,将 [MY_SECRET] 替换为您生成的 Secret:

    gcloud compute vpn-tunnels create cloud-tunnel2 --peer-address $on_prem_gw_ip \
        --target-vpn-gateway cloud-gw2 --ike-version 2 --local-traffic-selector 0.0.0.0/0 \
        --remote-traffic-selector 0.0.0.0/0 --shared-secret=[MY_SECRET] --region us-east1
    
  7. 创建从 on-premcloud-gw2 的路由:

    gcloud compute routes create on-prem-route2 --destination-range 10.0.1.0/24 --network on-prem \
        --next-hop-vpn-tunnel on-prem-tunnel2 --next-hop-vpn-tunnel-region us-central1
    
  8. 创建从 cloud-gw2on-prem 的路由:

    gcloud compute routes create cloud-route2 --destination-range 192.168.1.0/24 \
        --network cloud --next-hop-vpn-tunnel cloud-tunnel2 --next-hop-vpn-tunnel-region us-east1
    

您现已创建两个隧道(cloud-tunnel1cloud-tunnel2),并且两个隧道具有相同的路由。流量将在它们之间自动进行负载平衡。

通过 VPN 重新测试吞吐量

  • 使用 iperf 重新测试网络的速度:

    iperf -c 192.168.1.2 -P 20 -x C
    

请注意吞吐量值为何会大于单隧道测试:

iperf 重新测试

另请注意,等价多路径路由 VPN 隧道的限制不是 2,隧道也不需要在相同的区域终止。

如需扩大规模,您可以无限重复此过程。此外,为了提高可靠性,您可以在不同的区域子网中获取或终止这些隧道。

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤