跳轉到

Xshell 連線 GCP VM 完整指南

v1.0 · 2026-04-04 適用環境:Windows + Xshell 8 Free、GCP Ubuntu VM、已設定 Tailscale


核心觀念(必讀)

⚠️ GCP 的 SSH 金鑰不能只加在 VM 裡!

GCP 有一個叫 google_guest_agent 的服務,會定期自動同步並覆蓋 VM 的 ~/.ssh/authorized_keys。 如果你只把公鑰加進 VM,過一段時間就會消失,導致 SSH 連線突然失敗。

正確做法:把公鑰加到 GCP Compute Engine 的 Metadata(中繼資料),這樣 guest agent 就會自動維護,永不消失。


連線架構

你的 Windows 電腦
    ↓ Xshell 8 (SSH + 私鑰)
Tailscale 安全通道
    ↓
GCP VM (Ubuntu)
    - Tailscale 接收連線
    - SSH 驗證公鑰(來自 GCP Metadata)

前置確認清單

項目 說明
Xshell 8 Free 已安裝(https://www.netsarang.com/)
Tailscale(本機) 已安裝並登入同一個 Tailscale 帳號
Tailscale(VM) 已在 GCP VM 上設定好
GCP 帳號 有 Compute Engine 管理權限

取得 VM 的 Tailscale hostname 方式: 在 VM 上執行 tailscale status,記下類似 your-vm.tailxxxxxx.ts.net 的網址。


STEP 1:在 Xshell 產生 SSH 金鑰對

1.1 開啟金鑰管理員

Xshell 選單:工具 → 使用者金鑰管理員

1.2 產生新金鑰

產生(G)... 按鈕,設定如下:

欄位 建議值
金鑰類型 ED25519(推薦)或 RSA 4096
金鑰長度 256(ED25519 固定)
金鑰名稱 gcp-vm(隨意命名)
複雜密碼 可留空(方便自動登入)或設密碼(較安全)

一路按 Next 完成產生。

1.3 複製公鑰內容

在金鑰管理員列表,找到剛產生的 gcp-vm,點 內容(P)...

  • 切換到 公開金鑰 分頁
  • 格式選 OpenSSH
  • 複製到剪貼簿

公鑰格式類似: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... gcp-vm


STEP 2:把公鑰加入 GCP Metadata(關鍵步驟)

✅ 這樣設定後,就算 authorized_keys 被 guest agent 覆蓋也沒關係,它會自動把你的公鑰同步回去。

2.1 進入 GCP Compute Engine 中繼資料

  1. 前往 GCP Console
  2. 左側選單 → Compute Engine中繼資料(Metadata)
  3. 點上方 SSH 金鑰 分頁
  4. 編輯

2.2 加入公鑰

+ 新增項目,貼上以下格式的公鑰:

ssh-ed25519 AAAAC3Nza...完整金鑰內容... your_username

⚠️ 格式注意事項: - 必須是完整一行,不能截斷 - 最後面的使用者名稱要改成你的 VM Linux 帳號(用 whoami 確認) - 不是你的電腦名稱,是 VM 上登入的帳號

2.3 儲存

儲存,等約 30 秒讓 guest agent 自動同步到 VM。

2.4 確認同步成功(可選)

用 GCP 瀏覽器 SSH 進 VM 確認:

cat ~/.ssh/authorized_keys

應該可以看到你剛加入的公鑰。


STEP 3:在 Xshell 建立連線設定

3.1 新增連線

Xshell 選單:檔案 → 新增...

連線分頁

欄位 填入值
名稱 GCP VM(自訂名稱)
通訊協定 SSH
主機 your-vm.tailxxxxxx.ts.net(換成你的 Tailscale hostname)
連接埠 22

3.2 設定驗證方式

切換到 使用者驗證 分頁:

欄位 填入值
方法 Public Key
使用者名稱 your_username(你的 VM Linux 帳號)
使用者金鑰 選擇 gcp-vm(STEP 1 產生的)
複雜密碼 你設的密碼(若留空則不填)

3.3 儲存並連線

確定 儲存,雙擊連線名稱即可連線。


STEP 4:安全強化(建議必做)

關閉 VM 上的密碼登入,只允許金鑰認證,防止暴力破解。

4.1 SSH 進 VM 後執行

# 啟用公鑰認證、關閉密碼登入
sudo sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

# 確認設定
sudo grep -E "^PasswordAuthentication|^PubkeyAuthentication" /etc/ssh/sshd_config

預期結果:

PubkeyAuthentication yes
PasswordAuthentication no

4.2 重啟 SSH 服務

# Ubuntu 上服務名稱是 ssh(不是 sshd!)
sudo systemctl restart ssh
sudo systemctl status ssh | head -5

4.3 驗證(重要!)

⚠️ 不要關掉目前的 SSH 視窗! 先用 Xshell 開一個新的連線確認能正常登入,成功後才關舊視窗。


常見問題排查

症狀 原因 解法
Permission denied (publickey) 公鑰未加入 GCP Metadata 或格式錯誤 重新檢查 STEP 2,確認帳號名稱正確
昨天能連、今天不行 google_guest_agent 清空了 authorized_keys 把公鑰加到 GCP Metadata(不是只加 VM),見 STEP 2
Xshell 金鑰欄位是空的 還沒產生金鑰 執行 STEP 1
公鑰格式無效(GCP 顯示紅字) 公鑰被截斷,或帳號名稱格式錯誤 確認是完整一行,結尾是 VM 的 Linux 帳號名稱
Unit sshd.service not found Ubuntu 的服務名稱是 ssh 不是 sshd 改用 sudo systemctl restart ssh
Tailscale 連不上 本機 Tailscale 未啟動或未登入 確認本機 Tailscale 已開啟並登入同帳號

日常使用

快速連線

雙擊 Xshell 中儲存的連線設定即可。

離開座位時

不需要關閉 Xshell,直接按 Win + L 鎖定 Windows,SSH 連線會繼續保持。回來後輸入 Windows 密碼解鎖,繼續操作。

確認目前連線資訊

whoami                  # 確認登入帳號
tailscale ip            # 確認 Tailscale IP
tailscale status        # 確認 Tailscale 連線狀態

網路架構說明

Windows Xshell
    │
    │ SSH over Tailscale(加密通道)
    ▼
Tailscale 節點
    │
    │ Tailscale 私有網路
    ▼
GCP VM(Ubuntu)
  your-vm.tailxxxxxx.ts.net
  • 不需要開放 GCP 防火牆的 22 port 給外網
  • 不需要固定公開 IP
  • Tailscale 提供端對端加密通道

金鑰管理原則

金鑰 存放位置 說明
私鑰 Windows 本機(Xshell 管理) 絕對不要外洩
公鑰 GCP Compute Engine Metadata 可以公開,這樣設定才不會消失

💡 公鑰可以放心公開,安全靠私鑰保護。 私鑰遺失就重新產生一組,再更新 GCP Metadata 裡的公鑰即可。


整理自實際設定與排查過程 · v1.0 · 2026-04-04