针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除

适用于:✔️ Linux VM

尝试连接到 Linux 虚拟机 (VM) 时,可能会由于安全外壳 (SSH) 错误、SSH 连接失败或 SSH 被拒绝而发生问题,本文可帮助你查找并更正这些问题。 可以使用 Azure 门户、Azure CLI 或适用于 Linux 的 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 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 门户 使用 Run Command

如果无法通过串行控制台运行命令,例如,仅使用 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,在 myResourceGroup 中名为 myVM 的 VM 上, 将 myUsername 的凭据重置为 myPassword 中指定的值。 请如下所示使用自己的值:

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

如果使用 SSH 密钥身份验证,可以重置给定用户的 SSH 密钥。 以下示例在 myResourceGroup 中名为 myVM 的 VM 上,使用 az vm access set-linux-user 更新存储在 ~/.ssh/id_rsa.pub 中的用户名为 myUsername 的 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 的文件。 以下示例在 myResourceGroup 中名为 myVM 的 VM 上,将 myUsername 的凭据重置为 myPassword 中指定的值。 在 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。

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

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

重置用户的 SSH 凭据

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

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

如果使用 SSH 密钥身份验证,可以重置给定用户的 SSH 密钥。 以下示例在 myResourceGroup 中名为 myVM 的 VM 上,更新 ~/.ssh/id_rsa.pub 中为用户 myUsername 存储的 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 重新启动名为 myResourceGroup 的资源组中名为 myVM 的 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 重新部署名为 myResourceGroup 的资源组中名为 myVM 的 VM。 请如下所示使用自己的值:

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

其他资源

联系我们寻求帮助

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