Usa NAT pública con Compute Engine

En esta página, se muestra una demostración de una puerta de enlace NAT pública que proporciona servicios de traducción de direcciones de red para una instancia de VM de Compute Engine. Antes de comenzar, lee la descripción general de NAT pública.

Requisitos previos

Antes de configurar la NAT pública, debes hacer lo siguiente.

Obtén permisos de IAM

La función roles/compute.networkAdmin te da permisos para crear una puerta de enlace NAT en Cloud Router, reservar y asignar direcciones IP de NAT y especificar subredes cuyo tráfico debería usar la traducción de direcciones de red a través de la puerta de enlace NAT.

Configura Google Cloud

Antes de comenzar, configura los siguientes elementos en 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

Ejemplo

El siguiente es un ejemplo de extremo a extremo que muestra una puerta de enlace de NAT pública de muestra y una VM de Compute Engine de muestra que usa la puerta de enlace de NAT pública.

Paso 1: Crea una subred y una red de VPC

Si ya tienes una red y una subred, puedes omitir este paso.

Consola

  1. En la consola de Google Cloud, ve a la página Redes de VPC.

    Ir a la página Redes de VPC

  2. Haz clic en Crear red de VPC

  3. En Nombre ingresa custom-network1.

  4. En Subredes, establece Modo de creación de subred como Personalizado.

  5. En Subred nueva, ingresa el nombre subnet-us-east-192.

  6. En Región, selecciona us-east4.

  7. Ingresa un rango de direcciones IP de 192.168.1.0/24.

  8. Haga clic en Listo y, luego, en Crear.

gcloud

  1. Crea una nueva red de VPC en modo personalizado en tu proyecto:

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
  2. Especifica el prefijo de subred para tu primera región. En este ejemplo, se asigna 192.168.1.0/24 a la región us-east4.

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

Terraform

Puedes usar un módulo de Terraform para crear una subred y una red de nube privada virtual (VPC) personalizadas.

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"
    }
  ]
}

Paso 2: Crea una instancia de VM sin dirección IP externa

Consola

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. Haga clic en Crear instancia.

  3. En Nombre, especifica nat-test-1 para tu instancia.

  4. Establece Región en us-east4.

  5. Configura Zona como us-east4-c.

  6. Haz clic en el vínculo Administración, seguridad, discos, redes, usuario único.

  7. Haz clic en la pestaña Redes.

  8. En Interfaces de red, haz clic en Editar en la interfaz predeterminada de la VM.

    1. Establece Red en custom-network1.
    2. Establece Subred en subnet-us-east-192.
    3. Configura IP externa como Ninguna.
    4. Haga clic en Listo.
  9. Para crear y, luego, iniciar la instancia, haz clic en Crear.

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

Puedes usar un recurso de Terraform para crear una instancia 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
  }
}

Paso 3: Crea una regla de firewall que admita conexiones SSH

Console

  1. En la consola de Google Cloud, ve a la página Políticas de firewall.

    Ir a la página Políticas de firewall

  2. Haz clic en Crear regla de firewall.

  3. Ingresa un Nombre de allow-ssh.

  4. En Red, especifica custom-network1.

  5. Configura Dirección del tráfico como Entrada.

  6. Establece Acción en caso de coincidencia en Permitir.

  7. Configura Destinos como Todas las instancias de la red.

  8. Configura Filtro de fuente como Rangos de IPv4.

  9. Configura Rangos de IP de origen como 35.235.240.0/20.

  10. Configura Protocolos y puertos como Protocolos y puertos especificados.

  11. Selecciona la casilla de verificación tcp y, luego, ingresa el puerto 22.

  12. Haga clic en Crear.

gcloud

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

Terraform

Puedes usar un recurso de Terraform para crear una regla 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"]
}

Paso 4: Crea permisos de SSH de para IAP para tu instancia de prueba

En un paso posterior, usa Identity-Aware Proxy (IAP) para conectarte a tu instancia de prueba.

Consola

  1. En la consola de Google Cloud, ve a la página Identity-Aware Proxy.

    Ir a la página de Identity-Aware Proxy

  2. Selecciona la pestaña Recursos de SSH y TCP.

  3. Para actualizar los permisos de los miembros en los recursos, selecciona la casilla de verificación junto a Todos los recursos del túnel > us-east4-c > nat-test-1.

  4. En el panel de la derecha, haz clic en Agregar miembro.

  5. Para otorgar a los usuarios, grupos o cuentas de servicio acceso a los recursos, en el campo Nuevos miembros, especifica sus direcciones de correo electrónico.

    Si solo estás probando esta función, puedes ingresar tu propia dirección de correo electrónico.

  6. Para otorgar a los miembros acceso a los recursos a través de la función de redireccionamiento de TCP de Cloud IAP, en la lista desplegable Función, selecciona Cloud IAP > Usuario de túnel protegido con IAP.

  7. Haga clic en Save.

gcloud

Este comando otorga acceso SSH mediante IAP a todas las instancias de VM en tu proyecto. Si quieres otorgar acceso SSH mediante IAP a una VM individual, usa las instrucciones de la consola de Google Cloud.

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

Reemplaza lo siguiente:

  • PROJECT_ID: El ID de tu proyecto
  • MEMBER_INFO: una lista separada por comas de pares type:email miembros Ejemplos:
    • Para un usuario individual: user:test-user@example.com
    • Para un grupo: group:admins@example.com
    • Para una cuenta de servicio: serviceAccount:test123@example.domain.com

Terraform

Puedes usar un recurso de Terraform para crear permisos SSH de IAP para tu instancia de prueba.

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

Paso 5: Accede a nat-test-1 y confirma que no pueda acceder a Internet

Consola

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. En nat-test-1, en la columna Conectar, haz clic en la flecha desplegable SSH y, luego, selecciona Abrir en ventana del navegador.

  3. En el símbolo del sistema de la VM, ingresa curl example.com y, luego, presiona Intro.

    No deberías obtener ningún resultado. Si lo haces, es posible que hayas creado nat-test-1 con una dirección IP externa o que haya otro problema. Para solucionar problemas, consulta Las VM pueden llegar a Internet de forma inesperada sin Cloud NAT.

    Para finalizar el comando, es posible que debas ingresar Ctrl+C.

gcloud

  1. Agrega una clave SSH de Compute Engine a tu host local:

    ssh-add ~/.ssh/google_compute_engine
    
  2. Conéctate a nat-test-1 y ejecuta un comando:

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

    No deberías obtener ningún resultado. Si lo haces, es posible que hayas creado nat-test-1 con una dirección IP externa o que haya otro problema. Para solucionar problemas, consulta Las VM pueden llegar a Internet de forma inesperada sin Cloud NAT.

    Para finalizar el comando, es posible que debas ingresar Ctrl+C.

Paso 6: Crea una configuración de NAT con Cloud Router

Debes crear el Cloud Router en la misma región que las instancias que usan NAT pública. Cloud Router solo se usa para colocar información de NAT en las VMs. No se usa como parte de la puerta de enlace NAT.

Esta configuración permite que todas las instancias de la región usen NAT pública para todos los rangos de IP principales y de alias de IP. También asigna de forma automática las direcciones IP externas de la puerta de enlace NAT. Para obtener más opciones, consulta la documentación de Google Cloud CL.

Consola

  1. En la consola de Google Cloud, ve a la página de Cloud NAT.

    Ir a la página de Cloud NAT

  2. Haz clic en Comenzar o Crear puerta de enlace de NAT.

  3. En Nombre de la puerta de enlace, ingresa nat-config.

  4. Establece Red de VPC en custom-network1.

  5. Establece Región en us-east4.

  6. En Cloud Router, seleccione Crear router nuevo.

    1. En Nombre ingresa nat-router.
    2. Haga clic en Crear.
  7. Haz clic en Crear.

gcloud

  1. Crea un Cloud Router:

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. Agrega una configuración al router:

    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

Puedes usar un recurso de Terraform para crear un Cloud Router.

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

Puedes usar un módulo de Terraform para crear una configuración de 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"
}

Paso 7: Vuelve a conectarte a Internet

La configuración de NAT puede tardar hasta tres minutos en propagarse a la VM, por lo que debes esperar al menos un minuto antes de volver a acceder a Internet.

Consola

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. En nat-test-1, en la columna Conectar, haz clic en la flecha desplegable SSH y, luego, selecciona Abrir en ventana del navegador.

  3. En el símbolo del sistema de la VM, ingresa curl example.com y, luego, presiona Intro.

gcloud

Conéctate a nat-test-1 y ejecuta un comando:

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

Deberías ver un resultado con el siguiente contenido:


<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>

¿Qué sigue?