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 中繼資料
- 前往 GCP Console
- 左側選單 → Compute Engine → 中繼資料(Metadata)
- 點上方 SSH 金鑰 分頁
- 點 編輯
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