IP 偽裝代理程式


本頁面說明 Google Kubernetes Engine (GKE) 中的 IP 位址偽裝功能運作方式,並提供不同情境的設定選項。

本頁面假設您已瞭解 Kubernetes 中的 IP 偽裝

GKE IP 偽裝

GKE 可以使用 IP 偽裝功能,變更從 Pod 傳送封包的來源 IP 位址。當 IP 位址偽裝套用至 Pod 發出的封包時,GKE 會將封包的來源 IP 位址從 Pod IP 位址變更為基礎節點的 IP 位址。如果收件者設定為只接收來自叢集節點 IP 位址的封包,偽裝封包的來源 IP 位址就很有用。

在 Linux 節點上,GKE 會設定 iptables 規則。GKE 會使用 ip-masq-agent DaemonSet 設定適當的資料平面。

Windows Server 節點集區不支援 IP 偽裝。

標準叢集的 IP 偽裝

在 Standard 叢集中,叢集的 IP 偽裝行為取決於三個因素:

下表摘要說明 Standard GKE 叢集的 IP 偽裝設定:

叢集設定 產生的 SNAT 行為

叢集中有 ip-masq-agent DaemonSet, ip-masq-agent ConfigMap 中有自訂 nonMasqueradeCIDRs 清單。

對於傳送至 nonMasqueradeCIDRs 清單中指定目的地的封包,GKE 會保留來源 Pod IP 位址。

對於傳送至 nonMasqueradeCIDRs 清單中未指定目的地的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。

叢集中有 ip-masq-agent DaemonSet,但 ip-masq-agent ConfigMap 中沒有自訂 nonMasqueradeCIDRs 清單,根本沒有 ip-masq-agent ConfigMap。

對於傳送至一組預設非偽裝目的地的封包,GKE 會保留來源 Pod IP 位址。

對於傳送至預設非偽裝目的地以外的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。

叢集中ip-masq-agent沒有 DaemonSet,您建立叢集時沒有使用 --disable-default-snat 旗標。

對於傳送至一組預設非偽裝目的地的封包,GKE 會保留來源 Pod IP 位址。

對於傳送至預設非偽裝目的地以外的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。

叢集中ip-masq-agent沒有 DaemonSet,使用 --disable-default-snat 標記建立叢集。

GKE 會保留傳送至所有目的地的封包來源 Pod IP 位址。

如要保留 Pod IPv4 來源位址,並將封包路由至網際網路,請參閱「保留 Pod IPv4 位址來源至網際網路目的地」一文,瞭解重要的路由考量事項。

Autopilot 叢集的 IP 偽裝

在 Autopilot 叢集中,GKE 一律會部署 ip-masq-agent DaemonSet。除了 Pod 傳送至叢集節點、Pod 或服務範圍的封包外,您可以使用 EgressNATPolicy 控制 IP 偽裝行為。如要使用 EgressNATPolicy,Autopilot 叢集必須符合下列兩項需求:

  • 叢集必須使用 GKE 1.23.4-gke.1600 以上版本,或 1.22.7-gke.1500 以上版本。
  • 叢集必須啟用 GKE Dataplane V2 才能建立。

下表摘要說明 Autopilot GKE 叢集的 IP 偽裝設定:

Autopilot 叢集設定 產生的 SNAT 行為

叢集包含自訂 EgressNATPolicy,其 spec.actionNoSNAT,其中包含 spec.destinations[] 中指定的非偽裝目的地。

對於傳送至 EgressNATPolicy spec.destinations[] 中指定目的地的封包,GKE 會保留來源 Pod IP 位址。GKE 會將 spec.destinations[] 轉換為 ip-masq-agent configMap 中的 nonMasqueradeCIDRs 清單,藉此完成這項作業。

對於傳送至 spec.destinations[] 中未指定目的地的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。EgressNATPolicy

叢集不包含自訂 EgressNATPolicy

預設EgressNATPolicy和「由 GKE 管理」政策都會套用,因此會產生下列行為:

  • 對於傳送至一組預設非偽裝目的地的封包,GKE 會保留來源 Pod IP 位址。
  • 對於傳送至預設非偽裝目的地以外的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。

設定範例

展開下列各節,即可查看根據叢集類型提供的 IP 偽裝和設定範例。

進階設定參考資料

ip-masq-agent 自動部署時

在 Autopilot 模式叢集中,GKE 一律會部署 ip-masq-agent DaemonSet。

在 Standard 叢集中,如果��旗標設定,且叢集使用下列其中一種設定組合,GKE 就會部署 DaemonSet:ip-masq-agent--disable-default-snat

  • 叢集未使用 GKE Dataplane V2,且網路政策強制執行已啟用。

  • 叢集使用的 Pod IP 位址範圍不符合 10.0.0.0/8

如要讓 ip-masq-agent DaemonSet 生效,您也必須在 ip-masq-agent ConfigMap 中指定 nonMasqueradeCIDRs 清單。詳情請參閱如何設定 IP 偽裝代理程式

當叢集中有 ip-masq-agent DaemonSet 時,GKE 會更新及調解叢集每個節點上的服務 Pod。

預設非偽裝目的地

預設非偽裝目的地如下:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10
  • 192.0.0.0/24
  • 192.0.2.0/24
  • 192.88.99.0/24
  • 198.18.0.0/15
  • 198.51.100.0/24
  • 203.0.113.0/24
  • 240.0.0.0/4

預設非偽裝目的地適用於具有下列設定的叢集:

預設非偽裝目的地適用於具有下列設定的叢集:

--disable-default-snat 旗幟的影響

--disable-default-snat 標記會變更 預設 GKE SNAT 行為,以便保留傳送至所有目的地的封包來源 Pod IP 位址。GKE 不會在叢集中部署任何 ip-masq-agent DaemonSet,藉此實作預設 SNAT 行為。

如果叢集包含 ip-masq-agent DaemonSet,--disable-default-snat 旗標就不會生效:

  • 由於 Autopilot 叢集一律包含 ip-masq-agent DaemonSet,因此 --disable-default-snat 旗標對 Autopilot 叢集沒有影響。

  • 標準叢集:如果您部署 ip-masq-agent DaemonSet,或 GKE 自動部署 ip-masq-agent DaemonSet,即使設定了 --disable-default-snat,該旗標對叢集也沒有意義。--disable-default-snat如果叢集中有 ip-masq-agent DaemonSet,非偽裝目的地會明確指定在 ip-masq-agent ConfigMap 的 nonMasqueradeCIDRs 清單中,或在未定義 nonMasqueradeCIDRs 清單時,指定在預設非偽裝目的地中。

叢集建立後,您可以更新叢集來設定 --disable-default-snat 標記。如果叢集未部署 ip-masq-agent DaemonSet,停用預設 SNAT 後,叢集必須先替換所有節點,變更才會生效 (有時需要數小時)。這是因為 GKE 會在更換叢集中的節點時,遵守您設定的維護期間。如果尚未設定任何維護時段,您必須先手動循環叢集中的節點,--disable-default-snat 標記才會生效。

連結本機偽裝

169.254.0.0/16 範圍用於連結本機 IP 位址。連結本機偽裝是指將傳送至 169.254.0.0/16 目的地的封包來源 Pod IP 位址,變更為來源節點 IP 位址。

Autopilot 叢集一律會保留傳送至 169.254.0.0/16 目的地的封包來源 Pod IP 位址。

根據預設,標準叢集也會保留傳送至169.254.0.0/16目的地的封包來源 Pod IP 位址。

如要在 Standard 叢集中啟用本機連結 IP 位址偽裝,請執行下列兩項操作:

使用 hostNetwork: true 的診斷容器和 Pod

除非您為封包指定自訂來源 IP 位址,否則使用 hostNetwork: true 和診斷容器執行的 Pod 會傳送來源與節點 IP 位址相符的封包。對於以 hostNetwork: true 執行的 Pod,GKE 會將節點的 IP 位址指派給 Pod。GKE 不會管理診斷容器的 IP 位址,包括使用工具箱偵錯節點問題的容器。

Autopilot 叢集不支援使用 spec.hostNetwork: true 執行 Pod。由於無法使用 SSH 存取 Autopilot 叢集的節點,因此您無法在節點上執行診斷容器。

保留傳送至網際網路目的地的 Pod IPv4 位址來源

如果叢集的 IP 位址偽裝設定符合下列任一條件,GKE 會保留傳送至所有目的地 (包括網際網路目的地) 的封包 Pod IP 位址來源:

  • 在具有 ip-masq-agent DaemonSet 的標準叢集中,如果您已在 ip-masq-agent ConfigMap 中將 nonMasqueradeCIDRs 設為 0.0.0.0
  • 在沒有 ip-masq-agent DaemonSet 的 Standard 叢集中,如果您已設定 --disable-default-snat 標記。
  • 在 Autopilot 叢集中,如果編輯預設的 EgressNATPolicy,使 spec.actionNoSNAT,且 spec.destinations 包含 Cidr: 0.0.0.0/0

Pod IPv4 來源是內部 IPv4 位址,因此無法在網際網路上路由傳送。因此,當您為傳送到網際網路的封包保留來源 Pod IPv4 位址時,需要使用下列其中一種技術,才能在封包離開叢集節點後進行路由:

  • 請確認虛擬私有雲端網路具有預設路徑,且預設網際網路閘道為下一個躍點,並設定 Cloud NAT 閘道,為叢集中 Pod 使用的子網路次要 IPv4 位址範圍提供公開 NAT 服務。詳情請參閱 Cloud NAT 總覽中的「GKE 互動」。
  • 將虛擬私有雲網路設為使用自訂預設路徑,下一個躍點為 VM 執行個體或內部直通式網路負載平衡器,且 VM 或負載平衡器的後端已設為代表 Pod 將封包轉送至網際網路。

還原為預設 SNAT 行為

如要在叢集中存在 ip-masq-agent DaemonSet 時還原為預設 SNAT 行為,請刪除相關聯的 ip-masq-agent ConfigMap。ip-masq-agent DaemonSet 會在管理的節點上還原預設的 IP 偽裝行為。

如要在叢集中沒有 ip-masq-agent DaemonSet 時還原為預設 SNAT 行為,您必須升級節點集區 (請確認叢集未設定 --disable-default-snat)。

Autopilot 叢集中的 Egress NAT 政策效果

透過 GKE 輸出 NAT 政策,您可以在 Autopilot 叢集上設定 IP 偽裝。您可以使用 GKE Egress NAT 政策自訂資源定義 (CRD),變更從 Pod 傳送封包的來源 IP 位址。

基於安全或 IP 位址耗盡等原因,您可以將 Pod 的 IP 位址偽裝成節點 IP 位址範圍,以利傳送至內部部署網路的出站流量。舉例來說,您可以為 Autopilot 叢集使用非 RFC-1918 範圍,並為節點使用 RFC-1918 範圍。不過,如果 Pod 必須與也使用非 RFC-1918 範圍的內部部署網路通訊,IP 位址可能會重疊。為避免流量遺失,您可以設定輸出 NAT 政策,不要將 Pod 的非 RFC-1918 範圍通告至內部部署網路。Egress NAT 政策會偽裝 Pod 的非 RFC-1918 範圍,改用節點的 RFC-1918 範圍。請確認節點範圍不會與任何地端範圍重疊,否則可能會導致流量迴圈。

GKE 會透過下列程序,對 Autopilot 叢集強制執行 IP 位址偽裝行為:

  1. GKE 會部署 Egress NAT 控制器和 ip-masq-agent
  2. 建立輸出 NAT 政策。
  3. GKE 控制器會將政策轉換為 ip-masq-agent ConfigMap。
  4. ip-masq-agent DaemonSet 會讀取 ConfigMap,然後 GKE 會強制執行 IP 位址偽裝行為。

自動產生的政策

GKE 支援下列兩種自動產生的輸出 NAT 政策:

  • 預設:這些政策可編輯。
  • 由 GKE 管理:這些政策是固定值,無法編輯。

預設政策

GKE 會預先定義一組預設 IP 位址範圍。當封包傳送至這些目的地時,叢集不會偽裝 IP 位址來源,並會保留來源 Pod IP 位址。如要變更這些預設 IP 位址範圍,請參閱「編輯及部署 Egress NAT 政策」。

下列資訊清單說明預設的 Egress NAT 政策:

    Name:         default
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:45Z
      Generation:          2
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
          f:status:
        Manager:      egress-nat-controller
        Operation:    Update
        Time:         2022-03-16T21:05:45Z
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            f:destinations:
        Manager:         kubectl
        Operation:       Update
        Time:            2022-03-17T01:58:13Z
      Resource Version:  189346
      UID:               06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.0.0.0/8
        Cidr:  172.16.0.0/12
        Cidr:  192.168.0.0/16
        Cidr:  240.0.0.0/4
        Cidr:  192.0.2.0/24
        Cidr:  198.51.100.0/24
        Cidr:  203.0.113.0/24
        Cidr:  100.64.0.0/10
        Cidr:  198.18.0.0/15
        Cidr:  192.0.0.0/24
        Cidr:  192.88.99.0/24
    Status:
    Events:  <none>

CIDR 範圍與預設非偽裝目的地範圍相同。

由 GKE 政策管理

GKE Egress NAT 政策會保留叢集運作所需的靜態 IP 位址範圍。這個靜態範圍包含叢集的 Pod、服務和節點 IP 位址範圍,可能與預設政策重疊。

您可以透過 GKE 指派的動態 8 位元組雜湊值 (gke-{CLUSTER_SHORT_HASH}) 識別這項政策。你無法編輯這項政策。

下列資訊清單說明名為 gke-bbfa6c0e-1 的 GKE 管理政策:

    Name:         gke-bbfa6c0e-1
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:46Z
      Generation:          1
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
            f:destinations:
          f:status:
        Manager:         egress-nat-controller
        Operation:       Update
        Time:            2022-03-16T21:05:46Z
      Resource Version:  11699
      UID:               0201b5de-a6f6-4926-822b-31ed7cdee2c6
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.119.128.0/17
        Cidr:  10.120.0.0/22
        Cidr:  10.128.0.0/20
    Status:
    Events:  <none>

後續步驟