שימוש בכללים של חומת האש ב-VPC

בדף הזה מוסבר על הפקודות שמשמשות לעבודה עם כללי חומת האש של ענן וירטואלי פרטי (VPC), ומוצגות כמה דוגמאות לשימוש בהן. כללי חומת אש של VPC מאפשרים תעבורה או מונעים אותה ממכונות וירטואליות (VM) ברשת VPC או אליהן, על סמך מספר היציאה, התג או הפרוטוקול.

לפני שמתחילים

למידע נוסף על כללי חומת אש ב-VPC, כמו כללים משתמעים וכללים שנוצרו על ידי המערכת עבור רשתות ברירת מחדל, אפשר לעיין במאמר בנושא כללי חומת אש ב-VPC.

לפני שמגדירים כללי חומת אש, כדאי לעיין ברכיבים של כללי חומת אש כדי להכיר את רכיבי חומת האש שמשמשים ב- Google Cloud.

יצירת כללים לחומת האש ב-VPC

כללי חומת אש של VPC מוגדרים ברמת הרשת, והם חלים רק על הרשת שבה הם נוצרו. עם זאת, השם שבוחרים לכל אחד מהם צריך להיות ייחודי לפרויקט.

כלל חומת אש יכול להכיל טווחים של כתובות IPv4 או IPv6, אבל לא את שניהם.

כשיוצרים כלל לחומת האש, אפשר להפעיל את האפשרות 'רישום ביומן של כללים לחומת האש'. אם מפעילים את הרישום ביומן, אפשר להשמיט שדות של מטא-נתונים כדי לחסוך בעלויות האחסון. מידע נוסף זמין במאמר בנושא שימוש ברישום ביומן של כללים של חומת אש ב-VPC.

אם רוצים לציין כמה חשבונות שירות בשדה של חשבון השירות של היעד או המקור, צריך להשתמש ב-Google Cloud CLI, ב-API או בספריות הלקוח.

רשת ברירת המחדל מספקת כללים אוטומטיים של חומת אש בזמן היצירה. אם אתם משתמשים במסוף Google Cloud , רשתות בהתאמה אישית ורשתות במצב אוטומטי מאפשרות לכם ליצור בקלות חומות אש דומות במהלך יצירת הרשת. אם אתם משתמשים ב-CLI של gcloud או ב-API ורוצים ליצור כללים דומים של חומת אש לאלה שרשת ברירת המחדל מספקת, כדאי לעיין במאמר הגדרת כללים של חומת אש לתרחישי שימוש נפוצים.

המסוף

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

    למדיניות חומת האש

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

  3. מזינים שם לכלל חומת האש.

    השם הזה חייב להיות ייחודי בפרויקט.

  4. (אופציונלי) אפשר להפעיל רישום ביומן של כללים לחומת האש:

    • לוחצים על יומנים > מופעל.
    • כדי להשמיט מטא-נתונים, לוחצים על הצגת פרטי היומנים ומבטלים את הסימון של תיבת הסימון הכללת מטא-נתונים.
  5. מציינים את הרשת עבור כלל חומת האש.

  6. מציינים את העדיפות של הכלל.

    ככל שהמספר נמוך יותר, כך העדיפות גבוהה יותר.

  7. בשדה כיוון התנועה, בוחרים באפשרות 'תעבורת נתונים נכנסת' או 'תעבורת נתונים יוצאת'.

  8. בקטע פעולה בהתאמה, בוחרים באפשרות 'אישור' או 'דחייה'.

  9. מציינים את היעדים של הכלל.

    • אם רוצים שהכלל יחול על כל המקרים ברשת, בוחרים באפשרות כל המקרים ברשת.
    • אם רוצים שהכלל יחול על מקרים נבחרים לפי תגי רשת (תגי טירגוט), בוחרים באפשרות תגי טירגוט ספציפיים, ואז בשדה תגי טירגוט מקלידים את התגים שהכלל צריך לחול עליהם.
    • אם רוצים שהכלל יחול על מקרים נבחרים לפי חשבון השירות המשויך, בוחרים באפשרות Specified service account, מציינים אם חשבון השירות נמצא בפרויקט הנוכחי או בפרויקט אחר בשדה Service account scope, ואז בשדה Target service account בוחרים או מקלידים את שם חשבון השירות.
  10. בכלל כניסה, מציינים את מסנן המקור:

    • כדי לסנן תנועה נכנסת לפי טווחי כתובות IPv4 של המקור, בוחרים באפשרות טווחי כתובות IPv4 ומזינים את בלוקי ה-CIDR בשדה טווחי כתובות IPv4 של המקור. משתמשים ב-0.0.0.0/0 לכל מקור IPv4.
    • כדי לסנן תנועה נכנסת לפי טווחי IPv6 של המקור, בוחרים באפשרות טווחי IPv6 ומזינים את בלוקי ה-CIDR בשדה טווחי IPv6 של המקור. משתמשים ב-::/0 לכל מקור IPv6.
    • כדי לסנן תנועה נכנסת לפי תג רשת, בוחרים באפשרות תגי מקור ומקלידים את תגי הרשת בשדה תגי מקור. למידע על המגבלה על מספר תגי המקור, אפשר לעיין במאמר בנושא מגבלות לכל רשת. סינון לפי תג מקור זמין רק אם היעד לא צוין על ידי חשבון שירות.
    • כדי לסנן תנועה נכנסת לפי חשבון שירות, בוחרים באפשרות חשבון שירות, מציינים אם חשבון השירות נמצא בפרויקט הנוכחי או בפרויקט אחר בהיקף חשבון השירות, ואז בוחרים או מקלידים את שם חשבון השירות בשדה חשבון שירות המקור. סינון לפי חשבון שירות המקור זמין רק אם היעד לא צוין בתג הרשת.
    • אם רוצים, מציינים מסנן מקור שני. אי אפשר להשתמש באותם קריטריונים לסינון במסננים של מקור משני כמו במסננים של המקור הראשי. אפשר להשתמש בטווחים של כתובות IP של מקור יחד עם תגי מקור או חשבון שירות של מקור. קבוצת המקורות האפקטיבית היא איחוד של כתובות ה-IP בטווח המקורות והמופעים שמזוהים על ידי תגי רשת או חשבונות שירות. כלומר, אם טווח כתובות ה-IP של המקור או תגי המקור (או חשבונות השירות של המקור) תואמים לקריטריוני הסינון, המקור נכלל בקבוצת המקורות האפקטיבית.
    • אי אפשר להשתמש בתגי מקור ובחשבון שירות של מקור ביחד.

    מידע נוסף על שימוש בחשבון שירות ובטג רשת זמין במאמר סינון לפי חשבון שירות לעומת סינון לפי טג רשת.

  11. בכלל כניסה, מציינים את מסנן היעד:

    • כדי לסנן תנועה נכנסת לפי טווחי כתובות IPv4 של היעד, בוחרים באפשרות טווחי כתובות IPv4 ומזינים את בלוקי ה-CIDR בשדה טווחי כתובות IPv4 של היעד. אפשר להשתמש ב-0.0.0.0/0 לכל יעד IPv4.
    • כדי לסנן תנועה נכנסת לפי טווחי IPv6 של היעד, בוחרים באפשרות טווחי IPv6 ומזינים את בלוקי ה-CIDR בשדה טווחי IPv6 של היעד. משתמשים ב-::/0 לכל יעד IPv6.

    מידע נוסף זמין במאמר יעד לכללי תעבורה נכנסת.

  12. בכלל יציאה, מציינים את מסנן היעד:

    • כדי לסנן תנועה יוצאת לפי טווחי כתובות IPv4 של היעד, בוחרים באפשרות טווחי כתובות IPv4 ומזינים את בלוקי ה-CIDR בשדה טווחי כתובות IPv4 של היעד. אפשר להשתמש ב-0.0.0.0/0 לכל יעד IPv4.
    • כדי לסנן תנועה יוצאת לפי טווחי IPv6 של היעד, בוחרים באפשרות טווחי IPv6 ומזינים את בלוקי ה-CIDR בשדה טווחי IPv6 של היעד. משתמשים ב-::/0 לכל יעד IPv6.

    מידע נוסף זמין במאמר יעד לכללי יציאה.

  13. בכלל לתעבורת נתונים יוצאת (egress), מציינים את מסנן המקור:

    • כדי לסנן תנועה יוצאת לפי טווחי כתובות IPv4 של המקור, בוחרים באפשרות טווחי כתובות IPv4 ומזינים את בלוקי ה-CIDR בשדה טווחי כתובות IPv4 של המקור. משתמשים ב-0.0.0.0/0 לכל מקור IPv4.
    • כדי לסנן תנועה יוצאת לפי טווחי כתובות IPv6 של המקור, בוחרים באפשרות טווחי כתובות IPv6 ומזינים את בלוקי ה-CIDR בשדה טווחי כתובות IPv6 של המקור. משתמשים ב-::/0 לכל יעד IPv6.

    מידע נוסף מופיע במאמר מקור לכללי תעבורה יוצאת.

  14. מגדירים את הפרוטוקולים והיציאות שהכלל חל עליהם:

    • כדי שהכלל יחול על כל הפרוטוקולים ויציאות היעד, בוחרים באפשרות Allow all או Deny all, בהתאם לפעולה.
    • כדי להגדיר פרוטוקולים ספציפיים ויציאות יעד, בוחרים באפשרות פרוטוקולים ויציאות ספציפיים:
      • בוחרים באפשרות TCP כדי לכלול את פרוטוקול ה-TCP ויציאות היעד. מזינים all או רשימה של יציאות יעד שמופרדות בפסיקים, כמו 20-22, 80, 8080.
      • בוחרים באפשרות UDP כדי לכלול את פרוטוקול ה-UDP ואת יציאות היעד. מזינים all או רשימה של יציאות יעד שמופרדות בפסיקים, כמו 67-69, 123.
      • בוחרים באפשרות Other (אחר) כדי לכלול פרוטוקולים כמו icmp,‏ sctp או מספר פרוטוקול. לדוגמה, אפשר להשתמש ב-icmp או במספר הפרוטוקול 1 עבור IPv4 ICMP. משתמשים במספר הפרוטוקול 58 עבור IPv6 ICMP.

    מידע נוסף זמין במאמר בנושא פרוטוקולים ויציאות יעד.

  15. (אופציונלי) אתם יכולים ליצור את כלל חומת האש אבל לא לאכוף אותו על ידי הגדרת מצב האכיפה שלו למושבת. לוחצים על השבתת הכלל ואז בוחרים באפשרות מושבת.

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

gcloud

כדי ליצור כלל לחומת אש של VPC, משתמשים בפקודה gcloud compute firewall-rules create:

gcloud compute firewall-rules create RULE_NAME \
    [--network NETWORK; default="default"] \
    [--priority PRIORITY;default=1000] \
    [--direction (ingress|egress|in|out); default="ingress"] \
    [--action (deny | allow )] \
    [--target-tags TAG[,TAG,...]] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--source-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--source-tags TAG[,TAG, ...]] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--destination-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--rules (PROTOCOL[:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging] \
    [--logging-metadata LOGGING_METADATA]

משתמשים בפרמטרים באופן הבא. פרטים נוספים על כל אחת מהשיטות האלה זמינים במסמכי התיעוד של SDK reference.

  • --network הרשת של הכלל. אם לא מציינים רשת, הכלל נוצר ברשת default. אם אין לכם רשת ברירת מחדל או שאתם רוצים ליצור את הכלל ברשת ספציפית, אתם צריכים להשתמש בשדה הזה.
  • --priority ערך מספרי שמציין את העדיפות של הכלל. ככל שהמספר נמוך יותר, כך העדיפות גבוהה יותר.
  • --direction כיוון התנועה, ‏INGRESS או EGRESS.
  • --action הפעולה במקרה של התאמה, allow או deny. חובה להשתמש בדגל --rules.
  • מציינים יעד באחת מהדרכים הבאות:
    • אם רוצים שהכלל יחול על כל יעדי הטירגוט ברשת, צריך להשמיט את --target-tags ואת --target-service-accounts.
    • משתמשים בדגל --target-tags כדי להגדיר יעדים לפי תגי רשת.
    • משתמשים בדגל --target-service-accounts כדי להגדיר יעדים לפי חשבונות שירות משויכים.
  • כדי לציין טווחים של כתובות IPv4 או IPv6 בפורמט CIDR, משתמשים ב---destination-ranges בכלל הכניסה כדי לציין את היעד. אם לא מציינים את --destination-ranges, יעד התעבורה הנכנסת הוא כל כתובת IPv4, ‏ 0.0.0.0/0. מידע נוסף זמין במאמרים בנושא יעדים לכללי תעבורה נכנסת וכתובות IP ויעדים לכללי תעבורה נכנסת.

  • בכלל לתעבורת נתונים נכנסת (ingress), צריך לציין מקור:

    • --source-ranges משתמשים בדגל הזה כדי לציין טווחים של כתובות IPv4 או IPv6 של מקור בפורמט CIDR.
    • אם לא מציינים את --source-ranges, source-tags ו---source-service-accounts, מקור התנועה הנכנסת הוא כל כתובת IPv4,‏ 0.0.0.0/0.
    • --source-tags משתמשים בדגל הזה כדי לציין מופעי מקור לפי תגי רשת. סינון לפי תג מקור זמין רק אם היעד לא מוגדר על ידי חשבון שירות. מידע נוסף מופיע במאמר בנושא סינון לפי חשבון שירות לעומת תג רשת.
    • אפשר להשתמש ב---source-ranges וב---source-tags ביחד. אם מציינים את שניהם, קבוצת המקורות בפועל היא האיחוד של כתובות ה-IP בטווח המקורות והמופעים שמזוהים באמצעות תגי רשת, גם אם למופעים המתויגים אין כתובות IP בטווח המקורות.
    • --source-service-accounts משתמשים בדגל הזה כדי לציין מכונות לפי חשבונות השירות שבהם הן משתמשות. אפשר לסנן לפי חשבון שירות מקור רק אם יעד לא מצוין באמצעות תג רשת. מידע נוסף זמין במאמר בנושא סינון לפי חשבון שירות לעומת תג רשת. אפשר להשתמש ב---source-ranges וב---source-service-accounts ביחד. אם מציינים את שניהם, קבוצת המקור האפקטיבית היא האיחוד של כתובות ה-IP בטווח המקור והמופעים שמזוהים על ידי חשבונות השירות של המקור, גם אם למופעים שמזוהים על ידי חשבונות השירות של המקור אין כתובות IP בטווח המקור.
  • כדי לציין טווחים של כתובות IPv4 או IPv6 בפורמט CIDR, משתמשים ב---source-ranges כדי לחדד את המקור של כלל היציאה. אם לא מציינים את --source-ranges מקור היציאה הוא כל כתובת IPv4,‏ 0.0.0.0/0. מידע נוסף זמין במאמרים בנושא מקורות לכללי תעבורה יוצאת וכתובות IP וכתובות יעד לכללי תעבורה יוצאת.

  • בכלל ליציאת תנועה, מציינים יעד:

    • --destination-ranges משתמשים בדגל הזה כדי לציין טווחים של כתובות יעד מסוג IPv4 או IPv6 בפורמט CIDR.
    • אם לא מציינים את --destination-ranges, יעד היציאה הוא כל כתובת IPv4, ‏ 0.0.0.0/0.
  • --rules רשימה של פרוטוקולים ויציאות יעד שהכלל חל עליהם. משתמשים ב-all כדי שהכלל יחול על כל הפרוטוקולים וכל יציאות היעד. נדרש הדגל --action.

  • כברירת מחדל, כללי חומת האש נוצרים ונאכפים באופן אוטומטי, אבל אפשר לשנות את ההתנהגות הזו.

    • אם לא מציינים את --disabled וגם לא את --no-disabled, כלל חומת האש נוצר ונאכף.
    • --disabled מוסיפים את הדגל הזה כדי ליצור את הכלל בחומת האש, אבל לא לאכוף אותו. כלל חומת האש יישאר מושבת עד שתעדכנו את כלל חומת האש כדי להפעיל אותו.
    • --no-disabled מוסיפים את הדגל הזה כדי לוודא שהכלל בחומת האש נאכף.
  • --enable-logging | --no-enable-logging כשיוצרים או מעדכנים כלל, אפשר להפעיל את האפשרות 'רישום ביומן' עבור כללים של חומת האש. רישום ביומן של כללי חומת אש ב-VPC מאפשר לכם לבצע ביקורת, לאמת ולנתח את ההשפעות של כללי חומת האש. פרטים נוספים זמינים במאמר בנושא רישום ביומן של כללי חומת אש ב-VPC.

    • --logging-metadata אם מפעילים את האפשרות 'רישום ביומן', כברירת מחדל, רישום ביומן של כללי חומת האש כולל שדות בסיס ומטא-נתונים. כדי לחסוך בעלויות האחסון, אפשר להשמיט שדות של מטא-נתונים. מידע נוסף זמין במאמר בנושא שימוש ברישום ביומן של כללים של חומת אש ב-VPC.

Terraform

כדי ליצור כלל לחומת האש, אפשר להשתמש במשאב google_compute_firewall.

resource "google_compute_firewall" "rules" {
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  allow {
    protocol = "tcp"
    ports    = ["80", "443"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["web"]
}

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

API

יוצרים כלל לחומת האש ב-VPC.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "RULE_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK",
  ... other fields
}

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

  • PROJECT_ID: מזהה הפרויקט שבו נמצאת רשת ה-VPC.
  • NETWORK: השם של רשת ה-VPC שבה נוצר כלל חומת האש.
  • RULE_NAME: השם של כלל חומת האש.

  • לכלל חומת אש לתעבורת נתונים נכנסת, מציינים את המקור והיעד של התעבורה הנכנסת:

    • משתמשים בשדות sourceRanges, sourceTags או sourceServiceAccounts כדי לציין את מקור הכניסה.

    • sourceRanges יכול להיות טווח של כתובות IPv4 או IPv6, אבל לא שילוב של שניהם. כדי להשתמש בטווח 0.0.0.0/0, לא מציינים שדה.

    • אי אפשר להשתמש בשדות sourceTags ו-sourceServiceAccounts ביחד. עם זאת, אפשר להשתמש ב-sourceRanges עם sourceTags או עם sourceServiceAccounts. אם כן, החיבור צריך להתאים לאחד מהם כדי שכלל חומת האש יחול.

    • בשדות היעד, אם משתמשים בשדה sourceTags, אי אפשר להשתמש בשדה targetServiceAccounts. חובה להשתמש בשדה targetTags או לא להשתמש בשדה יעד. באופן דומה, אם משתמשים בשדה sourceServiceAccounts, אי אפשר להשתמש בשדה targetTags. אם לא מציינים שדה יעד, הכלל חל על כל היעדים ברשת.

    • משתמשים בשדה destinationRanges כדי לציין את יעד הכניסה. ‫destinationRanges יכול להיות טווח של כתובות IPv4 או IPv6, אבל לא שילוב של שניהם.
      אם לא מציינים יעד, Google Cloud משתמש ב-0.0.0.0/0. מידע נוסף זמין במאמרים בנושא יעדים לכללי תעבורה נכנסת וכתובות IP ויעדים לכללי תעבורה נכנסת.

  • לכלל חומת אש לתעבורת נתונים יוצאת, מציינים את המקור והיעד של התעבורה היוצאת:

    • משתמשים בשדה sourceRanges כדי לציין את מקור היציאה. sourceRange יכול להיות טווח של כתובות IPv4 או IPv6, אבל לא שילוב של שניהם.
      אם לא מציינים מקור, Google Cloud המערכת משתמשת בערך 0.0.0.0/0. מידע נוסף זמין במאמרים בנושא מקורות לכללי תעבורה יוצאת וכתובות IP וכתובות יעד לכללי תעבורה יוצאת.

    • משתמשים בשדה destinationRanges כדי לציין את היעד. ‫destinationRanges יכול להיות טווח של כתובות IPv4 או IPv6, אבל לא שילוב של שניהם.
      אם לא מציינים יעד, Google Cloudהמערכת משתמשת ב-0.0.0.0/0. משתמשים בשדה targetTags או targetServiceAccounts כדי לציין על אילו יעדים הכלל חל. אם לא מציינים שדה יעד, הכלל חל על כל היעדים ברשת.

מידע נוסף ותיאורים של כל שדה זמינים בשיטה firewalls.insert.

C#‎


using Google.Cloud.Compute.V1;
using System.Threading.Tasks;

public class CreateFirewallRuleAsyncSample
{
    public async Task CreateFirewallRuleAsync(
        // TODO(developer): Set your own default values for these parameters or pass different values when calling this method.
        string projectId = "your-project-id",
        string firewallRuleName = "my-test-firewall-rule",
        // Name of the network the rule will be applied to. Some available name formats:
        // projects/{project_id}/global/networks/{network}
        // global/networks/{network}
        string networkName = "global/networks/default")
    {
        Firewall firewallRule = new Firewall
        {
            Name = firewallRuleName,
            Network = networkName,
            Direction = ComputeEnumConstants.Firewall.Direction.Ingress,
            Allowed =
            {
                new Allowed
                {
                    Ports = { "80", "443" },
                    IPProtocol = "tcp"
                }
            },
            TargetTags = { "web" },
            Description = "Allows TCP traffic on port 80 and 443 from anywhere."
        };

        // Note that the default value of priority for the firewall API is 1000.
        // If you check the value of firewallRule.Priority at this point it
        // will be equal to 0, however it is not treated as "set" by the library, and thus
        // the default will be applied to the new rule. If you want to create a rule that
        // has priority == 0, you'll need to explicitly set it: firewallRule.Priority = 0.
        // You can use the firewallRule.HasPriority property to check if the priority has been set.
        // You can use the firewallRule.ClearPriority() method to unset the priority.

        // Initialize client that will be used to send requests. This client only needs to be created
        // once, and can be reused for multiple requests.
        FirewallsClient client = await FirewallsClient.CreateAsync();

        // Create the firewall rule in the specified project.
        var firewallRuleCreation = await client.InsertAsync(projectId, firewallRule);

        // Wait for the operation to complete using client-side polling.
        await firewallRuleCreation.PollUntilCompletedAsync();
    }
}

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createFirewallRule creates a firewall rule allowing for incoming HTTP and HTTPS access from the entire Internet.
func createFirewallRule(w io.Writer, projectID, firewallRuleName, networkName string) error {
	// projectID := "your_project_id"
	// firewallRuleName := "europe-central2-b"
	// networkName := "global/networks/default"

	ctx := context.Background()
	firewallsClient, err := compute.NewFirewallsRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer firewallsClient.Close()

	firewallRule := &computepb.Firewall{
		Allowed: []*computepb.Allowed{
			{
				IPProtocol: proto.String("tcp"),
				Ports:      []string{"80", "443"},
			},
		},
		Direction: proto.String(computepb.Firewall_INGRESS.String()),
		Name:      &firewallRuleName,
		TargetTags: []string{
			"web",
		},