הגדרת ניתוב TLS בשער

במדריך הזה מוסבר איך להגדיר שער כניסה (ingress) מבוסס-פרוקסי של Envoy עם משאבי Gateway ו-TLSRoute. אפשר גם לצרף TLSRoute משאב.

הפריסה שאתם מגדירים מוצגת בתרשים הבא. מאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי מפנה את התנועה לשרתי proxy של Envoy שפועלים כשער כניסה. פרוקסי Envoy משתמשים בניתוב TLS passthrough ומפנים תעבורה ישירות לשרתי HTTPS שפועלים במכונות וירטואליות של הבק-אנד.

העברת TLS דרך שער כניסה
העברת TLS דרך שער כניסה (לחיצה להגדלה)

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

חשוב להשלים את המשימות שמתוארות במאמר הכנה להגדרה של Envoy ועומסי עבודה בלי שרת Proxy.

הגדרת כללים לחומת אש

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

  1. יוצרים כלל לחומת האש:

    gcloud compute firewall-rules create allow-gateway-health-checks \
     --network=NETWORK_NAME \
     --direction=INGRESS \
     --action=ALLOW \
     --rules=tcp \
     --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \
     --target-tags=gateway-proxy
    
  2. הגדרת כלל של חומת אש שמאפשר תעבורת נתונים מכל מקור. עורכים את הפקודות של היציאות ושל טווחי כתובות ה-IP של המקור:

    gcloud compute firewall-rules create allow-gateway-ingress-traffic \
      --network=NETWORK_NAME \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp:443 \
      --source-ranges="0.0.0.0/0" \
      --target-tags=gateway-proxy
    

הגדרת הרשאות לניהול זהויות והרשאות גישה

בקטע הזה מציינים את חשבון השירות עבור שרתי ה-proxy של השער ומקצים לחשבון השירות את התפקידים הנכונים ב-IAM.

  1. יוצרים זהות של חשבון שירות לשרתי ה-proxy של השער:

    gcloud iam service-accounts create gateway-proxy
    
  2. מקצים את תפקידי ה-IAM הנדרשים לזהות של חשבון השירות:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/trafficdirector.client"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

הגדרת המשאב Gateway

  1. יוצרים קובץ בשם gateway443.yaml עם המפרט Gateway לתנועת HTTP:

    name: gateway443
    scope: gateway-proxy
    ports:
    - 443
    type: OPEN_MESH
    
  2. יוצרים את המשאב Gateway באמצעות המפרט gateway443.yaml:

    gcloud network-services gateways import gateway443 \
        --source=gateway443.yaml \
        --location=global
    

יצירת קבוצת מופעי מכונה מנוהלים עם שרתי proxy של Envoy

בקטע הזה יוצרים את שרתי ה-proxy של Envoy שמשויכים לשער הכניסה.

  1. יצירת תבנית של הגדרות מכונה עבור VM שמופעל בה פרוקסי של שירות Envoy שנפרס באופן אוטומטי. ההיקף של הנציגים מוגדר ל-gateway-proxy. אל תעבירו את יציאת ההצגה כפרמטר של הדגל --service-proxy.

    gcloud beta compute instance-templates create gateway-proxy \
      --machine-type=n1-standard-1 \
      --boot-disk-size=10GB \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=gateway-proxy \
      --network-interface=network=NETWORK_NAME,no-address \
      --service-account="gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --service-proxy=enabled,scope=gateway-proxy
    
  2. יוצרים קבוצה אזורית של מופעי מכונה מנוהלים מתבנית של הגדרות מכונה:

    gcloud compute instance-groups managed create gateway-proxy \
      --region=REGION \
      --size=1 \
      --template=gateway-proxy
    
  3. מגדירים את שם יציאת ההגשה לקבוצה של מופעי מכונה מנוהלים:

    gcloud compute instance-groups managed set-named-ports gateway-proxy \
      --named-ports=https:443 \
      --region=REGION
    

הגדרת מאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי

בקטע הזה יוצרים את מאזן עומסי הרשת החיצוני להעברת סיגנל ללא שינוי.

  1. יוצרים כתובת IP חיצונית סטטית אזורית:

    gcloud compute addresses create xnlb-REGION \
      --region=REGION
    
  2. מקבלים את כתובת ה-IP ששמורה למאזן העומסים החיצוני:

    gcloud compute addresses describe xnlb-REGION \
      --region=REGION --format='value(address)'
    

    כתובת ה-IP הזו משמשת כמשתנה IP_ADDRESS בהמשך מדריך ההגדרה הזה.

  3. יוצרים בדיקת תקינות לשרתי ה-Proxy של השער:

    gcloud compute health-checks create tcp xnlb-REGION \
      --region=REGION \
      --use-serving-port
    
  4. יוצרים שירות קצה עורפי לשרתי ה-proxy של השער:

    gcloud compute backend-services create xnlb-REGION \
      --health-checks=xnlb-REGION \
      --health-checks-region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --protocol=TCP \
      --region=REGION \
      --port-name=https
    
  5. מוסיפים את קבוצת מופעי המכונה המנוהלים כקצה עורפי:

    gcloud compute backend-services add-backend xnlb-REGION \
      --instance-group=gateway-proxy \
      --instance-group-region=REGION \
      --region=REGION
    
  6. יוצרים כלל העברה לניתוב תנועה לשרתי ה-Proxy של השער:

    gcloud compute forwarding-rules create xnlb-REGION \
      --region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --address=IP_ADDRESS \
      --ip-protocol=TCP \
      --ports=443 \
      --backend-service=xnlb-REGION \
      --backend-service-region=REGION
    

הגדרת קבוצת מופעי מכונה מנוהלים שמריצים שירות HTTPS

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

  1. יוצרים תבנית של הגדרות מכונה עם שירות HTTPS שנחשף ביציאה 443:

    gcloud compute instance-templates create td-https-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=https-td-server \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata=startup-script='#! /bin/bash
    
    sudo rm -rf /var/lib/apt/lists/*
    sudo apt-get -y clean
    sudo apt-get -y update
    sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    sudo apt-get -y update
    sudo apt-get -y install docker-ce
    sudo which docker
    echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json
    sudo service docker restart
    sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'
    
  2. יוצרים קבוצה של מופעי מכונה מנוהלים על סמך תבנית של הגדרות מכונה:

    gcloud compute instance-groups managed create https-td-mig-us-REGION \
      --zone=ZONE \
      --size=2 \
      --template=td-https-vm-template
    
  3. מגדירים את שם יציאת ההגשה לקבוצה של מופעי מכונה מנוהלים:

    gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \
      --named-ports=https:443 \
      --zone=ZONE
    
  4. יוצרים בדיקת תקינות:

    gcloud compute health-checks create https https-helloworld-health-check \
      --port=443
    
  5. יוצרים כלל של חומת אש שמאפשר חיבורים נכנסים של בדיקות תקינות למופעים ברשת:

    gcloud compute firewall-rules create https-vm-allow-health-checks \
       --network NETWORK_NAME --action allow --direction INGRESS \
       --source-ranges 35.191.0.0/16,130.211.0.0/22 \
       --target-tags https-td-server \
       --rules tcp:443
    
  6. יוצרים שירות לקצה עורפי גלובלי עם סכמת איזון עומסים של INTERNAL_SELF_MANAGED ומוסיפים את בדיקת תקינות:

    gcloud compute backend-services create https-helloworld-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --port-name=https \
      --health-checks https-helloworld-health-check
    
  7. מוסיפים את קבוצת מופעי המכונה המנוהלים כקצה עורפי לשירות לקצה העורפי:

    gcloud compute backend-services add-backend https-helloworld-service \
      --instance-group=https-td-mig-us-REGION \
      --instance-group-zone=ZONE \
      --global
    

הגדרת ניתוב באמצעות משאב TLSRoute

בסעיפים הקודמים הגדרתם משאב Gateway ושרת HTTPS. בשלב הבא, מחברים אותם באמצעות משאב TLSRoute שמשייך שם מארח של SNI לשירות קצה עורפי.

  1. יוצרים את המפרט TLSRoute בקובץ בשם tls_route.yaml:

    name: helloworld-tls-route
    gateways:
    - projects/PROJECT_NUMBER/locations/global/gateways/gateway443
    rules:
    - matches:
      - sniHost:
        - example.com
        alpn:
        - h2
      action:
       destinations:
       - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/https-helloworld-service
    

    בהוראה הקודמת, TLSRoute תואם ל-example.com כ-SNI ול-h2 כ-ALPN. אם ההתאמות ישתנו באופן הבא, TLSRoute יתאים ל-SNI או ל-ALPN:

    - matches:
      - sniHost:
        - example.com
      - alpn:
        - h2
    
  2. משתמשים במפרט tls_route.yaml כדי ליצור את משאב TLSRoute:

    gcloud network-services tls-routes import helloworld-tls-route \
        --source=tls_route.yaml \
        --location=global
    

מגדירים את Cloud Service Mesh לאיזון עומסים של התנועה בשירותים שצוינו במשאב TLSRoute בשרתי הקצה העורפיים בקבוצת המופעים המנוהלת.

אימות הפריסה

בקטע הזה מאמתים שאפשר לגשת לשירות מלקוח חיצוני דרך מאזן העומסים החיצוני של הרשת להעברת סיגנל ללא שינוי ודרך משאב Cloud Service Mesh‏ Gateway.

  1. מריצים את הפקודה curl הבאה כדי לוודא שיש קישוריות HTTP לשירותי הבדיקה שיצרתם:

    curl https://example.com --resolve example.com:443:IP_ADDRESS -k
    

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

 "path": "/",
  "headers": {
    "host": "example.com",
    "user-agent": "curl/7.81.0",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "example.com",
  "ip": "::ffff:10.142.0.2",
  "ips": [],
  "protocol": "https",
  "query": {},
  "subdomains": [],
  "xhr": false,
  "os": {
    "hostname": "0cd3aec9b351"
  },
  "connection": {
    "servername": "example.com"
  }
}

אימות באמצעות אימות שלילי

אפשר גם להריץ אימות שלילי. אם מריצים את הפקודות שבקטע הזה, הבקשה נפסלת כי היא לא עומדת בקריטריונים של TLSRoute.

בפקודה הבאה, ה-SNI לא תואם ל-example.com, ולכן הפקודה Gateway דוחה את החיבור:

curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k

בפקודה הבאה, פרוטוקול ALPN לא תואם ל-h2 (פרוטוקול HTTP2), ולכן Gateway דוחה את החיבור:

curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1

בפקודה הבאה, הלקוח יוצר חיבור של טקסט רגיל (לא מוצפן), ולכן Gateway דוחה את החיבור:

curl example.com:443 --resolve example.com:443:IP_ADDRESS -k

כל הפקודות הקודמות מחזירות את השגיאה הבאה:

curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.

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

  • במאמר רשימת משאבי Route מוסבר איך מציגים רשימה של משאבי ניתוב שמשויכים למשאב Mesh או Gateway.