כתובות 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, צריך להשתמש בServerless VPC Access עם Cloud Router ו-Cloud NAT. באמצעות Serverless VPC Access, אפשר לשלוח תעבורת נתונים יוצאת (egress) לרשת הענן הווירטואלי הפרטי (VPC). באמצעות שער של תרגום כתובות רשת (NAT) ב-VPC, אפשר לנתב את התנועה של App Engine דרך כתובת IP ייעודית.

ניתוב התעבורה דרך Cloud NAT לא גורם להוספת עוד קפיצה במערך הרשת, כי שער 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