שימוש ב-NAT ציבורי עם Compute Engine

בדף הזה מוצגת הדגמה של שער NAT ציבורי שמספק שירותי תרגום כתובות רשת למכונה וירטואלית של Compute Engine. לפני שמתחילים, כדאי לקרוא את סקירת ה-NAT הציבורי.

דרישות מוקדמות

לפני שמגדירים NAT ציבורי, צריך לבצע את הפעולות הבאות.

קבלת הרשאות IAM

ההרשאה roles/compute.networkAdmin מאפשרת ליצור שער NAT ב-Cloud Router, להזמין ולהקצות כתובות IP של NAT, ולציין רשתות משנה (subnets) שהתעבורה שלהן צריכה להשתמש בתרגום כתובות רשת (NAT) דרך שער ה-NAT.

הגדרה Google Cloud

לפני שמתחילים, צריך להגדיר את הפריטים הבאים ב- Google Cloud.

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  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 role (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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  6. To initialize the gcloud CLI, run the following command:

    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 role (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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  11. To initialize the gcloud CLI, run the following command:

    gcloud init

דוגמה

הדוגמה הבאה היא דוגמה מקצה לקצה שמציגה שער NAT ציבורי לדוגמה ומכונת VM לדוגמה ב-Compute Engine שמשתמשת בשער NAT הציבורי.

שלב 1: יצירת רשת VPC ורשת משנה

אם כבר יש לכם רשת ותת-רשת, אתם יכולים לדלג על השלב הזה.

המסוף

  1. נכנסים לדף VPC networks במסוף Google Cloud .

    לדף VPC networks

  2. לוחצים על יצירת רשת VPC.

  3. מזינים שם של custom-network1.

  4. בקטע Subnets (רשתות משנה), מגדירים את Subnet creation mode (מצב יצירת רשת משנה) לערך Custom (מותאם אישית).

  5. בקטע New subnet (תת-רשת חדשה), מזינים Name (שם) של subnet-us-east-192.

  6. בקטע אזור, בוחרים באפשרות us-east4.

  7. מזינים טווח כתובות IP של 192.168.1.0/24.

  8. לוחצים על Done ואז על Create.

gcloud

  1. יוצרים רשת VPC חדשה במצב מותאם אישית בפרויקט:

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
  2. מציינים את קידומת רשת המשנה לאזור הראשון. בדוגמה הזו, אנחנו מקצים את הערך 192.168.1.0/24 לאזור us-east4.

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

Terraform

אתם יכולים להשתמש במודול Terraform כדי ליצור רשת ותת-רשת בהתאמה אישית של ענן וירטואלי פרטי (VPC).

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

שלב 2: יצירת מכונה וירטואלית בלי כתובת IP חיצונית

המסוף

  1. נכנסים לדף VM instances במסוף Google Cloud .

    לדף VM instances

  2. לוחצים על Create instance.

  3. מציינים שם של nat-test-1 למכונה.

  4. מגדירים את Region לערך us-east4.

  5. מגדירים את Zone (אזור) לערך us-east4-c.

  6. לוחצים על הקישור Management, security, disks, networking, sole tenancy.

  7. נכנסים לכרטיסייה Networking.

  8. בקטע Network interfaces, לוחצים על Edit ליד ממשק ברירת המחדל של מכונת ה-VM.

    1. מגדירים את Network ל-custom-network1.
    2. מגדירים את Subnetwork ל-subnet-us-east-192.
    3. מגדירים את כתובת IP חיצונית ל-None.
    4. לוחצים על סיום.
  9. כדי ליצור את המכונה ולהפעיל אותה, לוחצים על Create.

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

אתם יכולים להשתמש במשאב של Terraform כדי ליצור מכונה וירטואלית.

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

שלב 3: יוצרים כלל של חומת אש שמאפשר חיבורי SSH

המסוף

  1. במסוף Google Cloud , עוברים לדף מדיניות חומת אש.

    כניסה לדף Firewall policies

  2. לוחצים על יצירת כלל חומת אש.

  3. מזינים שם של allow-ssh.

  4. מציינים רשת של custom-network1.

  5. מגדירים את Direction of traffic ל-Ingress.

  6. מגדירים את הפעולה בהתאמה לאישור.

  7. מגדירים את היעדים לכל המופעים ברשת.

  8. מגדירים את Source filter (מסנן מקור) לערך IPv4 ranges (טווחים של כתובות IPv4).

  9. מגדירים את Source IP ranges (טווחים של כתובות IP של המקור) לערך 35.235.240.0/20.

  10. מגדירים את הפרוטוקולים והיציאות לפרוטוקולים ויציאות שצוינו.

  11. מסמנים את תיבת הסימון tcp ומזינים את היציאה 22.

  12. לוחצים על יצירה.

gcloud

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

Terraform

אתם יכולים להשתמש במשאב של Terraform כדי ליצור כלל חומת אש.

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

שלב 4: יוצרים הרשאות SSH ל-IAP עבור מופע הבדיקה

בשלב מאוחר יותר, משתמשים בשרת proxy לאימות זהויות (IAP) כדי להתחבר למופע הבדיקה.

המסוף

  1. נכנסים לדף שרת proxy לאימות זהויות (IAP) במסוף Google Cloud .

    כניסה לדף 'שרת proxy לאימות זהויות (IAP)'

  2. לוחצים על הכרטיסייה SSH and TCP resources (משאבי SSH ו-TCP).

  3. כדי לעדכן את ההרשאות של החברים במשאבים, מסמנים את התיבה לצד All Tunnel Resources > us-east4-c > nat-test-1.

  4. בחלונית השמאלית, לוחצים על הוספת חבר.

  5. כדי לתת למשתמשים, לקבוצות או לחשבונות שירות גישה למשאבים, בשדה New members מציינים את כתובות האימייל שלהם.

    אם אתם רק בודקים את התכונה הזו, אתם יכולים להזין את כתובת האימייל שלכם.

  6. כדי לתת לחברים גישה למשאבים באמצעות התכונה "העברת TCP" של Cloud IAP, ברשימה הנפתחת Role בוחרים באפשרות Cloud IAP > IAP-secured Tunnel User.

  7. לוחצים על Save.

gcloud

הפקודה הזו מעניקה גישת SSH באמצעות IAP לכל המכונות הווירטואליות בפרויקט. אם רוצים להעניק גישת SSH באמצעות IAP למכונה וירטואלית ספציפית, צריך לפעול לפי ההוראות במסוף Google Cloud .

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

מחליפים את מה שכתוב בשדות הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫MEMBER_INFO: רשימה מופרדת בפסיקים של זוגות של חברים type:email. דוגמאות:
    • למשתמשים פרטיים: user:test-user@example.com
    • לקבוצה: group:admins@example.com
    • לחשבון שירות: serviceAccount:test123@example.domain.com

Terraform

אתם יכולים להשתמש במשאב של Terraform כדי ליצור הרשאות SSH ל-IAP עבור מכונת הבדיקה.

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

שלב 5: מתחברים ל-nat-test-1 ומוודאים שאין לו גישה לאינטרנט

המסוף

  1. נכנסים לדף VM instances במסוף Google Cloud .

    לדף VM instances

  2. בעמודה Connect של nat-test-1, לוחצים על החץ לתפריט הנפתח SSH ובוחרים באפשרות Open in browser window.

  3. בשורת הפקודה של ה-VM, מזינים את הפקודה curl example.com ומקישים על Enter.

    לא אמורות להתקבל תוצאות. אם כן, יכול להיות שיצרתם את nat-test-1 עם כתובת IP חיצונית, או שיש בעיה אחרת. כדי לפתור את הבעיה, קראו את המאמר למכונות הווירטואליות יש גישה לאינטרנט באופן בלתי צפוי בלי Cloud NAT.

    כדי לסיים את הפקודה, יכול להיות שתצטרכו להזין Ctrl+C.

gcloud

  1. מוסיפים מפתח SSH של Compute Engine למארח המקומי:

    ssh-add ~/.ssh/google_compute_engine
    
  2. מתחברים אל nat-test-1 ומריצים פקודה:

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

    לא אמורה להתקבל תוצאה. אם כן, יכול להיות שיצרתם את nat-test-1 עם כתובת IP חיצונית, או שיש בעיה אחרת. כדי לפתור את הבעיה, קראו את המאמר למכונות הווירטואליות יש גישה לאינטרנט באופן בלתי צפוי בלי Cloud NAT.

    כדי לסיים את הפקודה, יכול להיות שתצטרכו להזין Ctrl+C.

שלב 6: יצירת הגדרת NAT באמצעות Cloud Router

צריך ליצור את Cloud Router באותו אזור שבו נמצאות המכונות הווירטואליות שמשתמשות ב-NAT ציבורי. Cloud Router משמש רק להצבת פרטי NAT במכונות הווירטואליות. הוא לא משמש כחלק משער NAT בפועל.

ההגדרה הזו מאפשרת לכל המכונות באזור להשתמש ב-Public NAT לכל טווחי ה-IP הראשיים והמשניים. הוא גם מקצה באופן אוטומטי את כתובות ה-IP החיצוניות לשער ה-NAT. אפשרויות נוספות מפורטות במאמרי העזרה בנושא Google Cloud CLI.

המסוף

  1. נכנסים לדף Cloud NAT במסוף Google Cloud .

    כניסה לדף Cloud NAT

  2. לוחצים על שנתחיל? או על יצירת שער NAT.

  3. מזינים את nat-config בשדה Gateway name.

  4. מגדירים את רשת ה-VPC ל-custom-network1.

  5. מגדירים את Region לערך us-east4.

  6. בקטע Cloud Router, בוחרים באפשרות יצירת נתב חדש.

    1. מזינים שם של nat-router.
    2. לוחצים על יצירה.
  7. לוחצים על יצירה.

gcloud

  1. יוצרים Cloud Router:

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. מוסיפים הגדרה לנתב:

    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

אתם יכולים להשתמש במשאב של Terraform כדי ליצור Cloud Router.

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

אתם יכולים להשתמש במודול של Terraform כדי ליצור הגדרת 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"
}

שלב 7: מנסים להתחבר שוב לאינטרנט

יכול להיות שיחלפו עד שלוש דקות עד שהגדרת ה-NAT תופץ למכונה הווירטואלית, אז המתינו לפחות דקה לפני שתנסו לגשת שוב לאינטרנט.

המסוף

  1. נכנסים לדף VM instances במסוף Google Cloud .

    לדף VM instances

  2. בעמודה Connect של nat-test-1, לוחצים על החץ לתפריט הנפתח SSH ובוחרים באפשרות Open in browser window.

  3. בשורת הפקודה של המכונה הווירטואלית, מזינים curl example.com ואז מקישים על Enter.

gcloud

מתחברים אל nat-test-1 ומריצים פקודה:

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

הפלט אמור להיראות כך:


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

המאמרים הבאים