針對 SSH 連線至 Azure Linux VM 失敗、發生錯誤或被拒進行疑難排解

適用於:✔️ Linux VM

本文可協助您找出並更正因安全殼層 (SSH) 錯誤、SSH 連線失敗或 SSH 而嘗試連線到 Linux 虛擬機 (VM) 時所發生的問題。 您可以使用適用於Linux的 Azure 入口網站、Azure CLI或 VM 存取延伸模組,針對連線問題進行疑難解答和解決。

注意

本篇文章實用嗎? 您的輸入對我們很重要。 請使用此頁面上的 [ 意見反應 ] 按鈕,讓我們知道這篇文章為您運作得有多好,或我們如何加以改善。

快速疑難解答步驟

在每個疑難解答步驟之後,請嘗試重新連線至 VM。

  1. 重設 SSH 組態
  2. 重設用戶的認證
  3. 確認網路安全組規則允許 SSH 流量和角色指派。
    • 確定 網路安全組規則 存在以允許 SSH 流量(預設為 TCP 連接埠 22)。
    • 您無法在不使用 Azure 負載平衡器的情況下使用埠重新導向/對應。
    • 如果您使用 Microsoft Entra ID 來管理 SSH 登入,則必須在包含 VM 及其相關聯資源的資源群組上指派 虛擬機系統管理員登入虛擬機使用者登入 角色。 否則,將會收到「許可權遭拒(publickey)」錯誤。 如需詳細資訊,請參閱 設定使用 Microsoft Entra 登入之 VM 的角色指派。
  4. 檢查 VM 資源健康情況
    • 確定 VM 回報為狀況良好。
    • 如果您已啟用開機診斷,請確認 VM 未報告記錄中的開機錯誤。
  5. 重新啟動 VM
  6. 重新部署 VM

繼續閱讀以取得更詳細的疑難解答步驟和說明。

針對 SSH 連線問題進行疑難解答的可用方法

您可以使用下列其中一種方法來重設認證、SSH 設定,或針對 SSH 服務的狀態進行疑難解答:

  • Azure 入口網站 - 如果您需要快速重設 SSH 組態或 SSH 金鑰,且未安裝 Azure 工具,則非常出色。
  • Azure VM 序列控制台 - 無論 SSH 設定為何,VM 序列主控台都會運作,而且會提供您 VM 的互動式控制台。 事實上,「無法 SSH」的情況是序列控制台設計來協助解決的情況。 以下提供更多詳細資料。
  • 透過 Azure 入口網站 使用執行命令 - 您可以透過 Azure 入口網站 使用執行命令功能來執行基本命令。 輸出將會傳回至入口網站。
  • Azure CLI - 如果您已經在命令行上,請快速重設 SSH 組態或認證。
  • Azure VMAccessForLinux 擴充功能 - 建立並重複使用 json 定義檔案來重設 SSH 組態或用戶認證。

在每個疑難解答步驟之後,請嘗試再次連線到您的 VM。 如果您仍然無法連線,請嘗試下一個步驟。

使用 Azure 入口網站

Azure 入口網站 可讓您快速重設 SSH 組態或使用者認證,而不需在本機計算機上安裝任何工具。

若要開始,請在 Azure 入口網站 中選取您的 VM。 向下卷動至 [說明 ] 區段,然後選取 [重設密碼 ],如下列範例所示:

在 Azure 入口網站 中重設 S S H 組態或認證的螢幕快照。

重設 SSH 組態

若要重設 SSH 組態,請在 [模式] 區段中選取 Reset configuration only ,如上一個螢幕快照所示,然後選取 [更新]。 此動作完成後,請嘗試再次存取您的 VM。

重設使用者的 SSH 認證

若要重設現有使用者的認證,請在 [模式] 區段中選取 Reset SSH public keyReset password ,如上一個螢幕快照所示。 指定使用者名稱和 SSH 金鑰或新密碼,然後選取 [ 更新]。

您也可以從此功能表建立 VM 上具有 sudo 許可權的使用者。 輸入新的使用者名稱和相關聯的密碼或 SSH 金鑰,然後選取 [ 更新]。

檢查安全性規則

使用 IP流量驗證來確認 網路安全組中的規則是否封鎖虛擬機的流量。 您也可以檢閱有效的安全組規則,以確保輸入「允許」NSG 規則存在,並優先處理 SSH 埠 (預設 22)。 如需詳細資訊,請參閱使用有效安全性規則對 VM 流量流程進行疑難排解

檢查路由

使用 網路監看員 的 [下一個躍點] 功能,確認路由不會防止流量路由傳送至虛擬機或從虛擬機傳送。 您也可以檢閱有效的路由,以查看網路介面的所有有效路由。 如需詳細資訊,請參閱 使用有效路由對 VM 流量流程進行疑難解答。

使用 Azure VM 序列控制台

Azure VM 序列主控台可讓您存取 Linux 虛擬機的文字型主控台。 您可以使用主控台對互動式殼層中的 SSH 連線進行疑難解答。 請確定您已符合 使用序列主控台的必要條件 ,並嘗試下列命令來進一步針對 SSH 連線進行疑難解答。

檢查 SSH 服務是否正在執行

若要檢查服務狀態,請使用下列命令,在最新的 Linux 發行版中提供:

sudo systemctl status sshd.service

請參閱下列輸出範例。 從 Active 輸出中的行檢查服務狀態。 輸出也會顯示正在接聽的埠和IP位址。

user@hostname:~$ sudo systemctl status sshd.service
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-23 17:44:36 UTC; 1 day 3h ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 829 (sshd)
      Tasks: 1 (limit: 9535)
     Memory: 5.1M
     CGroup: /system.slice/ssh.service
             └─829 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

Jun 23 17:44:35 ubu2004 systemd[1]: Starting OpenBSD Secure Shell server...
Jun 23 17:44:36 ubu2004 sshd[829]: Server listening on 0.0.0.0 port 22.
Jun 23 17:44:36 ubu2004 sshd[829]: Server listening on :: port 22.
Jun 23 17:44:36 ubu2004 systemd[1]: Started OpenBSD Secure Shell server.

如果此命令無法使用或傳回非預期的結果,請使用其他可用的命令。 您可以使用 ss 命令作為根命令,或透過 sudo 命令來確認 SSH 服務是否在您的 VM 上執行。

下列範例示範如何透過 sudo執行 ss 命令:

sudo ss --listen --tcp --process --numeric | grep sshd

注意

建議您使用 ss 命令,因為 netstat 命令已被取代,而且不一定可在新式散發套件中使用。

如果有任何輸出,SSH 就會啟動並執行。 請參閱下列輸出範例:

$ sudo ss -ltpn | grep sshd
LISTEN    0         128                0.0.0.0:22               0.0.0.0:*        users:(("sshd",pid=829,fd=3))
LISTEN    0         128                   [::]:22                  [::]:*        users:(("sshd",pid=829,fd=4))

-ltpn 是自變數的 --listen --tcp --process –numeric 縮短形式。 輸出顯示 SSHD 進程 829 正在接聽 IPv4 和 IPv6 位址。

檢查哪個埠 SSH 正在執行

上述命令輸出顯示 SSHD 進程正在埠 22 上接聽。 當 SSHD 進程設定為在另一個埠上執行時,埠會顯示在輸出中。 若要檢查標準組態檔中是否有變更,請使用下列其中一個命令檢查預設組態檔 /etc/ssh/sshd_config

grep -i port /etc/ssh/sshd_config

grep -i listen /etc/ssh/sshd_config

輸出顯示如下:

Port 22

輸出中以 開頭 # 的任何行都是批注,而且可以放心地忽略。 如果未傳回任何專案,或行是批注,則會使用預設組態。 默認組態是在埠 22 上接聽系統上的所有 IP 位址。

透過 Azure 入口網站 使用執行命令

如果您無法透過序列主控台執行命令,例如當只使用 SSH 金鑰進行驗證時,可以使用執行命令功能發出命令並檢視輸出。 先前從序列主控台執行的所有命令都可以在 Azure 入口網站 的 [執行命令] 區段中,以非互動方式執行。 輸出會傳回至 Azure 入口網站。 不需要在 sudo [執行命令] 內容中執行命令。

使用 Azure CLI

如果您尚未安裝,請安裝最新的 Azure CLI ,並使用 az login 登入 Azure 帳戶。

如果您已建立並上傳自定義 Linux 磁碟映像,請確定 已安裝 azure Linux 代理程式 2.0.5 版或更新版本Microsoft。 針對使用資源庫映像建立的 VM,此存取延伸模組已為您安裝並設定。

重設 SSH 組態

您一開始可以嘗試將 SSH 組態重設為預設值,並在 VM 上重新啟動 SSH 伺服器。 這不會變更用戶帳戶名稱、密碼或 SSH 金鑰。 下列範例會使用 az vm user reset-ssh,在 中myResourceGroup名為 myVM 的 VM 上重設 SSH 組態。 使用您自己的值,如下所示:

az vm user reset-ssh --resource-group myResourceGroup --name myVM

重設使用者的 SSH 認證

下列範例會使用 az vm user update,將 的認證myUsername重設為 中指定的myPassword值,在 中myResourceGroup名為 myVM 的 VM 上。 使用您自己的值,如下所示:

az vm user update --resource-group myResourceGroup --name myVM \
     --username myUsername --password myPassword

如果使用 SSH 金鑰驗證,您可以重設指定使用者的 SSH 金鑰。 下列範例會使用 az vm access set-linux-user,在 中名為 myUsername的 VM myVM myResourceGroup上,更新 儲存在 ~/.ssh/id_rsa.pub 中使用者的 SSH 密鑰。 使用您自己的值,如下所示:

az vm user update --resource-group myResourceGroup --name myVM \
    --username myUsername --ssh-key-value ~/.ssh/id_rsa.pub

使用 VMAccess 擴充功能

適用於Linux的 VM 存取延伸模組會在 json 檔案中讀取,該檔案會定義要執行的動作。這些動作包括重設 SSHD、重設 SSH 金鑰,或新增使用者。 您仍然使用 Azure CLI 來呼叫 VMAccess 擴充功能,但如有需要,您可以跨多個 VM 重複使用 JSON 檔案。 此方法可讓您建立 JSON 檔案的存放庫,以供指定案例呼叫。

重設 SSHD

使用下列內容建立名為 settings.json 的檔案:

{
    "reset_ssh":True
}

使用 Azure CLI,您接著會呼叫 VMAccessForLinux 擴充功能,藉由指定 json 檔案來重設 SSHD 連線。 下列範例會使用 az vm extension set,在 中myResourceGroup名為 myVM 的 VM 上重設 SSHD。 使用您自己的值,如下所示:

az vm extension set --resource-group philmea --vm-name Ubuntu \
    --name VMAccessForLinux --publisher Microsoft.OSTCExtensions --version 1.2 --settings settings.json

重設使用者的 SSH 認證

如果 SSHD 似乎正常運作,您可以重設給者用戶的認證。 若要重設用戶的密碼,請建立名為 settings.json的檔案。 下列範例會將的 myUsername 認證重設為 中指定的 myPassword值。 使用您自己的值,在您的檔案中 settings.json 輸入下列幾行:

{
    "username":"myUsername", "password":"myPassword"
}

或者,若要重設使用者的 SSH 金鑰,請先建立名為 的 settings.json檔案。 下列範例會將 的認證myUsername重設為 中指定的 myPassword值,位於 中myResourceGroup名為 myVM 的 VM 上。 使用您自己的值,在您的檔案中 settings.json 輸入下列幾行:

{
    "username":"myUsername", "ssh_key":"mySSHKey"
}

建立 JSON 檔案之後,請使用 Azure CLI 來呼叫 VMAccessForLinux 擴充功能,藉由指定 JSON 檔案來重設 SSH 使用者認證。 下列範例會在 中myResourceGroup名為 myVM 的 VM 上重設認證。 使用您自己的值,如下所示:

az vm extension set --resource-group philmea --vm-name Ubuntu \
    --name VMAccessForLinux --publisher Microsoft.OSTCExtensions --version 1.2 --settings settings.json

重設 SSH 組態

SSHD 設定本身可能設定錯誤,或服務發生錯誤。 您可以重設 SSHD 以確保 SSH 組態本身有效。 重設 SSHD 應該是您採取的第一個疑難解答步驟。

下列範例會在名為的資源群組中,於名為 myVM myResourceGroup的 VM 上重設 SSHD。 使用您自己的 VM 和資源組名,如下所示:

azure vm reset-access --resource-group myResourceGroup --name myVM \
    --reset-ssh

重設使用者的 SSH 認證

如果 SSHD 似乎正常運作,您可以為授出席者使用者重設密碼。 下列範例會將 的認證myUsername重設為 中指定的 myPassword值,位於 中myResourceGroup名為 myVM 的 VM 上。 使用您自己的值,如下所示:

azure vm reset-access --resource-group myResourceGroup --name myVM \
     --user-name myUsername --password myPassword

如果使用 SSH 金鑰驗證,您可以重設指定使用者的 SSH 金鑰。 下列範例會針對名為 的使用者,更新 中 ~/.ssh/id_rsa.pub 名為 myUsername的 VM myVM myResourceGroup上所儲存的 SSH 金鑰。 使用您自己的值,如下所示:

azure vm reset-access --resource-group myResourceGroup --name myVM \
    --user-name myUsername --ssh-key-file ~/.ssh/id_rsa.pub

重新啟動 VM

如果您已重設 SSH 組態和使用者認證,或這樣做時發生錯誤,您可以嘗試重新啟動 VM 以解決基礎計算問題。

Azure 入口網站

若要使用 Azure 入口網站 重新啟動 VM,請選取您的 VM,然後選取 [重新啟動],如下列範例所示:

在 Azure 入口網站 中重新啟動虛擬機的螢幕快照。

Azure CLI

下列範例會使用 az vm restart 重新啟動名為 的資源群組中名為 myVM myResourceGroup的 VM。 使用您自己的值,如下所示:

az vm restart --resource-group myResourceGroup --name myVM

重新部署 VM

您可以將 VM 重新部署至 Azure 內的另一個節點,以修正任何基礎網路問題。 如需重新部署 VM 的相關信息,請參閱 將虛擬機重新部署至新的 Azure 節點

注意

此作業完成後,暫時磁碟數據會遺失,且會更新與虛擬機相關聯的動態IP位址。

Azure 入口網站

若要使用 Azure 入口網站 重新部署 VM,請選取您的 VM 並向下捲動至 [說明] 區段。 選取 [ 重新部署 ],如下列範例所示:

在 Azure 入口網站 中重新部署虛擬機的螢幕快照。

Azure CLI

下列範例使用 az vm redeploy 重新部署名為 的資源群組中名為 myVM myResourceGroup的 VM。 使用您自己的值,如下所示:

az vm redeploy --resource-group myResourceGroup --name myVM

其他資源

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。