Usar Public NAT con Compute Engine

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

Requisitos previos

Debes hacer lo siguiente antes de configurar NAT público.

Obtener permisos de gestión de identidades y accesos

El rol roles/compute.networkAdmin te da permisos para crear una pasarela NAT en Cloud Router, reservar y asignar direcciones IP NAT, y especificar subredes cuyo tráfico debe usar la traducción de direcciones de red de la pasarela NAT.

Configurar Google Cloud

Antes de empezar, 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.

  5. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  6. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  8. Verify that billing is enabled for your Google Cloud project.

  9. Install the Google Cloud CLI.

  10. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  11. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  12. Ejemplo

    A continuación, se muestra un ejemplo completo que incluye una pasarela NAT pública de muestra y una VM de Compute Engine de muestra que usa la pasarela NAT pública.

    Paso 1: Crea una red VPC y una subred

    Si ya tiene una red y una subred, puede saltarse este paso.

    Consola

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

      Ir a la página Redes de VPC

    2. Haz clic en Crear red VPC.

    3. Asigne un Nombre de custom-network1.

    4. En Subredes, selecciona Personalizado en Modo de creación de subred.

    5. En Nueva subred, introduce el Nombre subnet-us-east-192.

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

    7. Introduce un intervalo de direcciones IP de 192.168.1.0/24.

    8. Haz clic en Hecho y, a continuación, en Crear.

    gcloud

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

      gcloud compute networks create custom-network1 \
          --subnet-mode custom
    2. Especifica el prefijo de subred de tu primera región. En este ejemplo, asignamos 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 red de nube privada virtual (VPC) y una subred personalizadas.

    module "test-vpc-module" {
      source       = "terraform-google-modules/network/google"
      version      = "~> 10.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.

      Ve a la página Instancias de VM.

    2. Haz clic en Crear instancia.

    3. Especifica un nombre de nat-test-1 para tu instancia.

    4. En Region (Región), selecciona us-east4.

    5. Define Zone (Zona) como us-east4-c.

    6. Haz clic en el enlace Gestión, seguridad, discos, redes, único cliente.

    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. Define Red como custom-network1.
      2. Asigna el valor subnet-us-east-192 a Subred.
      3. En IP externa, selecciona Ninguna.
      4. Haz clic en Listo.
    9. Para crear e 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 cortafuegos que permita las conexiones SSH

    Consola

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

      Ir a la página Políticas de cortafuegos

    2. Haz clic en Crear regla de cortafuegos.

    3. Asigne un Nombre de allow-ssh.

    4. Especifica una red de custom-network1.

    5. En Dirección del tráfico, seleccione Entrada.

    6. En Acción tras coincidencia, selecciona Permitir.

    7. En Destinos, selecciona Todas las instancias de la red.

    8. En Filtro de origen, elija Intervalos de IPv4.

    9. Defina Intervalos de IP de origen como 35.235.240.0/20.

    10. En Protocolos y puertos, selecciona Protocolos y puertos especificados.

    11. Selecciona la casilla tcp e introduce el puerto 22.

    12. Haz 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 cortafuegos.

    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 IAP SSH 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 Google Cloud consola, ve a la página Identity-Aware Proxy.

      Ir a la página Identity-Aware Proxy

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

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

    4. En el panel de la derecha, haz clic en Añadir miembro.

    5. Para conceder acceso a los recursos a usuarios, grupos o cuentas de servicio, especifica sus direcciones de correo en el campo Miembros nuevos.

      Si solo quieres probar esta función, puedes introducir tu propia dirección de correo.

    6. Para conceder a los miembros acceso a los recursos mediante la función de reenvío de TCP de Cloud IAP, en la lista desplegable Rol, selecciona Cloud IAP > Usuario de túneles protegidos mediante IAP.

    7. Haz clic en Guardar.

    gcloud

    Este comando concede acceso SSH mediante IAP a todas las instancias de VM de tu proyecto. Si quieres conceder acceso SSH a una máquina virtual concreta mediante IAP, sigue las instrucciones de la Google Cloud consola.

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

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto
    • MEMBER_INFO: lista separada por comas de pares de miembros type:email. Ejemplos:
      • Para un usuario concreto: user:test-user@example.com
      • En 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 de IAP SSH 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: Inicia sesión en nat-test-1 y confirma que no tiene conexión a Internet

    Consola

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

      Ve a la página Instancias de VM.

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

    3. En el símbolo del sistema de la máquina virtual, introduce curl example.com y, a continuación, pulsa Intro.

      No deberías obtener ningún resultado. Si lo has hecho, es posible que hayas creado nat-test-1 con una dirección IP externa o que haya algún otro problema. Para solucionar problemas, consulta Las VMs pueden acceder a Internet inesperadamente sin Cloud NAT.

      Para finalizar el comando, puede que tengas que introducir Ctrl+C.

    gcloud

    1. Añade 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 has hecho, es posible que hayas creado nat-test-1 con una dirección IP externa o que haya algún otro problema. Para solucionar problemas, consulta Las VMs pueden acceder a Internet inesperadamente sin Cloud NAT.

      Para finalizar el comando, puede que tengas que introducir Ctrl+C.

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

    Debes crear el router de Cloud en la misma región que las instancias que usen NAT público. Cloud Router solo se usa para colocar información de NAT en las VMs. No se usa como parte de la pasarela NAT real.

    Esta configuración permite que todas las instancias de la región usen NAT pública para todos los intervalos de IP de alias y principales. También asigna automáticamente las direcciones IP externas a la pasarela de NAT. Para ver más opciones, consulta la documentación de Google Cloud CLI.

    Consola

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

      Ve a la página Cloud NAT.

    2. Haz clic en Empezar o en Crear pasarela NAT.

    3. Introduzca un nombre de pasarela de nat-config.

    4. Define la red de VPC como custom-network1.

    5. En Region (Región), selecciona us-east4.

    6. En Cloud Router, selecciona Crear router.

      1. Asigne un Nombre de nat-router.
      2. Haz clic en Crear.
    7. Haz clic en Crear.

    gcloud

    1. Crea un router de Cloud Router:

      gcloud compute routers create nat-router \
          --network custom-network1 \
          --region us-east4
    2. Añade 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: Intenta conectarte a Internet de nuevo

    La configuración NAT puede tardar hasta tres minutos en propagarse a la VM, así que espera al menos un minuto antes de intentar acceder a Internet de nuevo.

    Consola

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

      Ve a la página Instancias de VM.

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

    3. En el símbolo del sistema de la máquina virtual, introduce curl example.com y, a continuación, pulsa 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ía ver un resultado que contenga lo siguiente:

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

    Siguientes pasos