Criar conexões de VPN de alta disponibilidade entre o Google Cloud e a AWS

Neste tutorial, demonstramos como criar conexões VPN altamente disponíveis entre o Google Cloud e a Amazon Web Services (AWS) para comunicação direta entre redes VPC nas duas plataformas de nuvem.

Neste tutorial, pressupomos que você esteja familiarizado com os conceitos básicos de redes de nuvem privada virtual (VPC), protocolo de gateway de borda (BGP, na sigla em inglês), redes privadas virtuais (VPNs) e túneis de IPsec.

O Google Cloud oferece um serviço de VPN altamente disponível para conectar sua rede VPC a ambientes em execução fora do Google Cloud, como no local ou na AWS por meio de um Conexão VPN IPsec. A VPN de alta disponibilidade fornece um SLA de 99,99% de disponibilidade de serviço quando configurado com base nas práticas recomendadas do Google.

Informações gerais da arquitetura

A arquitetura descrita neste documento inclui os seguintes componentes:

  • Cloud Router: um serviço do Google Cloud totalmente distribuído e gerenciado para fornecer roteamento dinâmico usando o BGP para suas redes VPC.
  • Gateway de VPN de alta disponibilidade: um gateway de VPN gerenciado pelo Google em execução no Google Cloud. Cada gateway de VPN de alta disponibilidade é um recurso regional que tem duas interfaces, cada uma com os próprios endereços IP externos: interface 0 e 1.
  • Túneis de VPN: conexões do gateway de VPN de alta disponibilidade para o gateway de VPN de peering na AWS por meio do qual o tráfego criptografado passa.
  • Gateway de VPN de peering: dois endpoints de VPN site a site da AWS, que podem ser de um gateway particular virtual da AWS ou de um gateway de trânsito da AWS.

Cada uma das conexões de gateway de VPN de peering vem com dois túneis pré-configurados para apontar para um único gateway de cliente, que, neste caso, é uma interface de VPN de alta disponibilidade do Google Cloud. Com essa configuração, o número mínimo de túneis para atender ao SLA de disponibilidade de serviço de 99,99% é quatro.

As opções de roteamento e a largura de banda combinada nos túneis de VPN variam de acordo com a opção VPN site a site usada no AWS:

O diagrama a seguir mostra a arquitetura.

Visão geral da arquitetura:

Objetivos

  • Crie uma rede VPC no Google Cloud.
  • Crie um gateway de VPN de alta disponibilidade e o Cloud Router no Google Cloud.
  • Crie gateways de clientes na AWS.
  • Crie uma conexão VPN com roteamento dinâmico na AWS.
  • Crie um gateway de VPN externo e túneis de VPN no Google Cloud.
  • Verifique e teste a conexão VPN entre as redes VPC no Google Cloud e na AWS.

Exemplo de módulo do Terraform

É possível usar o módulo gcp-to-aws-ha-vpn-terraform-module para provisionar a VPN de alta disponibilidade entre o Google Cloud e a AWS.

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:

Para ver uma estimativa dos custos dos componentes do Google Cloud, use a calculadora de preços do Google Cloud.

Neste tutorial, há componentes faturáveis do Amazon Web Services, incluindo:

  • Gateway da AWS Transit
  • VPN site a site da AWS

Para ter uma estimativa dos custos dos componentes da AWS, use a calculadora de preços dessa solução.

Antes de começar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  3. Enable the Compute Engine API.

    Enable the API

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. Verifique se você tem os papéis administrativos necessários para configurar os componentes de rede:

    • Administrador de rede: compute.networkAdmin
    • Administrador de segurança: compute.securityAdmin
    • Administrador do Compute: compute.admin

    Para mais informações sobre os objetivos desses papéis, consulte Papéis do IAM para funções de jobs relacionados a redes.

Criar o gateway de VPN de alta disponibilidade e o Cloud Router no Google Cloud

Nesta seção, você cria uma rede VPC, um gateway de VPN de alta disponibilidade e um Cloud Router no Google Cloud.

  1. No Cloud Shell, verifique se você está trabalhando no projeto do Google Cloud criado ou selecionado:

    gcloud config set project YOUR_PROJECT_ID
    
    export PROJECT_ID=`gcloud config list --format="value(core.project)"`
    

    Substitua YOUR_PROJECT_ID pelo ID do projeto do Google Cloud.

  2. Crie uma rede VPC personalizada com uma única sub-rede:

    gcloud compute networks create NETWORK \
        --subnet-mode SUBNET_MODE \
        --bgp-routing-mode BGP_ROUTING_MODE
    

    Substitua:

    O comando será semelhante ao seguinte exemplo:

    gcloud compute networks create gc-vpc \
        --subnet-mode custom \
        --bgp-routing-mode global
    
  3. Crie uma sub-rede para hospedar as VMs de teste:

    gcloud compute networks subnets create SUBNET_NAME \
        --network NETWORK \
        --region SUBNET_REGION \
        --range IP_ADDRESS_RANGE
    

    Substitua:

    Os comandos serão semelhantes a este exemplo:

    gcloud compute networks subnets create subnet-east4  \
        --network gc-vpc \
        --region us-east4 \
        --range 10.1.1.0/24
    
  4. Crie o gateway de VPN de alta disponibilidade:

    gcloud compute vpn-gateways create HA_VPN_GATEWAY_NAME \
        --network NETWORK \
        --region REGION
    

    Substitua HA_VPN_GATEWAY_NAME pelo nome do gateway de VPN de alta disponibilidade.

  5. Criar um Cloud Router

    gcloud compute routers create ROUTER_NAME \
        --region REGION \
        --network NETWORK \
        --asn GOOGLE_ASN \
        --advertisement-mode custom \
        --set-advertisement-groups all_subnets
    

    Substitua:

    • ROUTER_NAME: o nome do seu Cloud Router.
    • GOOGLE_ASN: o ASN particular (número de sistema autônomo) do Cloud Router que você está criando. Pode ser qualquer ASN privado no intervalo 64512-65534 ou 4200000000-4294967294 que você ainda não esteja usando como um ASN de mesmo nível na mesma região e rede.

    O comando será semelhante ao seguinte exemplo:

    gcloud compute routers create cloud-router \
        --region us-east4 \
        --network gc-vpc \
        --asn 65534 \
        --advertisement-mode custom \
        --set-advertisement-groups all_subnets
    

Este procedimento cria um gateway de VPN com duas interfaces. Anote os endereços externos para usá-los ao configurar o ambiente na AWS.

Criar gateways e conexões VPN na AWS

Nesta seção, você criará gateways de clientes, um gateway de destino e conexões de VPN com roteamento dinâmico.

Você executa comandos da AWS usando a interface de linha de comando da AWS.

  1. Crie dois gateways de clientes usando o seguinte comando da AWS:

    aws ec2 create-customer-gateway --type ipsec.1 --public-ip INTERFACE_0_IP_ADDRESS --bgp-asn GOOGLE_ASN
    
    aws ec2 create-customer-gateway --type ipsec.1 --public-ip INTERFACE_1_IP_ADDRESS --bgp-asn GOOGLE_ASN
    

    Substitua INTERFACE_0_IP_ADDRESS e INTERFACE_1_IP_ADDRESS pelos endereços IP públicos da etapa final da seção anterior.

  2. Crie um gateway de destino e anexe-o à sua rede VPC.

    O gateway de destino pode ser um gateway particular virtual ou um gateway de trânsito. Para mais informações, consulte Criar um gateway de destino.

    Siga as instruções para um gateway particular virtual ou de gateway:

    • Gateway particular virtual

      1. Crie um gateway particular virtual com um ASN específico do AWS:

        aws ec2 create-vpn-gateway --type ipsec.1 --amazon-side-asn AWS_SIDE_ASN
        

        Substitua AWS_SIDE_ASN pelo ASN do lado da AWS.

        Esse comando será semelhante ao exemplo a seguir:

        aws ec2 create-vpn-gateway --type ipsec.1 --amazon-side-asn 65001
        
      2. Anexe o gateway particular virtual à rede VPC:

        aws ec2 attach-vpn-gateway --vpn-gateway-id VPN_GATEWAY_ID --vpc-id VPC_ID
        
    • Gateway de transporte

      1. Crie um gateway de transporte:

        aws ec2 create-transit-gateway --description TRANSIT_GATEWAY_DESCRIPTION \
            --options=AmazonSideAsn=65001,AutoAcceptSharedAttachments=enable,DefaultRouteTableAssociation=enable,DefaultRouteTablePropagation=enable,VpnEcmpSupport=enable,DnsSupport=enable
        

        Substitua TRANSIT_GATEWAY_DESCRIPTION por uma descrição do gateway de transporte público.

      2. Anexe a rede VPC ao gateway de trânsito:

        aws ec2 create-transit-gateway-vpc-attachment \
            --transit-gateway-id TRANSIT_GATEWAY_ID \
            --vpc-id VPC_ID \
            --subnet-id SUBNET_ID
        
  3. Crie uma conexão VPN com roteamento dinâmico.

    O método para criar uma conexão VPN com roteamento dinâmico é diferente se o gateway de destino é um gateway privado virtual ou um gateway de trânsito. Para mais informações, consulte Criar uma conexão VPN site a site.

    Siga as instruções para um gateway particular virtual ou de gateway:

    • Gateway particular virtual

      Crie uma conexão VPN com roteamento dinâmico entre o gateway particular virtual e os gateways do cliente e aplique tags à conexão da VPN:

          aws ec2 create-vpn-connection \
              --type ipsec.1 \
              --customer-gateway-id CUSTOMER_GATEWAY_1 \
              --vpn-gateway-id VPN_GATEWAY_ID \
              --options TunnelOptions='[{TunnelInsideCidr=AWS_T1_IP,PreSharedKey=SHARED_SECRET_1},{TunnelInsideCidr=AWS_T2_IP,PreSharedKey=SHARED_SECRET_2}]'
      
          aws ec2 create-vpn-connection \
              --type ipsec.1 \
              --customer-gateway-id CUSTOMER_GATEWAY_2 \
              --vpn-gateway-id VPN_GATEWAY_ID \
              --options TunnelOptions='[{TunnelInsideCidr=AWS_T3_IP,PreSharedKey=SHARED_SECRET_3},{TunnelInsideCidr=AWS_T4_IP,PreSharedKey=SHARED_SECRET_4}]'
      
    • Gateway de transporte

      Crie uma conexão VPN com roteamento dinâmico entre o gateway do transporte público e os gateways do cliente:

      aws ec2 create-vpn-connection \
          --type ipsec.1 \
          --customer-gateway-id CUSTOMER_GATEWAY_1 \
          --transit-gateway-id TRANSIT_GATEWAY_ID \
          --options TunnelOptions='[{TunnelInsideCidr=AWS_T1_IP,PreSharedKey=SHARED_SECRET_1},{TunnelInsideCidr=AWS_T2_IP,PreSharedKey=SHARED_SECRET_2}]'
      
      aws ec2 create-vpn-connection \
          --type ipsec.1 \
          --customer-gateway-id CUSTOMER_GATEWAY_2 \
          --transit-gateway-id TRANSIT_GATEWAY_ID \
          --options TunnelOptions='[{TunnelInsideCidr=AWS_T3_IP,PreSharedKey=SHARED_SECRET_3},{TunnelInsideCidr=AWS_T4_IP,PreSharedKey=SHARED_SECRET_4}]'
      

      Substitua:

      • CUSTOMER_GATEWAY_1: gateway do Google Cloud VPN, interface 0
      • CUSTOMER_GATEWAY_2: gateway do Google Cloud VPN, interface 1
      • AWS_T1_IP: endereço IP interno do gateway virtual virtual para a conexão 1, túnel 1
      • AWS_T2_IP: endereço IP interno do gateway particular virtual da conexão 1, túnel 2
      • AWS_T3_IP: endereço IP interno do gateway particular virtual da conexão 2, túnel 1
      • AWS_T4_IP: endereço IP interno do gateway particular virtual para a conexão 2, túnel 2
      • SHARED_SECRET_1: chave pré-compartilhada para conexão 1, túnel 1
      • SHARED_SECRET_2: chave pré-compartilhada para conexão 1, túnel 2
      • SHARED_SECRET_3: chave pré-compartilhada para conexão 2, túnel 1
      • SHARED_SECRET_4: chave pré-compartilhada para conexão 2, túnel 2

      A AWS reserva alguns intervalos CIDR. Portanto, não é possível usar valores nesses intervalos como dentro de endereços IP (AWS_T1_IP, AWS_T2_IP, AWS_T3_IP e AWS_T4_IP). Para informações sobre o que o CIDR bloqueia nas reservas da AWS, consulte CIDR do IPv4 dentro do túnel.

      Esses comandos criam quatro túneis no Google Cloud.

  4. Faça o download dos arquivos de configuração para as duas conexões VPN.

    Nas etapas subsequentes, você usará valores dos arquivos de configuração para criar e configurar recursos no lado do Google Cloud.

Crie túneis de VPN e interfaces do Cloud Router no Google Cloud

Nesta seção, você usa as informações das conexões de VPN da AWS criadas na seção anterior para criar e configurar componentes no Google Cloud.

Ao configurar túneis VPN para a AWS, use o protocolo de criptografia IKEv2 e selecione menos conjuntos de transformação no lado da AWS. Por exemplo, selecione uma combinação de algoritmos de criptografia únicos de fase 1 e fase 2, algoritmos de integridade e números de grupos Diffie-Hellman (DH). Caso contrário, o túnel do Cloud VPN pode falhar em fazer o rekeying devido ao grande tamanho de payload da associação de segurança (SA) para os conjuntos de transformação padrão da AWS. Esse tamanho de payload grande resulta na fragmentação de IP de pacotes IKE no lado da AWS, o que não é compatível com o Cloud VPN. Para mais informações, consulte Opções de túnel para sua conexão VPN de site a site.

  1. No Cloud Shell, crie um gateway de VPN externo com quatro interfaces para a AWS fora dos endereços IP:

    gcloud compute external-vpn-gateways create PEER_GATEWAY_NAME --interfaces \
      0=AWS_GW_IP_1,1=AWS_GW_IP_2,2=AWS_GW_IP_3,3=AWS_GW_IP_4
    

    Substitua:

    • AWS_GW_IP_1: endereço IP externo para gateway particular virtual para conexão 1, túnel 1
    • AWS_GW_IP_2: endereço IP externo para gateway particular virtual para conexão 1, túnel 2
    • AWS_GW_IP_3: endereço IP externo para o gateway particular virtual na conexão 2, túnel 1
    • AWS_GW_IP_4: endereço IP externo para gateway particular virtual para conexão 2, túnel 2
  2. Crie quatro túneis de VPN:

    • Túnel 1:

      gcloud compute vpn-tunnels create tunnel-1 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 0 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_1 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 0
      
    • Túnel 2:

      gcloud compute vpn-tunnels create tunnel-2 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 1 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_2 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 0
      
    • Túnel 3:

      gcloud compute vpn-tunnels create tunnel-3 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 2 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_3 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 1
      
    • Túnel 4:

      gcloud compute vpn-tunnels create tunnel-4 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 3 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_4 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 1
      
  3. Crie quatro interfaces do Cloud Router.

    Nos comandos a seguir, substitua cada marcador GOOGLE_BGP_IP_TUNNEL pelo endereço IP do túnel no lado do Google Cloud. Encontre os valores nos arquivos de configuração da VPN da AWS como o endereço do gateway de cliente para cada túnel. Cada um desses endereços precisa estar no intervalo CIDR /30 dentro do intervalo de rede 169.254.0.0/16.

    • Interface 1 do Cloud Router:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-1 \
          --vpn-tunnel tunnel-1 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_1 \
          --mask-length 30 \
          --region REGION
      
    • Interface 2 do Cloud Router:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-2 \
          --vpn-tunnel tunnel-2 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_2 \
          --mask-length 30 \
          --region REGION
      
    • Interface 3 do Cloud Router:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-3 \
          --vpn-tunnel tunnel-3 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_3 \
          --mask-length 30 \
          --region REGION
      
    • Interface 4 do Cloud Router:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-4 \
          --vpn-tunnel tunnel-4 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_4 \
          --mask-length 30 \
          --region REGION
      
  4. Adicione pares do BGP.

    Nos comandos a seguir, substitua PEER_ASN pelo ASN da parte da AWS da sessão do BGP.

    • Conexão da AWS 1, túnel 1

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn1-tunn1 \
          --peer-asn PEER_ASN \
          --interface int-1 \
          --peer-ip-address AWS_T1_IP \
          --region REGION
      
    • Conexão da AWS 1, túnel 2

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn1-tunn2 \
          --peer-asn PEER_ASN \
          --interface int-2 \
          --peer-ip-address AWS_T2_IP \
          --region REGION
      
    • Conexão 2 da AWS, túnel 1

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn2-tunn1 \
          --peer-asn PEER_ASN \
          --interface int-3 \
          --peer-ip-address AWS_T3_IP \
          --region REGION
      
    • Conexão da AWS 2, túnel 2

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn2-tunn2 \
          --peer-asn PEER_ASN \
          --interface int-4 \
          --peer-ip-address AWS_T4_IP \
          --region REGION
      

Verificar a configuração

  1. No Cloud Shell, verifique o status do Cloud Router:

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

    O resultado será assim:

    result.bgpPeerStatus[].peerIpAddress)'
    result.bgpPeerStatus[0].ipAddress:     169.254.171.18
    result.bgpPeerStatus[0].name:          aws-conn1-tunn1
    result.bgpPeerStatus[0].peerIpAddress: 169.254.171.17
    result.bgpPeerStatus[1].ipAddress:     169.254.156.154
    result.bgpPeerStatus[1].name:          aws-conn1-tunn2
    result.bgpPeerStatus[1].peerIpAddress: 169.254.156.153
    result.bgpPeerStatus[2].ipAddress:     169.254.123.38
    result.bgpPeerStatus[2].name:          aws-conn2-tunn1
    result.bgpPeerStatus[2].peerIpAddress: 169.254.123.37
    result.bgpPeerStatus[3].ipAddress:     169.254.48.186
    result.bgpPeerStatus[3].name:          aws-conn2-tunn2
    result.bgpPeerStatus[3].peerIpAddress: 169.254.48.185
    
  2. Liste todos os túneis:

    gcloud compute vpn-tunnels list
    

    O resultado será assim:

    NAME      REGION    GATEWAY    PEER_ADDRESS
    tunnel-1  us-east4  ha-vpn-gw  34.205.x.x
    tunnel-2  us-east4  ha-vpn-gw  52.203.x.x
    tunnel-3  us-east4  ha-vpn-gw  3.208.x.x
    tunnel-4  us-east4  ha-vpn-gw  52.204.x.x
    
  3. Verifique o status do túnel:

    gcloud compute vpn-tunnels describe tunnel-1 \
         --region REGION \
         --format='flattened(status,detailedStatus)'
    

    O resultado será assim:

    detailed_status: Tunnel is up and running.
    status:          ESTABLISHED
    
  4. Liste rotas dinâmicas aprendidas pelo Cloud Router:

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

    O resultado será assim:

    result.bestRoutes[0].creationTimestamp: 2021-01-19T20:42:07.366-08:00
    result.bestRoutes[0].destRange:         10.2.2.0/24
    result.bestRoutes[0].kind:              compute#route
    result.bestRoutes[0].nextHopIp:         169.254.171.17
    result.bestRoutes[0].priority:          100
    result.bestRoutes[1].creationTimestamp: 2021-01-19T20:42:07.366-08:00
    result.bestRoutes[1].destRange:         10.2.2.0/24
    result.bestRoutes[1].kind:              compute#route
    result.bestRoutes[1].nextHopIp:         169.254.156.153
    result.bestRoutes[1].priority:          100
    result.bestRoutes[2].creationTimestamp: 2021-01-19T20:56:26.588-08:00
    result.bestRoutes[2].destRange:         10.2.2.0/24
    result.bestRoutes[2].kind:              compute#route
    result.bestRoutes[2].nextHopIp:         169.254.123.37
    result.bestRoutes[2].priority:          100
    result.bestRoutes[3].creationTimestamp: 2021-01-19T20:56:26.588-08:00
    result.bestRoutes[3].destRange:         10.2.2.0/24
    result.bestRoutes[3].kind:              compute#route
    result.bestRoutes[3].nextHopIp:         169.254.48.185
    result.bestRoutes[3].priority:          100
    

Testar a conectividade

  1. Crie VMs de teste em cada lado dos túneis para testar solicitações de ping.

    Verifique se você tem regras de firewall para permitir o tráfego ICMP.

  2. Teste a conexão usando o comando ping.

  3. Avalie a largura de banda entre as máquinas de teste usando o iperf.

    • Lado do servidor:

      iperf3 -s
      
    • Lado do cliente:

      iperf3 -c SERVER_IP_ADDRESS -P NUMBER_OF_PARALLEL_SESSIONS
      

Limpar

Exclua os recursos do Google Cloud e do AWS que você criou durante este tutorial.

Excluir o projeto do Google Cloud

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Excluir recursos da AWS

  1. Excluir conexões VPN.
  2. Exclua o gateway de transporte público.
  3. Exclua as VMs de teste.

A seguir