排查与 Azure Linux VM 的 SSH 连接失败、错误或被拒绝的问题

本文可帮助你查找并更正在尝试连接到 Linux 虚拟机 (VM) 时,由于安全外壳 (SSH) 错误、SSH 连接失败或 SSH 被拒绝而导致的问题。 可以使用适用于 Linux 的 Azure 门户、Azure CLI 或 VM 访问扩展来排查和解决连接问题。

注意

本文是否有帮助? 你的输入对我们很重要。 请使用此页面上的 “反馈 ”按钮,让我们了解本文对你的影响,或者我们如何改进它。

快速故障排除步骤

完成每个故障排除步骤后,请尝试重新连接到 VM。

  1. 重置 SSH 配置
  2. 重置用户的凭据
  3. 验证 网络安全组 规则是否允许 SSH 流量和角色分配。
    • 确保存在 网络安全组规则 ,以允许 SSH 流量默认 (,TCP 端口 22) 。
    • 如果不使用 Azure 负载均衡器,则无法使用端口重定向/映射。
    • 如果使用Microsoft Entra ID来管理 SSH 登录名,则必须在包含 VM 及其关联资源的资源组上为用户分配虚拟机管理员登录名或虚拟机用户登录角色。 否则,将收到“权限被拒绝 (公钥) ”错误。 有关详细信息,请参阅为使用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 配置或凭据。 如果使用的是经典 VM,则可以使用 Azure 经典 CLI
  • Azure VMAccessForLinux 扩展 - 创建并重复使用 json 定义文件来重置 SSH 配置或用户凭据。

每个故障排除步骤后,再次尝试连接到 VM。 如果仍无法连接,请尝试下一步。

使用 Azure 门户

Azure 门户提供了一种重置 SSH 配置或用户凭据的快速方法,而无需在本地计算机上安装任何工具。

若要开始,请在Azure 门户中选择 VM。 向下滚动到 “帮助 ”部分,然后选择“ 重置密码 ”,如以下示例所示:

在Azure 门户中重置 SS 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 虚拟机的基于文本的控制台的访问权限。 可以使用控制台在交互式 shell 中排查 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 命令用作 root 或通过 sudo 命令来验证 SSH 服务是否在 VM 上运行。

以下示例演示如何通过 sudo运行 ss 命令:

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

注意

建议使用 命令,ssnetstat因为命令已弃用,在现代分发版中并不总是可用。

如果有任何输出,则 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 门户 使用 Run 命令

如果无法通过串行控制台运行命令,例如,仅使用 SSH 密钥进行身份验证时,可以使用“运行命令”功能发出命令并查看输出。 以前从串行控制台运行的所有命令都可以在Azure 门户的“运行命令”部分中以非交互方式运行。 输出将返回到Azure 门户。 无需使用 sudo 在“运行命令”上下文中运行命令。

使用 Azure CLI

如果尚未安装,请安装最新的 Azure CLI 并使用 az login 登录到 Azure 帐户。

如果已创建并上传自定义 Linux 磁盘映像,请确保已安装 Microsoft Azure Linux 代理版本 2.0.5 或更高版本。 对于使用库映像创建的 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 在 中名为 myVM 的 VM 上将 的myUsername凭据重置为 中指定的myPasswordmyResourceGroup值。 使用自己的值,如下所示:

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

如果使用 SSH 密钥身份验证,可以重置给定用户的 SSH 密钥。 以下示例使用 az vm access set-linux-user 更新 中~/.ssh/id_rsa.pub名为 myUsernamemyVM 的用户存储的 myResourceGroupSSH 密钥。 使用自己的值,如下所示:

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。 以下示例在 中名为 myVM 的 VM 上将 的myUsername凭据重置为 中指定的myPasswordmyResourceGroup值。 使用自己的值在 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

使用 Azure 经典 CLI

如果尚未 安装,请安装 Azure 经典 CLI 并连接到 Azure 订阅。 请确保使用资源管理器模式,如下所示:

azure config mode arm

如果已创建并上传自定义 Linux 磁盘映像,请确保已安装 Microsoft Azure Linux 代理版本 2.0.5 或更高版本。 对于使用库映像创建的 VM,已安装并配置了此访问扩展。

重置 SSH 配置

SSHD 配置本身可能配置错误,或者服务遇到错误。 可以重置 SSHD 以确保 SSH 配置本身有效。 重置 SSHD 应该是你执行的第一个故障排除步骤。

以下示例在名为 的资源组myResourceGroup中名为 myVM 的 VM 上重置 SSHD。 使用自己的 VM 和资源组名称,如下所示:

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

重置用户的 SSH 凭据

如果 SSHD 似乎正常运行,则可以重置给方用户的密码。 以下示例在 中名为 myVM 的 VM 上将 的myUsername凭据重置为 中指定的myPasswordmyResourceGroup值。 使用自己的值,如下所示:

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

如果使用 SSH 密钥身份验证,可以重置给定用户的 SSH 密钥。 以下示例更新 中 ~/.ssh/id_rsa.pub 名为 myUsername的用户在 中名为 的 VM 上存储的 myVMmyResourceGroupSSH 密钥。 使用自己的值,如下所示:

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 重启名为 的资源组中名为 myVMmyResourceGroupVM。 使用自己的值,如下所示:

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

Azure 经典 CLI

重要

经典 VM 将于 2023 年 9 月 1 日停用

如果使用 ASM 中的 IaaS 资源,请在 2023 年 9 月 1 日前完成迁移。 我们建议你尽快进行切换,以利用 Azure 资源管理器 中的许多功能增强功能。

有关详细信息,请参阅在 2023 年 9 月 1 日前将 IaaS 资源迁移到 Azure 资源管理器

以下示例重启名为 myVM 的资源组中名为 的 myResourceGroupVM。 使用自己的值,如下所示:

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

重新部署 VM

可以将 VM 重新部署到 Azure 中的另一个节点,这可能会纠正任何基础网络问题。 有关重新部署 VM 的信息,请参阅 将虚拟机重新部署到新的 Azure 节点

注意

此操作完成后,会丢失临时磁盘数据,并且更新与虚拟机关联的动态 IP 地址。

Azure 门户

若要使用Azure 门户重新部署 VM,请选择 VM 并向下滚动到“帮助”部分。 选择 “重新部署 ”,如以下示例所示:

在Azure 门户中重新部署虚拟机的屏幕截图。

Azure CLI

以下示例使用 az vm redeploy 在名为 的 myVM 资源组中重新部署名为 的 myResourceGroupVM。 使用自己的值,如下所示:

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

Azure 经典 CLI

以下示例在名为 的 myVM 资源组中重新部署名为 的 myResourceGroupVM。 使用自己的值,如下所示:

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

使用经典部署模型创建的 VM

重要

经典 VM 将于 2023 年 9 月 1 日停用

如果使用 ASM 中的 IaaS 资源,请在 2023 年 9 月 1 日前完成迁移。 我们建议你尽快进行切换,以利用 Azure 资源管理器 中的许多功能增强功能。

有关详细信息,请参阅在 2023 年 9 月 1 日前将 IaaS 资源迁移到 Azure 资源管理器

请尝试以下步骤来解决使用经典部署模型创建的 VM 最常见的 SSH 连接故障。 完成每个步骤后,请尝试重新连接到 VM。

  • Azure 门户重置远程访问。 在Azure 门户,选择 VM,然后选择“重置远程...”

  • 重新启动 VM。 在Azure 门户上,选择 VM,然后选择“重启”。

  • 将 VM 重新部署到新的 Azure 节点。 有关如何重新部署 VM 的信息,请参阅 将虚拟机重新部署到新的 Azure 节点

    此操作完成后,将丢失临时磁盘数据,并且将更新与虚拟机关联的动态 IP 地址。

  • 按照 如何重置基于 Linux 的虚拟机的密码或 SSH 中的说明进行操作:

    • 重置密码或 SSH 密钥。
    • 创建 sudo 用户帐户。
    • 重置 SSH 配置。
  • 检查 VM 的资源运行状况,了解是否存在任何平台问题。
    选择 VM 并向下滚动 “设置检查>运行状况”。

其他资源

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。