Usar Public NAT com Compute Engine

Esta página mostra uma demonstração de um gateway do Public NAT que fornece serviços de conversão de endereços de rede para uma instância de VM do Compute Engine. Antes de começar, leia as Informações gerais do Public NAT.

Pré-requisitos

É necessário fazer o seguinte antes de configurar o Public NAT.

Acessar permissões do IAM

O papel roles/compute.networkAdmin concede permissões para criar um gateway NAT no Cloud Router, reservar e atribuir endereços IP de NAT e especificar sub-redes (sub-redes) cujo tráfego deve usar a conversão de endereços de rede pelo gateway NAT.

Configurar o Google Cloud

Antes de começar, configure os seguintes itens no Google Cloud.

  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

Exemplo

Confira a seguir um exemplo completo que demonstra um gateway de amostra do Private NAT e uma VM de exemplo do Compute Engine que usa o gateway do Private NAT.

Etapa 1: criar uma rede e sub-rede da VPC

Se você já tiver uma rede e uma sub-rede, pule esta etapa.

Console

  1. No Console do Google Cloud, acesse a página Redes VPC.

    Acessar a página "Redes VPC"

  2. Clique em Criar rede VPC.

  3. Informe um Nome de custom-network1.

  4. Em Sub-redes, defina o Modo de criação da sub-rede como Personalizado.

  5. Em Nova sub-rede, insira um Nome de subnet-us-east-192.

  6. Em Região, selecione us-east4.

  7. Digite um intervalo de endereço IP 192.168.1.0/24.

  8. Clique em Concluído e em Criar.

gcloud

  1. Crie uma nova rede VPC de modo personalizado no seu projeto.

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
  2. Especifique o prefixo de sub-rede da primeira região. Neste exemplo, atribuímos 192.168.1.0/24 à região us-east4.

    gcloud compute networks subnets create subnet-us-east-192 \
       --network custom-network1 \
       --region us-east4 \
       --range 192.168.1.0/24

Terraform

É possível usar um módulo do Terraform para criar uma rede e uma sub-rede de nuvem privada virtual (VPC) personalizada.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "custom-network1"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "subnet-us-east-192"
      subnet_ip     = "192.168.1.0/24"
      subnet_region = "us-east4"
    }
  ]
}

Etapa 2: criar uma instância de VM sem endereço IP externo

Console

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar a página "Instâncias de VM"

  2. Clique em Criar instância.

  3. Especifique um Nome de nat-test-1 para sua instância.

  4. Defina a Região como us-east4.

  5. Defina a Zona como us-east4-c.

  6. Clique no link Gerenciamento, segurança, discos, rede, locatário individual.

  7. Clique na guia Rede.

  8. Em Interfaces de rede, clique em Editar na interface padrão da VM.

    1. Defina o Rede para custom-network1.
    2. Defina o Sub-rede para subnet-us-east-192.
    3. Defina IP externo como None.
    4. Clique em Concluído.
  9. Para criar e iniciar a instância, clique em Criar.

gcloud

gcloud compute instances create nat-test-1 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --network custom-network1 \
    --subnet subnet-us-east-192 \
    --zone us-east4-c \
    --no-address

Terraform

É possível usar um recurso do Terraform para criar uma instância de VM.

resource "google_compute_instance" "default" {
  project      = var.project_id
  zone         = "us-east4-c"
  name         = "nat-test-1"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    network    = "custom-network1"
    subnetwork = var.subnet # Replace with a reference or self link to your subnet, in quotes
  }
}

Etapa 3: criar uma regra de firewall que permita conexões SSH

Console

  1. No Console do Google Cloud, acesse a página Firewall.

    Acessar a página "Políticas de firewall"

  2. Clique em Criar regra de firewall.

  3. Informe um Nome de allow-ssh.

  4. Especifique uma rede de custom-network1.

  5. Defina a Direção do tráfego como Entrada.

  6. Defina a Ação se houver correspondência como Permitir.

  7. Defina Destinos como Todas as instâncias na rede.

  8. Defina Filtro de origem como Intervalos IPv4.

  9. Defina Intervalos de IPs de origem como 35.235.240.0/20.

  10. Defina Protocolos e portas como Protocolos e portas especificados.

  11. Marque a caixa de seleção tcp e insira a porta 22.

  12. Clique em Criar

gcloud

gcloud compute firewall-rules create allow-ssh \
    --network custom-network1 \
    --source-ranges 35.235.240.0/20 \
    --allow tcp:22

Terraform

Use um recurso do Terraform para criar uma regra de firewall.

resource "google_compute_firewall" "rules" {
  project = var.project_id
  name    = "allow-ssh"
  network = var.network # Replace with a reference or self link to your network, in quotes

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }
  source_ranges = ["35.235.240.0/20"]
}

Etapa 4: criar permissões SSH de IAP para sua instância de teste

Em uma etapa posterior, use o Identity-Aware Proxy (IAP) para se conectar à sua instância de teste.

Console

  1. No console do Google Cloud, acesse a página Identity-Aware Proxy.

    Acessar a página Identity-Aware Proxy

  2. Selecione a guia Recursos SSH e TCP.

  3. Para atualizar as permissões dos membros nos recursos, marque a caixa de seleção ao lado de Todos os recursos do túnel > us-east4-c > nat-test-1.

  4. No painel à direita, clique em Adicionar membro.

  5. Para conceder aos usuários, grupos ou contas de serviço acesso aos recursos, no campo Novos membros, especifique os endereços de e-mail.

    Se você estiver apenas testando esse recurso, poderá inserir seu próprio endereço de e-mail.

  6. Para conceder aos membros acesso aos recursos por meio do recurso de encaminhamento TCP do Cloud IAP, na lista suspensa Papel, selecione Cloud IAP > Usuário do túnel protegido pelo IAP.

  7. Clique em Salvar.

gcloud

Esse comando concede acesso SSH usando o IAP para todas as instâncias de VM no projeto. Se você quiser conceder acesso SSH com o IAP a uma VM individual, use as instruções do console do Google Cloud.

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER_INFO \
    --role=roles/iap.tunnelResourceAccessor

Substitua:

  • PROJECT_ID: ID do projeto
  • MEMBER_INFO: uma lista separada por vírgulas de pares de type:email dos membros. Exemplos:
    • Para um único usuário: user:test-user@example.com
    • Para um grupo: group:admins@example.com
    • Para uma conta de serviço: serviceAccount:test123@example.domain.com

Terraform

É possível usar um recurso do Terraform para criar permissões SSH de IAP para sua instância de teste.

resource "google_project_iam_member" "project" {
  project = var.project_id
  role    = "roles/iap.tunnelResourceAccessor"
  member  = "serviceAccount:test123@example.domain.com"
}

Etapa 5: faça login em nat-test-1 e confirme que não é possível acessar a Internet

Console

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar a página "Instâncias de VM"

  2. Para nat-test-1, na coluna Conectar, clique na seta suspensa SSH e selecione Abrir na janela do navegador.

  3. No prompt de comando da VM, insira curl example.com e pressione Enter.

    Você não deve obter nenhum resultado. Se fizer isso, você pode ter criado nat-test-1 com um endereço IP externo ou pode haver algum outro problema. Para resolver esse problema, consulte as VMs podem acessar a Internet inesperadamente sem o Cloud NAT.

    Para finalizar o comando, talvez seja necessário inserir Ctrl+C.

gcloud

  1. Adicione uma chave SSH do Compute Engine ao seu host local.

    ssh-add ~/.ssh/google_compute_engine
    
  2. Conecte-se a nat-test-1 e execute um comando:

    gcloud compute ssh nat-test-1 \
        --zone us-east4-c \
        --command "curl example.com" \
        --tunnel-through-iap

    Você não deve obter nenhum resultado. Se fizer isso, você pode ter criado nat-test-1 com um endereço IP externo ou pode haver algum outro problema. Para resolver esse problema, consulte as VMs podem acessar a Internet inesperadamente sem o Cloud NAT.

    Para finalizar o comando, talvez seja necessário inserir Ctrl+C.

Etapa 6: criar uma configuração NAT usando o Cloud Router

É necessário criar o Cloud Router na mesma região que as instâncias que usam o Public NAT. O Cloud Router é usado apenas para colocar informações NAT nas VMs. Ele não é usado como parte do gateway NAT real.

Essa configuração permite que todas as instâncias da região usem o Public NAT para todos os intervalos de IP alias e primário. Ela também aloca automaticamente os endereços IP externos para o gateway NAT. Para mais opções, consulte a documentação da CLI do Google Cloud.

Console

  1. No Console do Google Cloud, acesse a página do Cloud NAT.

    Acesse a página do Cloud NAT

  2. Clique em Primeiros passos ou Criar gateway NAT.

  3. Digite um nome de gateway de nat-config.

  4. Defina a Rede VPC para custom-network1.

  5. Defina a Região como us-east4.

  6. Em Cloud Router, selecione Criar novo roteador.

    1. Informe um Nome de nat-router.
    2. Clique em Criar
  7. Clique em Criar.

gcloud

  1. Criar um Cloud Router

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. Adicionar uma configuração ao roteador

    gcloud compute routers nats create nat-config \
        --router-region us-east4 \
        --router nat-router \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips

Terraform

É possível usar um recurso do Terraform para criar um Cloud Router.

resource "google_compute_router" "router" {
  project = var.project_id
  name    = "nat-router"
  network = var.network
  region  = "us-east4"
}

É possível usar um módulo do Terraform para criar uma configuração NAT.

module "cloud-nat" {
  source  = "terraform-google-modules/cloud-nat/google"
  version = "~> 5.0"

  project_id                         = var.project_id
  region                             = "us-east4"
  router                             = google_compute_router.router.name
  name                               = "nat-config"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

Etapa 7: tentar se conectar à Internet novamente

Pode levar até três minutos para que a configuração de NAT seja propagada para a VM. Portanto, aguarde pelo menos um minuto antes de tentar acessar a Internet novamente.

Console

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar a página "Instâncias de VM"

  2. Para nat-test-1, na coluna Conectar, clique na seta suspensa SSH e selecione Abrir na janela do navegador.

  3. No prompt de comando da VM, insira curl example.com e pressione Enter.

gcloud

Conecte-se a nat-test-1 e execute um comando:

gcloud compute ssh nat-test-1 \
    --zone us-east4-c \
    --command "curl example.com" \
    --tunnel-through-iap

Você verá a saída que contém o seguinte conteúdo:


<html>
<head>
<title>Example Domain</title>
...
...
...
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You can use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

A seguir