SSH 疑難排解

在某些情況下,Google Compute Engine 執行個體可能不再接受 SSH 連線。造成這種情況的原因有很多,從磁碟過滿到意外的 sshd 設定錯誤都有可能。針對 SSH 常見問題的疑難排解和解決方法,本節介紹了一些提示和方法。

檢查您的防火牆規則

Google Compute Engine 為每個專案佈建一組預設的防火牆規則,該規則允許 SSH 流量。假如允許 SSH 流量的預設防火牆規則遭到移除,您將無法存取您的執行個體。使用 gcloud compute 指令列工具查看您的防火牆清單,確認 default-allow-ssh 規則存在無誤。

gcloud compute firewall-rules list

如果找不到該防火牆規則,請新增回去:

gcloud compute firewall-rules create default-allow-ssh --allow tcp:22

在序列主控台上偵錯問題

您可以啟用對執行個體序列主控台的讀取/寫入權限,如此就能登入主控台並對執行個體進行疑難排解。當您無法透過 SSH 登入或執行個體未連線至網路時,這個方法會特別實用。在這兩種情況下,序列主控台仍會保持可存取的狀態。

要瞭解如何啟用互動式存取權並連線至執行個體序列主控台,請參閱與序列主控台互動一文。

測試網路

您可以使用 netcat 工具經由通訊埠 22 連線到執行個體,並查看網路連線是否正常。假如您連線並看到 SSH 橫幅 (例如 SSH-2.0-OpenSSH_6.0p1 Debian-4),這表示網路連線正常,您可以排除防火牆問題。首先,使用 gcloud 工具以取得執行個體的外部 natIP

gcloud compute instances describe example-instance --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
198.51.100.8

使用 nc 指令連線至您的執行個體:

# Check for SSH banner
user@local:~$ nc [EXTERNAL_IP] 22
SSH-2.0-OpenSSH_6.0p1 Debian-4

試試新的使用者

阻止您登入的問題可能出在您帳戶內的設定 (例如,假設執行個體上 ~/.ssh/authorized_keys 檔案的權限設定不正確)。

試著使用 gcloud 工具以全新使用者身分登入,方法是使用 SSH 要求指定另一個使用者名稱。gcloud 工具將會更新專案的中繼資料,新增全新使用者並允許 SSH 存取要求。

user@local:~$ gcloud compute ssh [USER]@example-instance

其中 [USER] 是用來登入的新使用者名稱。

新的執行個體上使用磁碟

假如上述步驟對您來說沒有作用,而且您有興趣的執行個體是透過永久磁碟啟動。您可以卸離永久磁碟,並附加此磁碟以在新的執行個體上使用。將下方範例中的 DISK 改成您的磁碟名稱:

gcloud compute instances delete old-instance --keep-disks=boot
gcloud compute instances create new-instance --disk name=DISK,boot=yes,auto-delete=no
gcloud compute ssh new-instance

檢查但不關閉執行個體

您可能無法連線到某個執行個體,但該執行個體持續正常地提供生產流量。在這種情況下,您可能希望要檢查磁碟,但又不中斷執行個體為使用者提供的服務。首先,針對執行個體的開機磁碟拍攝快照,接著透過快照建立新磁碟、建立臨時執行個體。最後,將新的永久磁碟連接並掛接到臨時執行個體,以排除磁碟的問題。

  1. 建立代管複製執行個體的新虛擬私人雲端網路:

    gcloud compute networks create debug-network
    
  2. 新增防火牆規則以允許網路接受 SSH 連線:

    gcloud compute firewall-rules create debug-network-allow-ssh --allow tcp:22
    
  3. 建立問題磁碟的快照,將 DISK 改為磁碟名稱:

    gcloud compute disks snapshot DISK --snapshot-name debug-disk-snapshot
    
  4. 透過剛建立的快照建立新磁碟:

    gcloud compute disks create example-disk-debugging --source-snapshot debug-disk-snapshot
    
  5. 建立沒有外部 IP 位址的新除錯執行個體:

    gcloud compute instances create debugger --network debug-network --no-address
    
  6. 將除錯磁碟連結至執行個體:

    gcloud compute instances attach-disk debugger --disk example-disk-debugging
    
  7. 按照操作說明,連線至沒有外部 IP 位址的執行個體

  8. 登入偵錯工具執行個體後,對執行個體進行疑難排解。舉例來說,您可以查看執行個體記錄檔:

    $ sudo su -
    
    $ mkdir /mnt/myinstance
    
    $ mount /dev/disk/by-id/scsi-0Google_PersistentDisk_example-disk-debugging /mnt/myinstance
    
    $ cd /mnt/myinstance/var/log
    
    # Identify the issue preventing ssh from working
    $ ls
    

使用開機指令碼

如果上述方法都沒能解決問題,您可以建立開機指令碼,以便在執行個體啟動後立即收集資訊。請按照執行開機指令碼中的指示操作。

接著,您必須使用 gcloud compute instances reset,在中繼資料生效前重設執行個體。此外,您也可以使用診斷開機指令碼重新建立執行個體:

  1. 搭配 --keep-disks 標記執行 gcloud compute instances delete

    gcloud compute instances delete INSTANCE --keep-disks boot
    
  2. 新增具有相同磁碟的新執行個體並指定開機指令碼。

    gcloud compute instances create example-instance --disk name=DISK,boot=yes --startup-script-url URL
    

您可以使用 compute-ssh-diagnostic script 做為基礎,收集多數常見問題的診斷資訊。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件