SSH 问题排查

在某些情况下,Google Compute Engine 实例可能不再接受 SSH 连接,其中的原因有很多。SSH 连接问题的一些常见原因如下:

  • 实例所在的磁盘已满。请检查磁盘空间并根据需要进行清理。
  • sshd 守护进程未正确配置。请查看操作系统的用户指南,确保正确设置了 ssh_d 文件。
  • 对实例启用了操作系统登录。您不能同时使用 SSH 密钥和操作系统登录连接到实例。如果启用了操作系统登录,则使用基于元数据的 SSH 密钥进行连接的功能会停用。

本主题介绍了多种有助于排查并解决一些最常见的 SSH 问题的提示和方法。

要求

您可以从本地工作站执行大多数问题排查步骤。如需使用本地 Linux 或 Windows 工作站对虚拟机实例进行问题排查,您必须先准备工作站。

您可以通过以下步骤准备工作站:

  • 安装或更新为 gcloud 命令行工具的最新版本。
  • 安装适用于您操作系统的 nmap 网络发现和安全审核工具。您将使用此工具测试与虚拟机实例的网络连接。
  • 设置环境变量。

设置环境变量

您可以为本问题排查指南中可能频繁使用的任何参数(例如实例名称和受影响实例的永久性启动磁盘的名称)设置环境变量。

您可以在本地工作站上设置环境变量。

Linux 或 macOS

在 Linux 或 macOS 工作站上,请使用 export 命令。

export PROB_INSTANCE='[INSTANCE_NAME]'
export BOOT_DISK='[BOOT_DISK_NAME]'

其中:

  • [INSTANCE_NAME] 是您要对其进行问题排查的实例的名称。
  • [BOOT_DISK_NAME] 是您要对其进行问题排查的实例的永久性启动磁盘名称。

例如,如果实例名为 instance1,启动磁盘名为 disk1,请运行以下命令:

export PROB_INSTANCE='instance1'
export BOOT_DISK='disk1'

Windows

在 Windows 操作系统上,请使用 set 命令。

set PROB_INSTANCE='[INSTANCE_NAME]'
set BOOT_DISK='[BOOT_DISK_NAME]'

其中:

  • [INSTANCE_NAME] 是您要对其进行问题排查的实例的名称。
  • [BOOT_DISK_NAME] 是您要对其进行问题排查的实例的永久性启动磁盘名称。

例如,如果实例名为 instance1,启动磁盘名为 disk1,请运行以下命令:

set PROB_INSTANCE='instance1'
set BOOT_DISK='disk1'

测试连接性

由于与防火墙、网络连接或用户帐号相关联的连接性问题,您可能无法通过 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

测试网络连接

您可以使用 nmap 工具连接到端口 22 上的实例,并查看网络连接是否正常。如果您建立了连接并看到 22/tcp open ssh,则表示您的网络连接正常,因此可以排除防火墙问题。

  1. 使用 gcloud 工具获取实例的外部 natIP

    gcloud compute instances describe $PROB_INSTANCE --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
    198.51.100.1
    
  2. 测试与您的实例的网络连接。

    运行 nmap 命令可以测试与您的实例的网络连接:

    nmap [EXTERNAL_IP]
    

    其中 [EXTERNAL_IP] 是实例的外部 IP 地址。

    例如,如果实例的外部 IP 地址为 198.51.100.1,请运行以下命令:

    user@local:~$  nmap 198.51.100.1
    
    Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-18 16:04 Greenwich Standard Time
    Nmap scan report for 229.30.196.35.bc.googleusercontent.com (198.51.100.1)
    Host is up (0.0061s latency).
    Not shown: 998 filtered ports
    PORT     STATE  SERVICE
    22/tcp   open   ssh
    Nmap done: 1 IP address (1 host up) scanned in 6.22 seconds
    

以其他用户身份连接

导致您无法登录的问题可能仅限于您的用户帐号。例如,没有为用户正确设置实例上 ~/.ssh/authorized_keys 文件的权限。

您可以通过使用 SSH 请求指定其他用户名,尝试使用 gcloud 工具以其他用户身份登录。gcloud 工具将更新项目的元数据以添加新用户并允许进行 SSH 访问。

user@local:~$ gcloud compute ssh [USER]@$PROB_INSTANCE

其中 [USER] 是用于登录的新用户名。

在串行控制台中调试问题

在某些情况下,您可以通过从串行控制台查看日志来查找连接错误。您可以使用浏览器从本地工作站访问串行控制台。

您可以启用对实例的串行控制台的读写访问权限,以便登录到该控制台并对实例进行问题排查。如果您无法使用 SSH 登录或者实例没有连接到网络,这样做特别有用。在这两种情况下,串行控制台仍然可供访问。

如需了解如何启用互动式访问以及如何连接实例的串行控制台,请参阅与串行控制台互动

在不关停虚拟机实例的情况下对其进行检查

您可能无法连接某个实例,但该实例可以继续正常处理生产流量。遇到这种情况时,您可能希望在不中断实例的情况下检查磁盘。

如需检查实例,您需要截取启动磁盘的快照并基于该快照创建新磁盘,然后创建临时实例,最后将新的永久性磁盘挂接并装载到临时实例,以便对该磁盘进行问题排查。

  1. 创建新的 VPC 网络以托管您的克隆实例:

    gcloud compute networks create debug-network
    
  2. 添加防火墙规则以允许通过 SSH 连接到网络:

    gcloud compute firewall-rules create debug-network-allow-ssh --allow tcp:22
    
  3. 创建启动磁盘的快照:

    gcloud compute disks snapshot $BOOT_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/$PROB_INSTANCE
    
    $ mount /dev/disk/by-id/scsi-0Google_PersistentDisk_example-disk-debugging /mnt/$PROB_INSTANCE
    
    $ cd /mnt/$PROB_INSTANCE/var/log
    
    # Identify the issue preventing ssh from working
    $ ls
    

使用启动脚本

如果上述步骤不起作用,您可以创建启动脚本以在实例启动后立即收集信息。请按照说明来运行启动脚本

之后,您还需要使用 gcloud compute instances reset 重置您的实例,然后元数据才会生效。或者,您也可以使用诊断启动脚本来重新创建您的实例:

  1. 运行 gcloud compute instances delete 并添加 --keep-disks 标志。

    gcloud compute instances delete $PROB_INSTANCE --keep-disks boot
    
  2. 添加附加了同一磁盘的新实例并指定您的启动脚本。

    gcloud compute instances create new-instance --disk name=$BOOT_DISK,boot=yes --startup-script-url URL
    

首先,您可以使用 compute-ssh-diagnostic 脚本来收集最常见问题的诊断信息。

在新实例上使用磁盘

如果本文档中的其他步骤不奏效并且您需要从永久性启动磁盘恢复数据,则可以分离启动磁盘,然后将该磁盘作为辅助磁盘挂接到新实例上。

gcloud compute instances delete $PROB_INSTANCE --keep-disks=boot
gcloud compute instances create new-instance --disk name=$BOOT_DISK,boot=yes,auto-delete=no
gcloud compute ssh new-instance
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档