Usa Public NAT con Compute Engine

Questa pagina mostra una dimostrazione di un gateway Public NAT che fornisce Network Address Translation per un'istanza VM di Compute Engine. Prima di iniziare, leggi la panoramica del NAT pubblico.

Prerequisiti

Prima di configurare Public NAT, devi effettuare le seguenti operazioni.

Ottenere le autorizzazioni IAM

Il ruolo roles/compute.networkAdmin ti consente di creare un gateway NAT su Cloud Router, prenotare e assegnare indirizzi IP NAT e specificare le sottoreti (subnet) il cui trafico deve utilizzare la Network Address Translation dal gateway NAT.

Configurare Google Cloud

Prima di iniziare, configura i seguenti elementi in 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

Esempio

Di seguito è riportato un esempio end-to-end che dimostra un esempio di Public NAT e una VM Compute Engine di esempio che utilizza il servizio NAT pubblico gateway VPN ad alta disponibilità.

Passaggio 1: crea una rete VPC e una subnet

Se hai già una rete e una sottorete, puoi saltare questo passaggio.

Console

  1. Nella console Google Cloud, vai alla pagina Reti VPC.

    Vai alla pagina Reti VPC

  2. Fai clic su Crea rete VPC.

  3. Inserisci un nome per custom-network1.

  4. In Subnet, imposta Modalità creazione subnet su Personalizzata.

  5. In Nuova subnet, inserisci subnet-us-east-192 come Nome.

  6. In Regione, seleziona us-east4.

  7. Inserisci un intervallo di indirizzi IP pari a 192.168.1.0/24.

  8. Fai clic su Fine, quindi su Crea.

gcloud

  1. Crea una nuova rete VPC in modalità personalizzata nel tuo progetto:

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
  2. Specifica il prefisso della subnet per la prima regione. In questo esempio, assegna 192.168.1.0/24 alla regione us-east4.

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

Terraform

Puoi utilizzare un modulo Terraform per creare una rete e una subnet VPC (Virtual Private Cloud) personalizzate.

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

Passaggio 2: crea un'istanza VM senza indirizzi IP esterni

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai alla pagina Istanze VM

  2. Fai clic su Crea istanza.

  3. Specifica un nome pari a nat-test-1 per l'istanza.

  4. Imposta Regione su us-east4.

  5. Imposta Zone su us-east4-c.

  6. Fai clic sul link Gestione, sicurezza, dischi, networking, single-tenancy.

  7. Fai clic sulla scheda Networking.

  8. In Interfacce di rete, fai clic su Modifica per l'interfaccia predefinita della VM.

    1. Imposta Rete su custom-network1.
    2. Imposta Subnet su subnet-us-east-192.
    3. Imposta IP esterno su Nessuno.
    4. Fai clic su Fine.
  9. Per creare e avviare l'istanza, fai clic su Crea.

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

Puoi utilizzare una risorsa Terraform per creare un'istanza 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
  }
}

Passaggio 3: crea una regola firewall che consenta le connessioni SSH

Console

  1. Nella console Google Cloud, vai alla pagina Criteri firewall.

    Vai alla pagina Criteri firewall

  2. Fai clic su Crea regola firewall.

  3. Inserisci un nome per allow-ssh.

  4. Specifica una rete di custom-network1.

  5. Imposta la Direzione del traffico su In entrata.

  6. Imposta Azione in caso di corrispondenza su Consenti.

  7. Imposta Destinazioni su Tutte le istanze nella rete.

  8. Imposta Filtro di origine su Intervalli IPv4.

  9. Imposta Intervalli IP di origine su 35.235.240.0/20.

  10. Imposta Protocolli e porte su Protocolli e porte specificati.

  11. Seleziona la casella di controllo tcp e inserisci la porta 22.

  12. Fai clic su Crea.

gcloud

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

Terraform

Puoi utilizzare una risorsa Terraform per creare una regola 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"]
}

Passaggio 4: crea le autorizzazioni SSH IAP per l'istanza di test

In un passaggio successivo, utilizza Identity-Aware Proxy (IAP) per connetterti all'istanza di test.

Console

  1. Nella console Google Cloud, vai alla pagina Identity-Aware Proxy.

    Vai alla pagina Identity-Aware Proxy

  2. Seleziona la scheda Risorse SSH e TCP.

  3. Per aggiornare le autorizzazioni dei membri per le risorse, seleziona la casella di controllo accanto a Tutte le risorse tunnel > us-east4-c > nat-test-1.

  4. Nel riquadro a destra, fai clic su Aggiungi membro.

  5. Per concedere a utenti, gruppi o account di servizio l'accesso alle risorse, Nel campo Nuovi membri, specifica i relativi indirizzi email.

    Se stai solo testando questa funzionalità, puoi inserire il tuo indirizzo email.

  6. a concedere ai membri l'accesso alle risorse tramite Cloud Funzionalità di inoltro TCP di IAP, nell'elenco a discesa Ruolo seleziona Cloud IAP > Utente del tunnel con protezione IAP.

  7. Fai clic su Salva.

gcloud

Questo comando concede l'accesso SSH utilizzando IAP a tutte le VM di Compute Engine nel tuo progetto. Se vuoi concedere l'accesso SSH utilizzando IAP su una singola VM, usa la console Google Cloud istruzioni.

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

Sostituisci quanto segue:

  • PROJECT_ID: il tuo ID progetto
  • MEMBER_INFO: un elenco separato da virgole di membri type:email coppie. Esempi:
    • Per un singolo utente: user:test-user@example.com
    • Per un gruppo: group:admins@example.com
    • Per un account di servizio: serviceAccount:test123@example.domain.com

Terraform

Puoi utilizzare una risorsa Terraform per creare autorizzazioni SSH IAP per l'istanza di test.

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

Passaggio 5: accedi a nat-test-1 e verifica che non riesca a raggiungere internet

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai alla pagina Istanze VM

  2. Per nat-test-1, nella colonna Connetti, fai clic sulla freccia del menu a discesa SSH e seleziona Apri nella finestra del browser.

  3. Al prompt dei comandi della VM, inserisci curl example.com e premi Invio.

    Non dovresti ottenere alcun risultato. In questo caso, potresti aver creato nat-test-1 con un indirizzo IP esterno o potrebbero verificarsi altri problemi. Per risolvere i problemi, vedi Le VM possono connettersi a internet in modo imprevisto senza Cloud NAT.

    Per terminare il comando, potresti dover inserire Ctrl+C.

gcloud

  1. Aggiungi una chiave SSH di Compute Engine all'host locale:

    ssh-add ~/.ssh/google_compute_engine
    
  2. Connettiti a nat-test-1 ed esegui un comando:

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

    Non dovrebbe essere restituito alcun risultato. In questo caso, potresti aver creato nat-test-1 con un indirizzo IP esterno o potrebbero verificarsi altri problemi. Per la risoluzione dei problemi, consulta Le VM possono raggiungere internet in modo imprevisto senza Cloud NAT.

    Per terminare il comando, potresti dover inserire Ctrl+C.

Passaggio 6: crea una configurazione NAT utilizzando il router Cloud

Devi creare il router Cloud nella stessa regione delle istanze che utilizzano Public NAT. Il router Cloud viene utilizzato solo per inserire NAT sulle VM. Non viene utilizzato come parte dell'effettivo gateway NAT.

Questa configurazione consente a tutte le istanze della regione di utilizzare la traduzione NAT pubblica per tutti gli intervalli IP principali e di alias. Inoltre, viene eseguito automaticamente alloca gli indirizzi IP esterni per il gateway NAT. Per ulteriori opzioni, vedi Consulta la documentazione di Google Cloud CLI.

Console

  1. Nella console Google Cloud, vai alla pagina Cloud NAT.

    Vai alla pagina Cloud NAT

  2. Fai clic su Inizia o Crea gateway NAT.

  3. Inserisci un nome gateway di nat-config.

  4. Imposta la Rete VPC su custom-network1.

  5. Imposta Regione su us-east4.

  6. In Router Cloud, seleziona Crea nuovo router.

    1. Inserisci un nome per nat-router.
    2. Fai clic su Crea.
  7. Fai clic su Crea.

gcloud

  1. Crea un router Cloud:

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. Aggiungi una configurazione 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

Puoi utilizzare una risorsa Terraform per creare un router Cloud.

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

Puoi utilizzare un modulo Terraform per creare una configurazione 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"
}

Passaggio 7: prova a riconnetterti a internet

La propagazione della configurazione NAT alla VM potrebbe richiedere fino a tre minuti. Attendi almeno un minuto prima di riprovare ad accedere a internet.

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai alla pagina Istanze VM

  2. Per nat-test-1, nella colonna Connetti, fai clic sul menu a discesa SSH. Freccia e seleziona Apri nella finestra del browser.

  3. Al prompt della VM, inserisci curl example.com e premi Invio.

gcloud

Connettiti a nat-test-1 ed esegui un comando:

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

Dovresti vedere un output che include i seguenti contenuti:


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

Passaggi successivi