建立組織外部網路政策

本頁面說明如何在 Google Distributed Cloud (GDC) 實體隔離方案中,設定組織外部流量網路政策。

組織外部流量是指不同組織和外部端點之間的服務和工作負載通訊。

事前準備

如要設定組織外部流量網路政策,您必須具備下列條件:

建立組織外部政策

您可以定義輸入或輸出組織外部流量政策,管理不同組織和外部端點的服務與工作負載之間的通訊。

您可以建立全域組織外部流量專案網路政策,套用至組織中所有可用區的流量。如要進一步瞭解 GDC 宇宙中的全域資源,請參閱「多可用區總覽」。

如要將服務和工作負載連至其他組織中專案以外的目的地,必須取得明確核准。您必須停用資料竊取防護功能,才能允許組織外部流量。

建立全域輸入防火牆規則,允許組織外部流量

使用外部負載平衡器公開專案中的工作負載時,您也必須建立 ProjectNetworkPolicy 輸入政策,允許外部用戶端 IP 位址存取工作負載。

這項全域輸入政策適用於貴組織的所有可用區。

請按照下列步驟建立新的防火牆規則,並允許來自其他組織專案中工作負載的傳入流量:

控制台

  1. 在設定專案的 GDC 控制台中,依序點選導覽選單中的「網路」>「防火牆」,開啟「防火牆」頁面。
  2. 點選動作列中的「建立」,開始建立新的防火牆規則。
  3. 在「防火牆規則詳細資料」頁面中,填寫下列資訊:

    1. 在「Name」(名稱) 欄位中,輸入有效的防火牆規則名稱。
    2. 在「流量方向」部分,選取「輸入」,允許其他組織的工作負載傳入流量。
    3. 在「指定目標」部分中,選取下列其中一個選項:
      • 所有使用者工作負載:允許連線至您正在設定的專案工作負載。
      • 服務:表示這項防火牆規則會指定您正在設定的專案中的特定服務。
    4. 如果目標是專案服務,請從「Service」(服務) 下拉式選單的可用服務清單中,選取服務名稱。
    5. 在「來源」部分,選取「組織外部」,然後在「CIDR」欄位輸入其他組織的 CIDR 區塊,允許來自該組織網路的連線。
    6. 如果目標是所有使用者工作負載,請在「Protocols and ports」(通訊協定和通訊埠) 區段中選取下列其中一個選項:
      • 全部允許:允許使用任何通訊協定或通訊埠的連線。
      • 指定通訊協定和通訊埠:僅允許使用您在輸入防火牆規則對應欄位中指定的通訊協定和通訊埠進行連線。
  4. 在「防火牆規則詳細資料」頁面,點選「建立」。

您已允許其他組織的專案工作負載連線。建立防火牆規則後,規則會顯示在「防火牆」頁面的表格中。

API

設定並套用自訂 ProjectNetworkPolicy 輸入政策:

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-inbound-traffic-from-external
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - ipBlock:
        cidr: CIDR
EOF

更改下列內容:

  • GLOBAL_API_SERVER:全域 API 伺服器的 kubeconfig 路徑。詳情請參閱「全域和可用區 API 伺服器」。如果您尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一文瞭解詳情。
  • PROJECT:GDC 專案的名稱。
  • CIDR:其他組織的 CIDR 區塊。

外部負載平衡器會使用直接伺服器回傳 (DSR),保留來源外部 IP 位址,並在傳回路徑上略過負載平衡器,因此必須採用這項政策。

建立組織外部流量的全域輸出防火牆規則

如要將資料轉移至組織外部的服務,請先停用資料竊取防護功能。接著,您必須設定輸出防火牆規則,允許專案工作負載或服務的輸出流量。

本節說明如何在專案層級啟用傳出流量。如要瞭解如何在工作負載層級管理輸出連線能力,請參閱「NAT 總覽」。

這項全域輸出防火牆規則適用於貴組織的所有可用區。

請按照下列步驟建立新的防火牆規則,允許專案工作負載或服務的傳出流量,傳送至其他組織的工作負載:

控制台

  1. 在設定專案的 GDC 控制台中,依序點選導覽選單中的「網路」>「防火牆」,開啟「防火牆」頁面。
  2. 點選動作列中的「建立」,開始建立新的防火牆規則。
  3. 在「防火牆規則詳細資料」頁面中,填寫下列資訊:

    1. 在「Name」(名稱) 欄位中,輸入有效的防火牆規則名稱。
    2. 在「流量方向」部分,選取「輸出」,表示這項防火牆規則會控管傳出流量。
    3. 在「指定目標」部分中,選取下列其中一個選項:
      • 所有使用者工作負載:允許從您設定的專案工作負載連線。
      • 服務:表示這項防火牆規則會指定您正在設定的專案中的特定服務。
    4. 如果目標是專案服務,請從「Service」(服務) 下拉式選單的可用服務清單中,選取服務名稱。
    5. 在「To」(目標) 部分,選取「Outside the organization」(組織外部),然後在「CIDR」欄位輸入其他組織的 CIDR 區塊,允許連線至該組織的網路。
    6. 如果目標是所有使用者工作負載,請在「Protocols and ports」(通訊協定和通訊埠) 區段中選取下列其中一個選項:
      • 全部允許:允許使用任何通訊協定或通訊埠的連線。
      • 指定通訊協定和通訊埠:僅允許使用您在輸出防火牆規則對應欄位中指定的通訊協定和通訊埠進行連線。
  4. 在「防火牆規則詳細資料」頁面,點選「建立」。

您已允許與其他組織建立連線。建立防火牆規則後,規則會顯示在「防火牆」頁面的表格中。

API

如要啟用傳送至組織外部服務的傳出流量,請自訂 ProjectNetworkPolicy 資源。不過,由於資料竊取防範功能預設為啟用,因此系統不會強制執行自訂的 ProjectNetworkPolicy 輸出政策。可用區 API 伺服器會拒絕輸出政策,並顯示 Data Exfiltration Protection is enabled for Project PROJECT; cannot configure egress policies 訊息,因此全域輸出政策不會準備就緒。這是正常現象。

允許特定專案的資料竊取行為後,即可從該專案轉移工作負載。您允許的傳出流量是來源網路位址轉譯 (NAT),使用為專案分配的知名 IP 位址。

如要啟用自訂輸出政策,請按照下列步驟操作:

  1. 設定並套用自訂 ProjectNetworkPolicy 輸出政策,適用於專案中的所有使用者工作負載。

    請使用下列範例:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-outbound-traffic-to-external
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
      egress:
      - to:
        - ipBlock:
            cidr: CIDR
    EOF
    

    這項政策允許傳出流量傳送至 CIDR 區塊中位於組織外部的所有主機。啟用資料竊取防護功能後,系統不會強制執行政策。

  2. 確認政策尚未就緒。啟用資料竊取防護功能時,全域政策的 Ready 條件會顯示 status: "Unknown" 和原因 Reconciling,因為可用區 API 伺服器會拒絕該政策。

  3. 套用輸出專案內政策,以及工作負載所需的任何跨專案輸出政策。停用資料竊取防護功能後,第一步的政策會封鎖專案中所有工作負載的其他傳出流量,包括傳送至相同專案和其他專案中工作負載的流量。

  4. 請要求 IAM 機構組織管理員停用資料竊取防護功能。這項操作會啟用設定,同時禁止所有其他傳出流量。

  5. 檢查您建立的 ProjectNetworkPolicy,並確認 Ready 條件具有 status: "True",表示政策已生效:

    kubectl --kubeconfig GLOBAL_API_SERVER \
        get projectnetworkpolicy allow-outbound-traffic-to-external \
        -n PROJECT -o yaml
    

    更改下列內容:

    • GLOBAL_API_SERVER:全域 API 伺服器的 kubeconfig 路徑。詳情請參閱「全域和可用區 API 伺服器」。如果您尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一文瞭解詳情。

    • PROJECT:GDC 專案的名稱。

套用這項政策後,只要您未定義其他輸出政策,系統就會拒絕 PROJECT 的所有其他傳出流量。

為標準叢集建立組織外部政策

標準叢集是專案範圍的 Kubernetes 叢集,可提供更強大的控制力、彈性和叢集管理員權限。

為標準叢集建立輸入組織外部政策

  1. 如要為標準叢集建立 ingress 組織外部政策,請建立並套用下列自訂資源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: STANDARD_CLUSTER_PROJECT
      name: allow-ingress-from-external-endpoint-to-standard-cluster-pod
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        userWorkloadSelector:
          labelSelector:
            clusters:
              matchLabels:
                kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME
            namespaces:
              matchLabels:
                kubernetes.io/metadata.name: SUBJECT_NAMESPACE
            workloads:
              matchLabels:
                SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - ipBlocks:
          - cidr: EXTERNAL_IP
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • GLOBAL_API_SERVER:全域 API 伺服器的 kubeconfig 路徑。詳情請參閱「全域和可用區 API 伺服器」。 如果您尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節。
    • STANDARD_CLUSTER_PROJECT:標準叢集專案的名稱。
    • STANDARD_CLUSTER_NAME:標準叢集的名稱。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,SUBJECT_LABEL_VALUE 為 backend,則標籤為 app: backend 的工作負載會接收流量。
    • EXTERNAL_IP:外部端點的 IP 位址。
    • PORT:主體工作負載上允許流量的通訊埠。

為標準叢集建立輸出組織外部政策

  1. 如要為標準叢集建立輸出組織外部政策,請建立並套用下列自訂資源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: STANDARD_CLUSTER_PROJECT
      name: allow-egress-from-standard-cluster-pod-to-external-endpoint
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        userWorkloadSelector:
          labelSelector:
            clusters:
              matchLabels:
                kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME
            namespaces:
              matchLabels:
                kubernetes.io/metadata.name: SUBJECT_NAMESPACE
            workloads:
              matchLabels:
                SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      egress:
      - to:
        - ipBlocks:
          - cidr: EXTERNAL_IP
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • GLOBAL_API_SERVER:全域 API 伺服器的 kubeconfig 路徑。詳情請參閱「全域和可用區 API 伺服器」。 如果您尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節。
    • STANDARD_CLUSTER_PROJECT:標準叢集專案的名稱。
    • STANDARD_CLUSTER_NAME:標準叢集的名稱。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,SUBJECT_LABEL_VALUE 為 backend,則標籤為 app: backend 的工作負載會傳送流量。
    • EXTERNAL_IP:外部端點的 IP 位址。
    • PORT:外部端點上允許流量的通訊埠。