כתובות IP יוצאות לשירותי App Engine

השירותים היוצאים בסביבה הרגילה של App Engine, כמו URL Fetch,‏ Sockets ו-Mail APIs, משתמשים במאגר גדול של כתובות IP. טווח כתובות ה-IP במאגר הזה כפוף לשינויים שגרתיים. למעשה, יכול להיות ששתי קריאות API רצופות מאותו יישום ייראו כאילו הן מגיעות משתי כתובות IP שונות.

אם אתם צריכים לדעת את כתובות ה-IP שמשויכות לתנועה היוצאת מהשירות שלכם, אתם יכולים למצוא את טווחי כתובות ה-IP הנוכחיים שכוללים את כתובות ה-IP של App Engine, או להגדיר כתובת IP סטטית לשירות שלכם.

כתובות IP לשירותי App Engine

אפשר למצוא את טווחי כתובות ה-IP הנוכחיים של שירותי App Engine באמצעות שני קובצי JSON שפורסמו על ידי Google:

  • ‫Google מפרסמת רשימה של כתובות IP בבעלות Google בקובץ goog.json.

  • Google מפרסמת גם רשימה של טווחי כתובות IP חיצוניות גלובליות ואזוריות שזמינות למשאבי Google Cloud של לקוחות ב-cloud.json.

אם מסירים את כל הטווחים ב-cloud.json מאלה שב-goog.json, מקבלים קבוצה גדולה של כתובות IP שמשמשות את Google APIs הגלובליים ושירותים אחרים של Google, כולל מוצרים שפונים ללקוחות מחוץ ל- Google Cloud. הרשימות האלה מתעדכנות לעיתים קרובות.

אפשר להשתמש בסקריפט Python הבא כדי ליצור רשימה של טווחי כתובות IP שכוללים את אלה שמשמשים את Google APIs והשירותים של Google.

מידע על הרצת הסקריפט מופיע במאמר איך מריצים סקריפט.

from __future__ import print_function

import json

try:
    from urllib import urlopen
except ImportError:
    from urllib.request import urlopen
    from urllib.error import HTTPError

import netaddr

IPRANGE_URLS = {
    "goog": "https://www.gstatic.com/ipranges/goog.json",
    "cloud": "https://www.gstatic.com/ipranges/cloud.json",
}


def read_url(url):
    try:
        return json.loads(urlopen(url).read())
    except (IOError, HTTPError):
        print("ERROR: Invalid HTTP response from %s" % url)
    except json.decoder.JSONDecodeError:
        print("ERROR: Could not parse HTTP response from %s" % url)


def get_data(link):
    data = read_url(link)
    if data:
        print("{} published: {}".format(link, data.get("creationTime")))
        cidrs = netaddr.IPSet()
        for e in data["prefixes"]:
            if "ipv4Prefix" in e:
                cidrs.add(e.get("ipv4Prefix"))
            if "ipv6Prefix" in e:
                cidrs.add(e.get("ipv6Prefix"))
        return cidrs


def main():
    cidrs = {group: get_data(link) for group, link in IPRANGE_URLS.items()}
    if len(cidrs) != 2:
        raise ValueError("ERROR: Could process data from Google")
    print("IP ranges for Google APIs and services default domains:")
    for ip in (cidrs["goog"] - cidrs["cloud"]).iter_cidrs():
        print(ip)


if __name__ == "__main__":
    main()

הגדרה של כתובת IP סטטית לשיחות יוצאות

כדי להגדיר כתובת IP סטטית לשירות בסביבה רגילה של App Engine, משתמשים בגישה ל-VPC ללא שרת עם Cloud Router ו-Cloud NAT. באמצעות גישה ל-VPC ללא שרת, אפשר לשלוח תעבורת נתונים יוצאת לרשת של הענן הווירטואלי הפרטי (VPC). באמצעות שער של תרגום כתובות רשת (NAT) ב-VPC, אפשר לנתב את התנועה של App Engine דרך כתובת IP ייעודית.

ניתוב התעבורה דרך Cloud NAT לא גורם להוספת צעד נוסף במקבץ הרשת (network stack), כי שער Cloud NAT ו-Cloud Router מספקים רק מישור בקרה, והמנות לא עוברות דרך שער Cloud NAT או Cloud Router.

בשלבים הבאים מוסבר איך להגדיר כתובת IP סטטית יוצאת לשירות בסביבה הרגילה של App Engine.

  1. מוודאים שיש לכם את התפקיד roles/compute.networkAdmin או תפקיד בהתאמה אישית עם אותן הרשאות.

  2. יוצרים תת-רשת (subnet) בתוך רשת ה-VPC לתעבורה של App Engine. כך מוודאים שמשאבים אחרים ברשת ה-VPC לא יכולים להשתמש בכתובת ה-IP הסטטית.

    gcloud compute networks subnets create SUBNET_NAME \
        --range=RANGE \
        --network=NETWORK_NAME \
        --region=REGION

    בפקודה שלמעלה, מחליפים את:

    • SUBNET_NAME בשם שרוצים לתת לרשת המשנה.
    • RANGE עם טווח כתובות ה-IP בפורמט CIDR שרוצים להקצות לתת-הרשת הזו (למשל 10.124.0.0/28)
    • NETWORK_NAME בשם של רשת ה-VPC.
    • REGION באזור של שירות App Engine.
  3. מחברים את שירות App Engine לרשת המשנה.

    פועלים לפי ההוראות במאמר חיבור לרשת VPC ומציינים את השם של רשת המשנה שיצרתם בשלב הקודם עבור רשת המשנה של המחבר.

  4. יוצרים Cloud Router חדש. ‫Cloud Router הוא רכיב חיוני של מישור הבקרה ב-Cloud NAT.

    gcloud compute routers create ROUTER_NAME \
        --network=NETWORK_NAME \
        --region=REGION

    בפקודה שלמעלה, מחליפים את:

    • ROUTER_NAME בשם של משאב Cloud Router שרוצים ליצור.
    • NETWORK_NAME בשם של רשת ה-VPC.
    • REGION באזור שבו רוצים ליצור שער NAT.
  5. שמירת כתובת IP סטטית.

    זו הכתובת שבה השירות ישתמש כדי לשלוח תעבורה יוצאת. משאב של כתובת IP שמורה שומר על כתובת ה-IP הבסיסית כשהמשאב שהוא משויך אליו נמחק ונוצר מחדש. כתובת ה-IP הזו נכללת במכסת כתובות ה-IP הסטטיות בפרויקט Google Cloud .

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    בפקודה שלמעלה, מחליפים את:

    • ORIGIN_IP_NAME בשם שרוצים להקצות למשאב של כתובת ה-IP.
    • REGION עם האזור שבו יפעל נתב Cloud NAT. מומלץ לבחור את אותו אזור כמו שירות App Engine כדי לצמצם את זמן האחזור ואת עלויות הרשת.

    משתמשים בפקודה compute addresses describe כדי לראות את התוצאה:

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. יוצרים שער Cloud NAT ומציינים את כתובת ה-IP.

    תעבורת הנתונים שמגיעה מרשת המשנה תעבור דרך השער הזה ותשתמש בכתובת ה-IP הסטטית שהזמנתם בשלב הקודם.

    gcloud compute routers nats create NAT_NAME \
        --router=ROUTER_NAME \
        --region=REGION \
        --nat-custom-subnet-ip-ranges=SUBNET_NAME \
        --nat-external-ip-pool=ORIGIN_IP_NAME
      

    בפקודה שלמעלה, מחליפים את:

    • NAT_NAME בשם של משאב שער Cloud NAT שרוצים ליצור.
    • ROUTER_NAME בשם של Cloud Router.
    • REGION באזור שבו רוצים ליצור שער NAT.
    • ORIGIN_IP_NAME בשם של משאב כתובת ה-IP השמורה שיצרתם בשלב הקודם.
  7. מגדירים את הגדרת היציאה של חיבור לרשת (VPC) מאפליקציית serverless לערך all-traffic.

    כברירת מחדל, שירותי App Engine שמשתמשים בחיבור לרשת (VPC) מאפליקציית serverless שולחים רק תעבורת נתונים פנימית לרשת ה-VPC שלכם. כדי לשלוח תעבורת נתונים עם יעדים חיצוניים לרשת ה-VPC שלכם כך שתהיה לה כתובת ה-IP הסטטית שציינתם, עליכם לשנות את הגדרת תעבורת הנתונים היוצאת (egress).

    מציינים את הגדרת היציאה בקובץ app.yaml של השירות:

    vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
    egress_setting: all-traffic

    מחליפים את:

    • PROJECT_ID במזהה הפרויקט ב- Google Cloud .
    • REGION בשם האזור שבו נמצא המחבר.
    • CONNECTOR_NAME בשם המחבר name.

פורסים את השירות:

 gcloud app deploy