排查 SSH 问题

在某些情况下,Google Compute Engine 实例可能不再接受 SSH 连接。发生此情况的原因有多种,可能是磁盘已满,也可能是意外地对 sshd 进行了错误的配置。此部分介绍了多种排查和解决常见 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

在串行控制台中调试问题

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

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

测试网络

您可以使用 netcat 工具通过端口 22 连接您的实例,然后检查网络连接是否正常。如果您建立了连接并看到 SSH 横幅(例如 SSH-2.0-OpenSSH_6.0p1 Debian-4),则表示您的网络连接正常,因此可以排除防火墙问题。首先,使用 gcloud 工具来获取实例的外部 natIP

gcloud compute instances describe example-instance --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
198.51.100.8

使用 nc 命令来连接您的实例:

# Check for SSH banner
user@local:~$ nc [EXTERNAL_IP] 22
SSH-2.0-OpenSSH_6.0p1 Debian-4

尝试以新用户身份登录

导致您无法登录的问题可能仅限于您的帐号(例如,如果针对实例上 ~/.ssh/authorized_keys 文件的权限未正确设置)。

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

user@local:~$ gcloud compute ssh [USER]@example-instance

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

在新实例上使用您的磁盘

如果上述步骤不起作用,并且您希望检查的实例是从永久性磁盘启动的,那么您可以分离永久性磁盘并附加此磁盘以在新实例上使用。将以下示例中的 DISK 替换为您的磁盘名称:

gcloud compute instances delete old-instance --keep-disks=boot
gcloud compute instances create new-instance --disk name=DISK,boot=yes,auto-delete=no
gcloud compute ssh new-instance

检查实例而不将其关闭

您可能无法连接某个实例,但该实例可以继续正常处理生产流量。在这种情况下,您可能需要检查磁盘,而不中断为用户提供服务的实例。首先,截取实例启动磁盘的快照,然后通过该快照创建新磁盘,创建临时实例,最后将新的永久性磁盘附加并装载到您的临时实例以排查磁盘问题。

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

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

    gcloud compute firewall-rules create debug-network-allow-ssh --allow tcp:22
    
  3. 创建相关磁盘的快照,将 DISK 替换为磁盘名称:

    gcloud compute disks snapshot 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/myinstance
    
    $ mount /dev/disk/by-id/scsi-0Google_PersistentDisk_example-disk-debugging /mnt/myinstance
    
    $ cd /mnt/myinstance/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 INSTANCE --keep-disks boot
    
  2. 添加附加了同一磁盘的新实例并指定您的启动脚本。

    gcloud compute instances create example-instance --disk name=DISK,boot=yes --startup-script-url URL
    

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

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档