網路政策

如要在專案命名空間層級為虛擬機器 (VM) 工作負載設定網路政策,請使用 ProjectNetworkPolicy 資源,這是 Google Distributed Cloud Air-gapped (GDC) 的多叢集網路政策。您可以透過這項功能定義政策,允許專案內、專案間以及與外部 IP 位址的通訊。

對於專案內的流量,GDC 預設會將預先定義的專案網路政策 (即「專案內政策」) 套用至每個專案。如要啟用及控管同一個機構內跨專案的流量,請定義跨專案政策。如果有多項政策,GDC 會為每個專案加總規則。如果至少有一項規則相符,GDC 也會允許流量。

要求權限和存取權

如要執行這個頁面列出的工作,您必須具備專案 NetworkPolicy 管理員角色。請專案 IAM 管理員在 VM 所在的專案命名空間中,授予您專案 NetworkPolicy 管理員 (project-networkpolicy-admin) 角色。

專案內流量

根據預設,專案命名空間中的 VM 工作負載可以彼此通訊,不必將服務公開給外部世界,即使 VM 屬於同一專案中的不同叢集也一樣。

專案內流量網路政策

建立專案時,您會在 Management API 伺服器上建立預設的基礎 ProjectNetworkPolicy,允許專案內通訊。這項政策允許來自同一專案中其他工作負載的連入流量。您可以移除這項權限,但請務必謹慎操作,因為這麼做會導致專案內和容器工作負載通訊遭到拒絕。

專案內輸出流量網路政策

根據預設,您不需要針對輸出流量採取任何行動。這是因為在沒有輸出政策的情況下,系統會允許所有流量。不過,如果您設定單一政策,系統只會允許政策指定的流量。

停用「資料外洩防護」,並將輸出 ProjectNetworkPolicy 套用至專案 (例如禁止存取外部資源) 時,請使用必要政策允許專案內輸出:

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_1
  name: allow-intra-project-egress-traffic
spec:
  policyType: Egress

  ingress:
  - from:
    - projects:
        matchNames:
        - PROJECT_1
EOF

跨專案 (機構內) 流量

只要套用跨專案網路政策,但位於同一機構的不同專案命名空間中的 VM 工作負載,就能彼此通訊。

輸入跨專案流量網路政策

如要允許專案工作負載與其他專案中的其他工作負載建立連線,您必須設定 Ingress 政策,允許其他專案工作負載傳輸資料。

下列政策可讓 PROJECT_1 專案中的工作負載允許來自 PROJECT_2 專案工作負載的連線,以及相同流程的傳回流量。如要從 PROJECT_2 內部的來源存取 PROJECT_1 中的 VM,也可以使用這項政策。執行下列指令來套用政策:

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_1
  name: allow-ingress-traffic-from-PROJECT_2
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - projects:
        matchNames:
        - PROJECT_2
EOF

上述指令允許 PROJECT_2 前往 PROJECT_1,但不允許從 PROJECT_1 啟動連線前往 PROJECT_2。如要使用後者,您必須在PROJECT_2專案中設定互惠政策。執行下列指令來套用互惠政策:

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_2
  name: allow-ingress-traffic-from-PROJECT_1
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - projects:
        matchNames:
        - PROJECT_1
EOF

您現在已允許與 PROJECT_1PROJECT_2 建立連線。

請使用下列變數定義。

變數定義
MANAGEMENT_API_SERVER管理 API 伺服器 kubeconfig 路徑。
PROJECT_1GDC 專案名稱,對應範例中的 PROJECT_1。
PROJECT_2GDC 專案名稱,對應範例中的 PROJECT_2。

輸出跨專案流量網路政策

當您授予跨專案的 Ingress 流量政策,允許一個專案 (PROJECT_1) 中的工作負載連線至另一個專案 (PROJECT_2) 中的工作負載時,系統也會授予相同流程的回程流量。因此,您不需要輸出跨專案流量網路政策。

跨機構流量

如要將 VM 工作負載連線至專案外部的目的地 (位於不同機構),必須明確核准。這是因為 GDC 預設會啟用資料外洩防護功能,禁止專案將資料傳輸至專案所屬機構以外的工作負載,因此需要核准。本節將說明如何新增特定輸出政策,以及如何啟用資料外洩防護功能。

輸入跨機構流量網路政策

如要允許跨機構的輸入流量,必須套用 ProjectNetworkPolicy,允許來自機構外部用戶端的流量進入專案,例如使用 SSH 連線至 VM。

回覆流量不需要相應的 Egress 政策。系統會隱含允許回訪流量。

如要從 VM 所在機構外部的來源存取 PROJECT_1 中的 VM,您必須套用下列政策。您必須取得並使用包含來源 IP 位址的 CIDRCIDR 應採用 network/len 標記。 例如 192.0.2.0/21 就是有效值。

  1. 按照kubectl範例,設定及套用 Ingress ProjectNetworkPolicy。在 PROJECT_1 中,對所有使用者工作負載套用政策。允許連入流量傳送至 CIDR 中的所有主機,這些主機位於機構外部。

  2. 套用 ProjectNetworkPolicy 設定:

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

輸出跨機構流量網路政策

如要啟用資料移轉功能,將資料移出機構外部服務,請自訂專案網路政策 ProjectNetworkPolicy。由於系統預設會啟用資料外洩防護功能,因此自訂的 Egress ProjectNetworkPolicy 會在狀態欄位中顯示驗證錯誤,資料平面也會忽略該錯誤。這是正常的。

如「安全性與連線」一文所述,當您允許特定專案的資料外洩時,工作負載可以將資料移出。您允許資料轉出的流量是來源網路位址轉譯 (NAT),使用為專案分配的已知 IP 位址。「安全性與連線」部分也會提供專案網路政策 (ProjectNetworkPolicy) 強制執行的詳細資料。

回覆流量不需要對應的 Ingress 政策。系統會隱含允許回訪流量。

啟用自訂輸出政策:

  1. 設定及套用您自己的自訂 Egress ProjectNetworkPolicy,請參閱 kubectl 範例。在 PROJECT_1 中,對所有使用者工作負載套用政策。這項規則允許輸出流量傳送至 CIDR 中的所有主機, 這些主機位於機構外部。第一次嘗試會導致必要的狀態錯誤,這是預期行為。

  2. 套用 ProjectNetworkPolicy 設定:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-egress-traffic-to-NAME
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
      egress:
       - to:
         - ipBlock:
             cidr: CIDR
    EOF
    
  3. 完成後,請確認狀態是否顯示驗證錯誤

  4. 請管理員使用者停用資料竊取防護功能。這項設定會啟用您的設定,同時禁止所有其他輸出。

  5. 檢查您剛建立的 ProjectNetworkPolicy,確認驗證狀態欄位中的錯誤已消失,且狀態為 Ready True,表示政策已生效:

    kubectl --kubeconfig MANAGEMENT_API_SERVER get projectnetworkpolicy
    allow-egress-traffic-to-NAME -n PROJECT_1 -o yaml
    

    使用下列定義替換變數。

    變數定義
    MANAGEMENT_API_SERVER管理 API 伺服器 kubeconfig 路徑。
    PROJECT_1GDC 專案名稱。
    CIDR允許目的地的無類別跨網域路由 (CIDR) 區塊。
    NAME與目的地相關聯的名稱。

    套用這項政策後,如果沒有定義其他輸出政策,系統就會拒絕 PROJECT_1 的所有其他輸出流量。