Google-Cloud-Platform

在 GKE 上使用 NAT + IP Masquerade 時 Cloud SQL 和其他外部服務超時

  • June 11, 2021

我必須在我的一個 POD 中配置一個靜態 IP,因為遠端服務(在我的集群之外)需要受信任的 IP 白名單。

我遵循了Google提供的文件:

https://cloud.google.com/nat/docs/overview?hl=es-419

https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent

但是,當嘗試在我的 GKE 集群中使用 Google 雲 NAT 服務配置出口流量以及使用偽裝時,ip-masq-agent我在訪問集群外的遠端服務時開始出現超時和問題。

我的集群是版本1.19.10-gke.1600

我已經嘗試了這些配置文件,結果如下:

resyncInterval: 60s

結果:

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in chain) */

服務一直使用錯誤的 IP。


resyncInterval: 60s
masqLinkLocal: true

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in the chain) */

同樣的效果,我的外部服務獲取了錯誤的 IP。


nonMasqueradeCIDRs:
 - 0.0.0.0/0
resyncInterval: 60s
masqLinkLocal: true

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in the chain) */

看起來這工作得更好,因為外部服務接收到正確的 IP,但我遇到連接問題和超時。


這是我的 NAT 配置:

NAT mapping
- High availability: Yes
- Source subnets & IP ranges: All subnets' primary and secondary IP ranges
- NAT IP addresses: static-egress-ip XXX.XXX.XXX.XXX

我沒有想法,有人可以給我任何建議嗎?


收到回復後,我更新了配置文件以添加 ips 以下Google云文件,文件如下所示:

nonMasqueradeCIDRs:
 - 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
resyncInterval: 60s
masqLinkLocal: true

iptables 中的結果是:

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             100.64.0.0/10        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.0.0.0/24         /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.0.2.0/24         /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.88.99.0/24       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             198.18.0.0/15        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             198.51.100.0/24      /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             203.0.113.0/24       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             240.0.0.0/4          /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in chain) */

但是,如果我執行 curlcheckip.amazonaws.com來查看節點正在使用什麼 IP,我會得到一個與我的 NAT 雲配置中定義的 IP 不同的 IP,並且外部服務會拒絕來自我的集群的不受信任的請求。

最後,我們能夠診斷出問題。我們的集群是在 GCP 不支持私有集群時創建的,所以我們的集群是公共的。

每個節點都有一個公共臨時 IP,因此 NAT 規則被忽略。

解決方案是設置一個具有靜態 IP 而不是臨時 IP 的節點,並配置需要受信任的身份驗證以始終部署在該特定節點上的工作負載。這不是一個完美的解決方案,但我們可以快速解決問題。

真正的解決方案是遷移到私有集群並配置 NAT,但遺憾的是 GCP 不支持從公共集群遷移到私有集群。唯一的選擇是創建一個新集群並將工作負載遷移到新集群,這是我們需要在短期內執行的過程。

也許現在是測試也不支持自動遷移的自動駕駛儀的好時機。

看來您已將其設置nonMasqueradeCIDRs:為 0.0.0.0/0 從而防止偽裝所有 CIDR 流量,因此要解決此問題,請在配置文件中更新 nonMasqueradeCIDRs: 密鑰,並使用預設非偽裝目標段落中提到的 IP

$$ 1 $$ 如下所示。 非偽裝CIDR:

  • 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
  • 10.0.0.0/8

另請注意,螢幕截圖中提到的 IP 不是錯誤 IP,而是由 RFC 1918/link-local 保留的範圍,即 IP 10.0.0.0/8、172.16.0.0/12 192.168.0.0/16 為 RFC 保留1918 和 IP 範圍 169.254.0.0/16 保留用於連結本地,這些是不可偽裝的,因此這些 IP 顯示為描述“ip-masq-agent:本地流量不受偽裝”

$$ 2 $$. $$ 1 $$ https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent#default-non-masq-dests $$ 2 $$ https://kubernetes.io/docs/tasks/administer-cluster/ip-masq-agent/#ip-masquerade-agent-user-guide 問候,安布。

引用自:https://serverfault.com/questions/1065879