本文說明安全連線至 Compute Engine 虛擬機器 (VM) 執行個體的最佳做法,包括啟用客體屬性來儲存主機金鑰,以及防止從公用網際網路連線至 VM。
事前準備
-
如果尚未設定驗證,請先完成設定。
「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
- Debian
- Ubuntu
- Red Hat Enterprise Linux (RHEL)
- CentOS
- SUSE Linux Enterprise Server (SLES)
初次啟動 VM 前,請啟用訪客屬性,您可以在建立 VM 時選取要啟用訪客屬性的 VM,也可以在整個專案中啟用。
使用
gcloud compute ssh
連線至 VM。確認您使用的是最新版 Google Cloud CLI:
gcloud components update
連線至 VM:
gcloud compute ssh --project=PROJECT_ID \ --zone=ZONE \ VM_NAME
更改下列內容:
PROJECT_ID
:含有 VM 的專案 IDZONE
:VM 所在的可用區名稱VM_NAME
:VM 名稱
如果已為 Google Cloud CLI 設定預設屬性,則可省略此指令中的
--project
與--zone
旗標。例如:gcloud compute ssh VM_NAME
查看啟動訊息。比方說,Debian 作業系統可能會顯示下列訊息:
Writing 3 keys to YOUR_HOME_DIRECTORY/.ssh/google_compute_known_hosts Linux host-key-2 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u3 (2019-06-16) x86_64
VM_NAME
:VM 名稱ZONE
:VM 所在的可用區名稱- 查看序列埠輸出內容。
- 選取序列埠 1。
搜尋下列訊息:
INFO Wrote ssh-rsa host key to guest attributes
如果您的映像檔使用支援的作業系統,但是在第一次 VM 開機前未啟用訪客屬性設定,則可能會看到下列訊息:
Unable to write ssh-rsa host key to guest attributes
這表示您並未將主機金鑰儲存為此 VM 的訪客屬性。如果要為打算建立的其他 VM 儲存主機金鑰,請在初次啟動 VM 之前啟用訪客屬性。
- 網路服務仍處於開發階段,且尚未準備好向外部使用者公開,因為其功能仍不完整或尚未使用 HTTPS 設定。
- VM 提供的服務可能設計為僅供專案中其他 VM 使用。
- VM 只應從公司的辦公室或資料中心透過專屬互連網路選項連線。
- 註冊網域名稱。
- 從憑證授權單位取得 SSL 憑證。
- 向 HTTPS 負載平衡器及其連結的 VM 註冊憑證,或在一或多個 Compute Engine VM 上設定 SSL 終止的網路伺服器或 Proxy。
VM_NAME
是您要連線的 VM 名稱。PROJECT_ID
是您的Google Cloud 專案 ID。ZONE
:VM 執行的可用區,例如us-central1-a
。LOCAL_PORT
:您正在監聽的本機通訊埠,例如2222
。REMOTE_PORT
:您要連線的遠端通訊埠,例如8888
。- 對網路上的其中一個主機設定單一 SSH 通道,並在該主機上建立 SOCKS Proxy。
- 將瀏覽器設定變更為使用該 SOCKS Proxy 主機執行所有查詢。
VM_NAME
:您要連線的 VM 名稱。PROJECT_ID
:您的Google Cloud 專案 ID。ZONE
:VM 執行的可用區,例如us-central1-a
。LOCAL_PORT
:您正在監聽的本機通訊埠,例如1080
。- 開啟「Preferences」(偏好設定)。
- 按一下 [Advanced] (進階) > [Networks] (網路) > [Settings] (設定),以開啟「Connection Settings」(連線設定) 對話方塊。
- 選擇「手動 Proxy 設定」。
- 在「SOCKS Host」(SOCKS 主機) 區段中,填寫
localhost
做為主機,以及之前執行gcloud
指令時選取的通訊埠。 - 選擇 [SOCKS v5]。
- 選取 [Remote DNS] (遠端 DNS) 方塊。
- 將所有其他項目保留為空白。
- 在「SOCKS Host」(SOCKS 主機) 區段中,填寫
- 按一下 [OK] (確定),然後關閉「Preferences」(偏好設定) 對話方塊。
- 網路上的其他 VM
- Identity-Aware Proxy 的 TCP 轉送功能
- 中繼資料伺服器
- Google Cloud SDK
- 受管理 VPN 閘道
- 限制可與防禦主機進行通訊的來源 IP 的 CIDR 範圍。
- 將防火牆規則設定為只允許來自防禦主機的私人 VM SSH 流量。
啟用訪客屬性來儲存主機金鑰
主機金鑰是用於識別特定主機或機器的金鑰組。當您連線至遠端主機時,即可使用主機金鑰確認自己是否連接至預定的機器。
如果您使用
gcloud compute ssh
連線至 Linux VM,則可將主機金鑰儲存為訪客屬性,藉以提供另一層安全防護。將安全殼層主機金鑰儲存為訪客屬性,有助於防止攔截式 (MITM) 攻擊之類的安全漏洞,進而改善連線的安全性。初始啟動 VM 時,如果已啟用訪客屬性,Compute Engine 就會將您所產生的主機金鑰儲存為訪客屬性。之後,Compute Engine 會使用這些儲存的主機金鑰,驗證 VM 的所有後續連線。
下列公用作業系統映像檔支援將主機金鑰儲存為訪客屬性:
如要將主機金鑰寫入訪客屬性,請務必在初次啟動 VM 前啟用訪客屬性。您可以在整個專案上啟用訪客屬性,也可以在建立 VM 時,在所選 VM 上啟用訪客屬性。
為專案或 VM 啟用訪客屬性後,Guest OS 代理程式會自動將主機金鑰發布為訪客屬性。如果您使用
gcloud compute ssh
而非一般 SSH 用戶端,下次連線時,gcloud CLI 會自動讀取屬性並更新known_hosts
檔案。如要將主機金鑰儲存為訪客屬性,請完成下列步驟:
如要確認是否已將主機金鑰儲存為這個 VM 的訪客屬性,請查看主機金鑰值,確認 SSH 金鑰是否已寫入 VM 的訪客屬性 (選項 1),或查看序列埠中是否有主機金鑰 (選項 2):
選項 1:查看主機金鑰值
您可以使用 Google Cloud CLI 確認 SSH 金鑰是否已寫入訪客屬性:
gcloud compute instances get-guest-attributes VM_NAME \ --query-path="hostkeys/" \ --zone=ZONE
更改下列內容:
輸出結果會與下列內容相似:
NAMESPACE KEY VALUE hostkeys ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBJAGpTm V3mFxBTHK1NIu9a7kVQWaHsZVaFUsqF8cLxQRQ+N96/Djiiuz1tucHQ8vBTJI= hostkeys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM/WYBn3jIEW5t3BZumx0X/Htm61J6S9FcU8L hostkeys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDU3jReR/MoSttlWYfauW6qEqS2dhe5 Zdd3guYk2H7ZyxblNuP56nOl/IMuniVmsFa9v8W6MExViu6G5Cy4iIesot09 1hsgkG0U7sbWrXM10PQ8pnpI3B5arplCiEMhRtXy64rlW3Nx156bLdcxv5l+ 7Unu4IviKlY43uqqwSyTv+V8q4ThpQ9dNbk1Gg838+KzazljzHahtbIaE1rm I0L1lUqKiKLSLKuBgrI2Y/WSuqvqGEz+bMH7Ri4ht+7sAwykph6FbOgKqoBI hVWBo38/Na/gEuvtmgULUwK+xy9zWg9k8k/Qtihc6El9GD9y
選項 2:查看序列埠
防止從公開網際網路連線至 VM
在 Compute Engine 上開發專案時,如果是下列各種情境,您會想要避免他人從公開網際網路連至 VM:
即使您是刻意將服務連結網際網路,請務必將與服務之間的通訊限制為目標使用者群組,並在 SSH 或 HTTPS 等安全的通道上進行,以保護機密資訊。
本文說明保護與具有外部 IP 位址的 VM 和沒有外部 IP 位址的 VM 之間通訊安全的幾種方法。無論您是否使用這些方法保護通訊安全, Google Cloud 系統一律允許 VM 執行個體與對應的中繼資料伺服器通訊。詳情請參閱一律允許的流量。
保護具有外部 IP 位址的機器上的服務
當 VM 具有公開 IP 位址時,請務必確保只有您打算公開的服務和流量是可供存取的狀態,而針對公開的服務,請務必確保所有機密資訊在傳輸過程中都能受到保護。本文說明保護 VM 上服務的幾種方法,包括防火牆、HTTPS 和 SSL、透過 SSH 進行連接埠轉送,以及透過 SSH 進行 SOCKS Proxy。
防火牆
您的第一道防線是使用防火牆限制誰能連至 VM。 建立防火牆規則後,即可將網路或特定通訊埠上目標機器的所有流量限制在特定來源 IP 位址。
防火牆並非獨立式解決方案。將流量限制為特定來源 IP 並無法保護機密資訊,例如登入憑證、建立或刪除資源或檔案的指令,或者記錄。在可公開存取的機器 (例如具有外部 IP 的 Compute Engine VM) 上執行網路服務時,您必須將主機與部署的 VM 之間的所有通訊加密,以確保適當的安全性。
此外,防火牆不一定會是適合的解決方案。舉例來說,沒有靜態 IP 位址的開發環境就不適合使用防火牆,例如漫遊的筆記型電腦。
HTTPS 和 SSL
針對實際工作環境網路系統,您應設定 HTTPS/SSL。您可以設定 VM 來終止 HTTPS,也可以設定 HTTPS 負載平衡。HTTPS/SSL 確實包含一些複雜的初始化作業,您必須執行下列工作:
透過 SSH 進行通訊埠轉送
您可以使用 Google Cloud CLI 在指定的本機通訊埠上啟動伺服器,透過 SSH 連線將所有流量轉送至遠端主機。
首先,針對提供服務的 VM 和通訊埠,請記下您要建立安全連線的 VM 和通訊埠。接下來,請執行下列指令:
gcloud compute ssh VM_NAME \ --project PROJECT_ID \ --zone ZONE \ -- -NL LOCAL_PORT:localhost:REMOTE_PORT
更改下列內容:
舉例來說,如果您指定本機通訊埠為「2222」,遠端通訊埠為「8888」,並在瀏覽器中開啟 http://localhost:2222/,HTTP 連線會使用您建立的 SSH 通道連線至遠端主機,然後透過 SSH 連線至指定的 VM。HTTP 連線隨後會使用 SSH 通道連線至同一部機器的
8888
連接埠,但會透過加密的 SSH 安全連線。gcloud
指令會在 SSH 工作階段作用中時,建立並維護 SSH 連線。結束 SSH 工作階段後,使用 http://VM_NAME
:LOCAL_PORT
的通訊埠轉送將立即停止運作。如要建立多個通訊埠轉送規則,您可以重複標記以在單一指令列上指定多個規則:
gcloud compute ssh VM_NAME \ --project PROJECT_ID \ --zone ZONE \ -- -NL LOCAL_PORT:localhost:REMOTE_PORT \ -- -NL LOCAL_PORT:localhost:REMOTE_PORT
您也可以在每次建立個別通道時,執行新的
gcloud
指令。請注意,您從現有的連線新增或移除通訊埠轉送時,必須結束連線並從頭重新建立連線。經由 SSH 的 SOCKS Proxy
如要連線至雲端部署中多個不同的主機,最簡單的做法是將瀏覽器變更為直接從網路執行查詢。這個方法可讓您使用主機的簡稱,而不需要查詢每個主機的 IP 位址、為每個服務開啟通訊埠,也不用為每個主機/通訊埠組合建立 SSH 通道。
以下是您在這裡使用的方法:
請注意,由於您正在建立讓「所有」流量經由該主機的通道,請避免使用該瀏覽器或該特定設定檔來瀏覽網路,因為您需要將頻寬專用於雲端服務。一般而言,您可能會想要使用獨立的瀏覽器設定檔,並視需要切換至該設定檔。
啟動 SOCKS Proxy
如要啟動 SOCKS Proxy,請執行下列指令:
gcloud compute ssh VM_NAME \ --project PROJECT_ID \ --zone ZONE --ssh-flag="-D" \ --ssh-flag="LOCAL_PORT" \ --ssh-flag="-N"
更改下列內容:
請注意,在這種情況下,您不需要指定遠端通訊埠。由於 SOCKS Proxy 不會繫結至任何特定遠端通訊埠,您使用 SOCKS Proxy 建立的所有連線都會解析成相對於您連線的主機。
您可以透過 SOCKS Proxy 使用 VM 的簡稱,連線至與您的 Proxy VM 共用 Compute Engine 網路的任何 VM。此外,您還可以連線至指定 VM 上的任何通訊埠。
這個方法比簡單的通訊埠轉送方法更具彈性,但您也必須變更網路瀏覽器中的設定以運用 Proxy。
接著,設定 Chrome 或 Firefox 來使用 Proxy。
Chrome
根據預設,Chrome 會使用全系統 Proxy 設定,因此,您必須使用指令列標記指定不同的 Proxy。啟動 Chrome 時,根據預設會為已在執行的設定檔建立 VM,因此為了讓您能同時執行多個 Chrome 複本 (其中一個複本使用 Proxy,而其他複本不使用 Proxy),您需要一個新的設定檔。
使用新設定檔啟動 Chrome。如果設定檔不存在,則會自動建立設定檔。
Linux:
/usr/bin/google-chrome \ --user-data-dir="$HOME/chrome-proxy-profile" \ --proxy-server="socks5://localhost:1080"
macOS:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ --user-data-dir="$HOME/chrome-proxy-profile" \ --proxy-server="socks5://localhost:1080"
Windows:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^ --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^ --proxy-server="socks5://localhost:1080"
將 localhost 通訊埠設定為您之前在
gcloud
指令中使用的同一個值 (在我們的範例中為1080
)。Firefox
變更這些設定前,建議您建立新的 Firefox 設定檔。否則,這會影響使用該主機做為 Proxy 的所有 Firefox 執行個體,這很可能不是您想要的情況。
使用獨立設定檔執行 Firefox 之後,即可設定 SOCKS Proxy:
連線至沒有外部 IP 位址的 VM
如果 VM 沒有外部 IP 位址 (包括做為 HTTPS 和 SSL Proxy 負載平衡器後端的 VM),則只能透過下列方式存取:
您可以在網路中佈建 VM,將其做為傳入連線的信任轉送來源,也就是防禦主機。此外,您也可以設定 Cloud NAT 處理傳出網路流量,或設定互動式序列埠控制台,以便維護或排解沒有外部 IP 位址的 VM 問題。
防禦主機
防禦主機為包含私人網路執行個體的網路提供了一個對外的進入點,如下圖所示。
這個主機可提供單一防禦或稽核點,您可啟動及停止該主機以啟用或停用來自網際網路的傳入 SSH。您可以使用防禦主機連線至沒有外部 IP 位址的 VM。這個方法可讓您連線至開發環境,或管理外部應用程式的資料庫執行個體,無須設定額外的防火牆規則。
防禦主機的完整強化做法不在本文的探討範圍內,但一些可執行的初始步驟包括:
根據預設,VM 上的 SSH 會設定為使用私密金鑰進行驗證。使用防禦主機時,您可以先登入防禦主機,然後再登入目標私人 VM。由於這個雙步驟登入方式 (這就是防禦主機有時也稱為「跳板機」的原因),您應使用
ssh
轉送,而不是將目標機器的私人金鑰儲存在防禦主機上以做為存取目標機器的方法。即使您將同一個金鑰組用於防禦主機和目標 VM,也必須這麼做,因為防禦主機只能直接存取金鑰組的公開部分。如要瞭解如何使用防禦主機執行個體連線至 Google Cloud 網路上的其他 VM,請參閱「使用防禦主機連線至 Linux VM」。
如要瞭解如何使用
ssh
轉送和其他方法連線至沒有外部 IP 位址的 VM,請參閱連線至沒有外部 IP 位址的 VM。適用於 TCP 轉送的 IAP
將 SSH 與 IAP 的 TCP 轉送功能搭配使用,可將 SSH 連線包裝在 HTTPS 內。IAP 的 TCP 轉送功能就會將其傳送至遠端 VM。
如要瞭解如何使用 IAP 連線至遠端 VM,請參閱「使用 Identity-Aware Proxy 連線至 Linux VM」。
VPN
Cloud VPN 可讓您透過使用 IPsec 連線至 VPN 閘道裝置的方式,將現有網路連線至Google Cloud 網路。這可讓流量從內部部署直接轉送至 Compute Engine VM 的私人 IP 介面。當流量透過 Google 的公開連結傳輸時,會將流量加密。
要進一步瞭解如何搭配 Compute Engine 建立、設定及使用 VPN,請參閱 Cloud VPN 說明文件。
如要瞭解如何透過現有 VPN (而非 VM 的外部 IP 位址) 連線至 Google Cloud 網路上的 VM,請參閱「使用 Cloud VPN 或 Cloud Interconnect 連線至 Linux VM」。
使用 Cloud NAT 的輸出流量
當 VM 未分配到外部 IP 位址時,則無法直接連線到外部服務,包括其他 Google Cloud服務。如要允許這些 VM 連至公開網際網路上的服務,您可以建立並設定 Cloud NAT,其可代表網路上的任何 VM 轉送流量。請勿將單一 VM 視為高可用性,或認為單一 VM 能夠支援多個 VM 的高流量總處理量。
互動式序列主控台存取權
當 VM 沒有外部 IP 位址時,為了進行疑難排解或維護,您可能仍須與 VM 互動。如前所述,您可以選擇設定防禦主機,但您的需求可能不值得進行更多設定。如要針對沒有外部 IP 位址的 VM 進行疑難排解,請考慮啟用對序列主控台的互動式存取權,這可讓您使用 SSH 與 VM 的序列主控台進行互動,並對序列主控台執行指令。
如要瞭解詳情,請參閱與序列主控台互動一文。
HTTPS 和 SSL Proxy 負載平衡器
做為 HTTPS 和 SSL Proxy 負載平衡器後端的 VM,不必具有透過負載平衡器存取的外部 IP 位址。如要直接存取這些資源,您需要使用「連線至沒有外部 IP 位址的 VM」一節中列出的方法。
如要瞭解詳情,請參閱相關負載平衡器的負載平衡說明文件。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-07-10 (世界標準時間)。
-