利用 Cloud NAT 維持雲端的獨立性與安全性

將 Web Server 放入雲端後,在主動對外連線發出請求的情況下,常常會面臨下列兩種問題:

  1. 不想將 Web Server 實際的公開IP位置曝光,以免遭到惡意攻擊。
  2. 對外(如三方登入、支付)透過 API 進行連線時,需固定公開網路 IP。

傳統的解決方式如下:

VPN Gateway

傳統的方法之一,可以透過 VPN gateway 以保護、授權並處理所有的連線,然而此種方法 VM 仍然使用公開 IP,因此仍有被攻擊的危險性。

VPN gateway

Bastion Host

另一種方法是,使用 「堡壘主機」— Bastion Host,可以透過 Bastion Host處理所有外部的請求,且並不會將 VM 的 IP 位置暴露,然而此種方式只解決了外部的請求連線,在內部主動對外發出請求的狀況下,仍然會將 VM 的 IP位置暴露。

Bastion Host

Traditional NAT (Network Address Translation)

傳統的 NAT 透過建立一個 NAT proxy 處理所有實例與外部的連線,然而此種方式須建立一個 NAT proxy instance,可能會造成效能與單位時間吞吐量的降低。

Typical NAT Proxies

前述的傳統解決方案,各有其缺點,因此 Google 推出了 Cloud NAT,提供高效能網路位址轉譯服務。

Cloud NAT

Cloud NAT 是 GCP 推出的代管服務,可以在不公開 VM 與 Pod 實際公開 IP 位址的情況下,使其透過共用的 IP 位址對外溝通,外部資源無法直接存取 Cloud NAT 閘道後的任何私人執行個體,保證這些實例的安全。
Cloud NAT 是一種 Software -defined Networking 的解決方案,由於完全以軟體定義,中間並不存在 proxy 的實例,且同時支援 Compute Engine 與 Google Kubernetes Engine,因此性能與彈性相比傳統的 NAT 好上許多。

Google Cloud NAT

使用教學

  1. 先將 gcloud 設定至正確的project
gcloud config set project <PROJECT_ID>

2. 建立 VPC 網路與子網路

選單點選 VPC 網路,點擊「建立虛擬私人雲端網路」

配置如下圖

2. 建立一個 k8s cluster

各配置請依照下圖

叢集基本配置

節點數量請輸入1即可。

網路連線配置請依照下圖
主要執行個體 IP 範圍請填寫 172.16.0/28

叢集網路配置

3. 建立防火牆規則

配置如下圖:
IP 範圍請填寫 35.235.240.0/20

4. 建立 IAP SSH 權限

選單「安全性」-> 「Identity-Aware Proxy」

點選頁籤「SSH 和 TCP 資源」,並找到剛才建立的節點。

勾選該節點後,右邊選擇「新增成員」,這邊單純為了測試連線,成員直接輸入當前使用的email帳號即可,角色請選擇 Cloud IAP -> IAP-secured Tunnel User

5. 測試節點連線無法連至外網

選單選擇 Compute Engine,可以看到該 VM 是沒有「外部IP」的。

點選右側的 SSH,進入該VM。

輸入ps aux | grep -i “\s/kube-dns” ,找到 kube-dns 的 process id

下圖為例的 process id 為 2369

輸入下列指令進入該 container

sudo nsenter --target PROCESS_ID --net /bin/bash

在 container 的 shell curl httpbin.orp/ip此時不應該得到任何結果。

6. 配置 Cloud NAT

選單「網路服務」->「Cloud NAT」,建立 NAT 閘道,配置如下圖。

選單「VPC網路」-> 「外部 IP 位置」可以確認外部 IP 位置。

6. 再次嘗試從節點連線至外網

此 IP 會與步驟5 看到的 IP 位置一致。

Summary

透過 Cloud NAT ,可以在不使用 external IP 的情況下,與外網連線且同時阻擋了由外部的存取;由於是建立於 SDN 機制的解決方案,效能與彈性皆優於傳統的方法。

雲端的安全性一直是非常重要的課題,利用 Cloud NAT 保證執行個體的獨立性與安全性,我們可以降低主機被攻擊的風險。

--

--