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

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

快速故障排除步骤

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

  1. 重置 SSH 配置
  2. 重置用户的凭据
  3. 验证 网络安全组 规则是否允许 SSH 流量。
    • 确保存在 网络安全组规则 ,以允许默认情况下 SSH 流量 (TCP 端口 22) 。
    • 如果不使用 Azure 负载均衡器,则无法使用端口重定向/映射。
  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 门户中的 S S H 配置或凭据的屏幕截图。

重置 SSH 配置

若要重置 SSH 配置,请在“模式”部分中选择Reset configuration only,如上一屏幕截图所示,然后选择“更新”。 完成此操作后,请尝试再次访问 VM。

重置用户的 SSH 凭据

若要重置现有用户的凭据,请选择“Reset SSH public key模式”部分,Reset 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 命令作为根或通过 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 磁盘映像,请确保已安装 Microsoft Azure Linux 代理 版本 2.0.5 或更高版本。 对于使用库映像创建的 VM,已安装并配置此访问扩展。

重置 SSH 配置

最初可以尝试将 SSH 配置重置为默认值,并在 VM 上重新启动 SSH 服务器。 这不会更改用户帐户名称、密码或 SSH 密钥。 以下示例使用 az vm user reset-ssh 在命名myVMmyResourceGroup的 VM 上重置 SSH 配置。 使用自己的值,如下所示:

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

重置用户的 SSH 凭据

下面的示例使用 az vm 用户更新在命名myVMmyResourceGroup的 VM 上重置指定myPassword值的凭据myUsername。 使用自己的值,如下所示:

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

如果使用 SSH 密钥身份验证,则可以重置给定用户的 SSH 密钥。 以下示例使用 az vm access set-linux-user 更新在命名myVM的 VM 上为命名myUsername用户存储~/.ssh/id_rsa.pubmyResourceGroupSSH 密钥。 使用自己的值,如下所示:

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 扩展集在命名myVMmyResourceGroup的 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"
}

Or to reset the SSH key for a user, first create a file named settings.json. 以下示例将命名为的 VM myVMmyResourceGroup上的凭据重置为myUsername指定myPassword的值。 使用自己的值在文件中 settings.json 输入以下行:

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

创建 json 文件后,使用 Azure CLI 调用 VMAccessForLinux 扩展,通过指定 json 文件来重置 SSH 用户凭据。 以下示例在命名myVMmyResourceGroup的 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资源组中的 VM myVM 上的 SSHD。 使用自己的 VM 和资源组名称,如下所示:

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

重置用户的 SSH 凭据

如果 SSHD 看起来正常运行,则可以重置给定用户的密码。 以下示例将命名为的 VM myVMmyResourceGroup上的凭据重置为myUsername指定myPassword的值。 使用自己的值,如下所示:

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

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

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

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

Azure 经典 CLI

重要

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

如果使用 ASM 中的 IaaS 资源,请在 2023 年 3 月 1 日之前完成迁移。 我们鼓励你更快地进行切换,以利用 Azure 资源管理器中的多项功能增强功能。

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

The following example restarts the VM named myVM in the resource group named myResourceGroup. 使用自己的值,如下所示:

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

重新部署 VM

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

注意

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

Azure 门户

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

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

Azure CLI

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

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

Azure 经典 CLI

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

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

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

重要

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

如果使用 ASM 中的 IaaS 资源,请在 2023 年 3 月 1 日之前完成迁移。 我们鼓励你更快地进行切换,以利用 Azure 资源管理器中的多项功能增强功能。

有关详细信息,请参阅在 2023 年 3 月 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 社区支持