סוכן להסתרת IP

בדף הזה מוסבר איך פועל מיסוך כתובות IP ב-Google Kubernetes Engine ‏ (GKE), ומוצגות אפשרויות הגדרה לתרחישים שונים.

בדף הזה מניחים שיש לכם ידע בנושא הסתרת IP ב-Kubernetes.

הסתרת IP ב-GKE

‫GKE יכול להשתמש בהסוואת IP כדי לשנות את כתובות ה-IP של המקור של מנות שנשלחות מ-Pods. כשמתבצעת הסוואה של כתובת IP בחבילת נתונים שמופקת על ידי Pod, ‏ GKE משנה את כתובת ה-IP של המקור של חבילת הנתונים מכתובת ה-IP של ה-Pod לכתובת ה-IP של הצומת הבסיסי. הסתרת כתובת ה-IP של המקור של מנות נתונים שימושית כשמקבל מוגדר לקבל מנות נתונים רק מכתובות ה-IP של הצמתים באשכול.

בצמתים של Linux, ‏ GKE מגדיר כללי iptables. ‫GKE משתמש ב-ip-masq-agent DaemonSet כדי להגדיר את מישור הנתונים המתאים.

ip-masq-agent לא נתמך במאגרי צמתים של Windows Server. עם זאת, צמתים של Windows מבצעים הסוואה של כתובות IP (תרגום כתובות רשת של המקור או SNAT) למנות שנשלחות ליעדים חיצוניים לאשכול, על ידי כתיבה מחדש של כתובת ה-IP של ה-Pod המקורית לכתובת ה-IP של הצומת. מערכת SNAT מדלגת על מנות שנשלחות לכתובות IP של צומת או של Pod באותו אשכול. אי אפשר להגדיר את ההתנהגות הזו בצמתי Windows.

הסתרת IP באשכולות רגילים

באשכולות רגילים, ההתנהגות של הסתרת כתובות ה-IP באשכול נקבעת לפי שלושה גורמים:

הטבלה הבאה מסכמת את ההגדרות של הסתרת כתובות IP באשכולות GKE רגילים:

הגדרת אשכול התנהגות ה-SNAT שמתקבלת

ה-DaemonSet‏ ip-masq-agent קיים באשכול, וגם רשימה מותאמת אישית nonMasqueradeCIDRs קיימת ב-ConfigMap‏ ip-masq-agent.

‫GKE שומר על כתובות ה-IP של פוד המקור עבור מנות שנשלחות ליעדים שצוינו ברשימה nonMasqueradeCIDRs.

‫GKE משנה את כתובות ה-IP של פוד המקור לכתובות ה-IP של צומת המקור עבור מנות שנשלחות ליעדים שלא צוינו ברשימה nonMasqueradeCIDRs.

ה-DaemonSet‏ ip-masq-agent קיים באשכול, אבל רשימת לקוחות nonMasqueradeCIDRs לא קיימת ב-ConfigMap‏ ip-masq-agent או ש-ConfigMap‏ ip-masq-agent לא קיים בכלל.

‫GKE שומר על כתובות ה-IP של פוד המקור עבור חבילות נתונים שנשלחות לקבוצה של יעדים שמוגדרים כברירת מחדל ללא הסוואה.

‫GKE משנה את כתובות ה-IP של הפודים של המקור לכתובות ה-IP של הצמתים של המקור עבור מנות שנשלחות ליעדים מחוץ ליעדים שמוגדרים כברירת מחדל ללא הסוואה.

ip-masq-agent DaemonSet לא קיים באשכול, וגם יצרתם את האשכול בלי הדגל --disable-default-snat.

‫GKE שומר על כתובות ה-IP של פוד המקור עבור חבילות נתונים שנשלחות לקבוצה של יעדים שמוגדרים כברירת מחדל ללא הסוואה.

‫GKE משנה את כתובות ה-IP של הפודים של המקור לכתובות ה-IP של הצמתים של המקור עבור מנות שנשלחות ליעדים מחוץ ליעדים שמוגדרים כברירת מחדל ללא הסוואה.

‫DaemonSet‏ ip-masq-agent לא קיים באשכול, וגם יצרתם את האשכול עם הדגל --disable-default-snat.

‫GKE שומר על כתובות ה-IP של המקור של ה-Pod עבור חבילות נתונים שנשלחות לכל היעדים.

כדאי לעיין במאמר שמירה על כתובות IPv4 של מקורות Pod ליעדים באינטרנט כדי לקבל מידע על שיקולים חשובים בנושא ניתוב כששומרים על כתובות IPv4 של מקורות Pod וצריך לנתב חבילות נתונים לאינטרנט.

הסתרת IP באשכולות במצב Autopilot

באשכולות Autopilot, ‏ GKE תמיד פורס ip-masq-agent DaemonSet. אפשר לשלוט בהתנהגות של הסתרת כתובות ה-IP באמצעות EgressNATPolicy, למעט מנות שנשלחות מ-Pods לטווחים של צמתים, Pods או שירותים באשכול. כדי להשתמש ב-EgressNATPolicy, אשכול Autopilot צריך לעמוד בשתי הדרישות הבאות:

  • האשכול צריך להשתמש ב-GKE מגרסה 1.23.4-gke.1600 ואילך, או מגרסה 1.22.7-gke.1500 ואילך.
  • האשכול צריך להיווצר כשGKE Dataplane V2 מופעל.

בטבלה הבאה מפורטות הגדרות של הסתרת כתובת IP באשכולות GKE במצב Autopilot:

הגדרת אשכול ב-Autopilot התנהגות ה-SNAT שמתקבלת

האשכול כולל EgressNATPolicy מותאם אישית שבו spec.action הוא NoSNAT שמכיל יעדים שלא מוסווים ומפורטים ב-spec.destinations[].

‫GKE שומר על כתובות ה-IP של המקור של ה-Pod עבור מנות שנשלחות ליעדים שצוינו ב-spec.destinations[] של EgressNATPolicy. ‫GKE עושה את זה על ידי תרגום של spec.destinations[] לרשימה nonMasqueradeCIDRs ב-configMap של ip-masq-agent.

‫GKE משנה את כתובות ה-IP של פוד המקור לכתובות ה-IP של צומת המקור עבור מנות שנשלחות ליעדים שלא צוינו ב-spec.destinations[] של EgressNATPolicy.

האשכול לא כולל EgressNATPolicy מותאם אישית.

מדיניות ברירת המחדל EgressNATPolicy והמדיניות Managed by GKE policy חלות שתיהן, ולכן מתקבלת ההתנהגות הבאה:

  • ‫GKE שומר על כתובות ה-IP של פוד המקור עבור חבילות נתונים שנשלחות לקבוצה של יעדים שמוגדרים כברירת מחדל ללא הסוואה.
  • ‫GKE משנה את כתובות ה-IP של הפודים של המקור לכתובות ה-IP של הצמתים של המקור עבור מנות שנשלחות ליעדים מחוץ ליעדים שמוגדרים כברירת מחדל ללא הסוואה.

תצורות לדוגמה

כדי לראות דוגמאות להסוואת כתובות IP ולהגדרות לפי סוג האשכול, אפשר להרחיב את הקטעים הבאים.

הסבר על ההגדרות המתקדמות

כשה-ip-masq-agent נפרס באופן אוטומטי

באשכולות במצב Autopilot, ‏ GKE תמיד פורס DaemonSet של ip-masq-agent.

באשכולות רגילים, GKE פורס ip-masq-agentDaemonSet כשלא מגדירים את הדגל --disable-default-snat (כלומר, מגדירים אותו לערך not) והאשכול משתמש באחת משילובי ההגדרות הבאים:

  • האשכול לא משתמש ב-GKE Dataplane V2, ואכיפת מדיניות הרשת מופעלת.

  • האשכול משתמש בטווח כתובות IP של Pod שלא מתאים לטווח 10.0.0.0/8.

כדי ש-ip-masq-agent DaemonSet יהיה יעיל, צריך גם לציין את רשימת nonMasqueradeCIDRs ב-ip-masq-agent ConfigMap. מידע נוסף מופיע במאמר בנושא איך מגדירים סוכן להסתרת כתובת IP.

כש-ip-masq-agent DaemonSet קיים באשכול, ‏ GKE מעדכן ומבצע התאמה של Pod להצגה בכל צומת באשכול.

יעדים שמוגדרים כברירת מחדל ולא מוסתרים

יעדי ברירת המחדל שאינם מסוג masquerade הם:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10
  • 192.0.0.0/24
  • 192.0.2.0/24
  • 192.88.99.0/24
  • 198.18.0.0/15
  • 198.51.100.0/24
  • 203.0.113.0/24
  • 240.0.0.0/4

יעדי ברירת המחדל שלא מוסתרים רלוונטיים לאשכולות עם ההגדרות הבאות:

יעדי ברירת המחדל שאינם מתחזים לא רלוונטיים לאשכולות עם ההגדרות הבאות:

האפקט של הדגל של --disable-default-snat

הדגל --disable-default-snat משנה את התנהגות ברירת המחדל של SNAT ב-GKE כך שכתובות ה-IP של הפודים במקור נשמרות עבור מנות שנשלחות לכל היעדים. ‫GKE מיישם את התנהגות ברירת המחדל של SNAT על ידי כך שהוא לא פורס אף ip-masq-agent DaemonSet באשכול.

לדגל --disable-default-snat אין השפעה כשבאשכול יש DaemonSet של ip-masq-agent:

אפשר להגדיר את הדגל --disable-default-snat על ידי עדכון של אשכול אחרי שהוא נוצר. בתנאי שלא נפרס ip-masq-agent DaemonSet באשכול, השבתת SNAT כברירת מחדל נכנסת לתוקף אחרי שהאשכול מחליף את כל הצמתים שלו – לפעמים אחרי כמה שעות. הסיבה לכך היא ש-GKE מתחשב בחלונות התחזוקה שהגדרתם כשמחליפים צמתים באשכול. אם לא הגדרתם חלון תחזוקה, תצטרכו להפעיל מחדש את הצמתים באשכול באופן ידני לפני שהדגל --disable-default-snat ישפיע.

הסוואה של כתובות לקישור מקומי

הטווח 169.254.0.0/16 משמש לכתובות IP מקומיות לקישור. הסוואה מקומית בקישור מתייחסת לשינוי של כתובת IP של מקור Pod לכתובת IP של מקור צומת עבור מנות שנשלחות ליעדים 169.254.0.0/16.

באשכולות Autopilot, כתובות ה-IP של ה-Pod המקוריות נשמרות תמיד עבור חבילות שנשלחות ליעדים 169.254.0.0/16.

כברירת מחדל, באשכולות רגילים נשמרות גם כתובות ה-IP של הפודים של המקור עבור מנות שנשלחות ליעדים 169.254.0.0/16.

אפשר להפעיל הסוואה של כתובות IP מקומיות ברשת באשכול רגיל על ידי ביצוע שני השלבים הבאים:

מאגרי תגים ו-Pods לאבחון עם hostNetwork: true

אלא אם מציינים כתובת IP מותאמת אישית של מקור לחבילות, פודים שפועלים עם hostNetwork: true וקונטיינרים לאבחון שולחים חבילות עם מקורות שתואמים לכתובת ה-IP של הצומת. ל-Pods שפועלים עם hostNetwork: true,‏ GKE מקצה ל-Pod את כתובת ה-IP של הצומת. ‫GKE לא מנהל כתובות IP עבור קונטיינרים לאבחון, כולל קונטיינרים לניפוי באגים בבעיות בצמתים באמצעות toolbox.

אשכולות Autopilot לא תומכים בהרצת Pods עם spec.hostNetwork: true. אי אפשר להריץ קונטיינרים של אבחון בצמתים של אשכול Autopilot כי אין אליהם גישה באמצעות SSH.

שמירה על מקורות כתובות ה-IPv4 של ה-Pod ליעדים באינטרנט

אם הגדרת ה-IP masquerade של האשכול היא אחת מההגדרות הבאות, GKE שומר על מקורות כתובות ה-IP של ה-Pod עבור מנות שנשלחות לכל היעדים, כולל יעדים באינטרנט:

  • באשכולות רגילים עם ip-masq-agent DaemonSet, אם הגדרתם את nonMasqueradeCIDRs ל-0.0.0.0 ב-ip-masq-agent ConfigMap.
  • באשכולות רגילים ללא ip-masq-agent DaemonSet, אם הגדרתם את הדגל --disable-default-snat.
  • באשכולות של Autopilot, אם עורכים את ברירת המחדל של EgressNATPolicy כך ש-spec.action הוא NoSNAT, ו-spec.destinations מכיל Cidr: 0.0.0.0/0.

מקורות IPv4 של פודים הם כתובות IPv4 פנימיות, כלומר אי אפשר לנתב אותן באינטרנט. לכן, כששומרים על כתובות IPv4 של Pod כמקור למנות שנשלחות לאינטרנט, צריך להשתמש בטכניקה כמו אחת מהאפשרויות הבאות כדי לנתב מנות אחרי שהן יוצאות מהצמתים של האשכול:

  • מוודאים שלרשת ה-VPC יש נתיב ברירת מחדל עם שער ברירת המחדל לאינטרנט כצעד הבא למעבר, ומגדירים שער Cloud NAT כדי לספק שירותי NAT ציבוריים לפחות לטווחים של כתובות IPv4 משניות של רשתות המשנה שמשמשות את ה-Pods באשכול. פרטים נוספים זמינים במאמר אינטראקציה עם GKE בסקירה הכללית של Cloud NAT.
  • מגדירים את רשת ה-VPC לשימוש בנתיב ברירת מחדל מותאם אישית, שהקפיצה הבאה שלו היא מכונה וירטואלית או מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי, שבהם המכונה הווירטואלית או הקצה העורפי של מאזן העומסים הוגדרו להעברת מנות לאינטרנט בשם ה-Pods.

שחזור להתנהגות ברירת המחדל של SNAT

כדי לשחזר את התנהגות ברירת המחדל של SNAT כש-ip-masq-agent DaemonSet קיים באשכול, צריך למחוק את ip-masq-agent ConfigMap המשויך. ה-DaemonSet‏ ip-masq-agent משחזר את התנהגות ברירת המחדל של הסתרת כתובת ה-IP בצמתים שהוא מנהל.

ip-masq-agent

כדי לשחזר את התנהגות ברירת המחדל של SNAT כש-ip-masq-agent DaemonSet לא קיים באשכול, צריך לשדרג את מאגר הצמתים (לוודא ש---disable-default-snat לא מוגדר באשכול).

השפעת מדיניות Egress NAT באשכולות Autopilot

מדיניות Egress NAT ב-GKE מאפשרת להגדיר הסוואה של כתובות IP באשכולות Autopilot. אתם יכולים להשתמש בהגדרת משאב מותאם אישית (CRD) של מדיניות GKE Egress NAT כדי לשנות את כתובות ה-IP של המקור של מנות שנשלחות מה-Pods.

מסיבות אבטחה או בגלל מיצוי של כתובות IP, אתם יכולים להשתמש בטכניקת מיסוך כדי להסתיר את כתובות ה-IP של הפודים בטווח כתובות ה-IP של הצמתים בתעבורת נתונים יוצאת לרשתות מקומיות. לדוגמה, אפשר להשתמש בטווח שאינו RFC-1918 עבור אשכולות Autopilot, ובטווח RFC-1918 עבור הצמתים. עם זאת, אם הפודים צריכים לתקשר עם רשתות מקומיות שגם משתמשות בטווח שאינו RFC-1918, יכול להיות שיהיה חפיפה בין כתובות ה-IP. כדי למנוע אובדן תנועה, אפשר להגדיר מדיניות NAT ליציאה כך שלא יפורסמו טווחי ה-Pods שאינם RFC-1918 ברשתות מקומיות. מדיניות NAT ליציאה מסווה את טווח ה-non RFC-1918 של ה-Pods כדי להשתמש בטווח ה-RFC-1918 של הצומת במקום. חשוב לוודא שטווח הצמתים לא חופף לטווח מקומי כלשהו, אחרת עלולה להיווצר לולאת תנועה.

‫GKE אוכף את ההתנהגות של הסתרת כתובות IP באשכולות Autopilot באמצעות התהליך הבא:

  1. מערכת GKE פורסת את בקר ה-Egress NAT ואת ip-masq-agent.
  2. יוצרים את מדיניות ה-NAT ליציאה.
  3. הבקר של GKE מתרגם את המדיניות ל-ip-masq-agent ConfigMap.
  4. ה-DaemonSet‏ ip-masq-agent קורא את ה-ConfigMap ואז GKE אוכף את התנהגות ההסוואה של כתובות ה-IP.

מדיניות שנוצרת באופן אוטומטי

‫GKE תומך בשתי מדיניות NAT ליציאה שנוצרות באופן אוטומטי:

  • ברירת מחדל: אפשר לערוך את המדיניות הזו.
  • מנוהלות על ידי GKE: כללי המדיניות האלה קבועים ואי אפשר לערוך אותם.

מדיניות ברירת המחדל

‫GKE מגדיר מראש קבוצה של טווחי כתובות IP שמשמשים כברירת מחדל. כשחבילות נתונים נשלחות ליעדים האלה, האשכול לא מסווה את כתובות ה-IP של המקורות ושומר על כתובות ה-IP של הפודים המקוריים. כדי לשנות את טווחי כתובות ה-IP שמוגדרים כברירת מחדל, אפשר לעיין במאמר בנושא עריכה ופריסה של מדיניות Egress NAT.

קובץ המניפסט הבא מתאר מדיניות NAT ליציאה שמוגדרת כברירת מחדל:

    Name:         default
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:45Z
      Generation:          2
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
          f:status:
        Manager:      egress-nat-controller
        Operation:    Update
        Time:         2022-03-16T21:05:45Z
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            f:destinations:
        Manager:         kubectl
        Operation:       Update
        Time:            2022-03-17T01:58:13Z
      Resource Version:  189346
      UID:               06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.0.0.0/8
        Cidr:  172.16.0.0/12
        Cidr:  192.168.0.0/16
        Cidr:  240.0.0.0/4
        Cidr:  192.0.2.0/24
        Cidr:  198.51.100.0/24
        Cidr:  203.0.113.0/24
        Cidr:  100.64.0.0/10
        Cidr:  198.18.0.0/15
        Cidr:  192.0.0.0/24
        Cidr:  192.88.99.0/24
    Status:
    Events:  <none>

טווחי ה-CIDR זהים לטווחי היעד שמוגדרים כברירת מחדל ללא הסוואה.

מנוהל על ידי מדיניות GKE

מדיניות GKE Egress NAT שומרת טווח סטטי של כתובות IP שנדרש כדי לשמור על פעולת האשכול. הטווח הסטטי הזה מכיל את טווחי כתובות ה-IP של ה-Pod, השירות והצומת של האשכול, ויכול להיות שהוא חופף למדיניות ברירת המחדל.

אפשר לזהות את המדיניות הזו באמצעות גיבוב דינמי של 8 בייט (gke-{CLUSTER_SHORT_HASH}) שמוקצה על ידי GKE. אי אפשר לערוך את המדיניות הזו.

במניפסט הבא מתוארת מדיניות שמנוהלת על ידי GKE בשם gke-bbfa6c0e-1:

    Name:         gke-bbfa6c0e-1
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:46Z
      Generation:          1
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
            f:destinations:
          f:status:
        Manager:         egress-nat-controller
        Operation:       Update
        Time:            2022-03-16T21:05:46Z
      Resource Version:  11699
      UID:               0201b5de-a6f6-4926-822b-31ed7cdee2c6
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.119.128.0/17
        Cidr:  10.120.0.0/22
        Cidr:  10.128.0.0/20
    Status:
    Events:  <none>

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