使用高级方法连接到虚拟机


通常,最好采用连接到实例文档中所述的 SSH 连接方法来连接实例。但是,如果您需要管理自己的凭据、使用第三方工具,或者使用其他连接路径进行连接,以下高级方法可能比标准方法更能满足您的需求。

您可以使用以下几种高级方法连接到 Linux 虚拟机:

准备工作

向实例提供 SSH 公钥

通常,使用连接到实例中介绍的方法进行连接时,Compute Engine 会为您创建和管理 SSH 密钥。

但是,如果您需要使用自己的 SSH 密钥(例如使用第三方工具进行连接),则必须先生成自己的 SSH 密钥对,将 SSH 公钥文件提供给实例,然后再进行连接。

如果您不熟悉如何生成自己的 SSH 密钥以及如何找到 SSH 公钥文件,请参阅创建新的 SSH 密钥查找 SSH 密钥

要将您的 SSH 密钥提供给实例,请使用以下任一方法:

  • (推荐)启用 OS Login。OS Login 使用 IAM 角色,通过您的 Google 帐号或受管用户帐号为实例提供 SSH 公钥。如需查看说明,请参阅设置 OS Login

    设置 OS Login 时,请务必完成将 SSH 密钥添加到用户帐号的步骤。 在此步骤中,您可以将公钥添加到要用于连接虚拟机的用户帐号。

    如需详细了解使用此功能的好处,请参阅 OS Login

  • (不推荐)通过修改项目或实例元数据手动添加和移除 SSH 密钥。请参阅管理元数据中的 SSH 密钥。 此方法会增加不必要的风险和复杂性,因此除非上述 OS Login 方法不适合您的情况,否则不推荐采用此方法。请参阅手动管理密钥的风险

  • 如果您的实例由已拥有访问权限的其他人(例如贵组织中的系统管理员)管理,您也可以向他们提供 SSH 公钥文件,并让他们为您手动配置该文件。他们通常需要连接到您的实例、将您的公钥文件复制到实例的主目录中,以及更改该文件的权限,但这具体取决于您的组织管理实例的方式。

使用第三方工具进行连接

如需连接,请按照适用于本地工作站操作系统的步骤进行操作:

Linux 和 macOS

如需使用 SSH 从 Linux 或 macOS 机器进行连接,请在本地终端使用内置的 ssh 命令:

  1. 使用某一可用方式向实例提供 SSH 公钥(如果您尚未执行此操作)。如果未完成,您将无法继续操作。

  2. 在 Google Cloud Console 中,转到虚拟机实例页面,找到要连接到的实例的外部 IP 地址。

    转到“虚拟机实例”

  3. 在本地终端中,使用 ssh 命令,并提供您的 SSH 私钥文件、用户名以及要连接的实例的外部 IP 地址。例如:

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP

    请替换以下内容:

    • PATH_TO_PRIVATE_KEY您的 SSH 私钥文件的路径
    • USERNAME:连接到实例的用户的用户名。如果您在元数据中管理 SSH 密钥,则用户名是您在创建 SSH 密钥时指定的名称。对于 OS Login 帐号,用户名在 Google 个人资料中定义。
    • EXTERNAL_IP:您的实例的外部 IP 地址。

    连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

Windows (PuTTY)

Windows 未提供内置的 SSH 客户端,因此您必须下载并安装第三方客户端。以下说明演示了如何使用 PuTTY 进行连接。

如需使用 PuTTY 从 Windows 连接到实例,请执行以下操作:

  1. 使用某一可用方式向实例提供 SSH 公钥(如果您尚未执行此操作)。如果未完成,您将无法继续操作。

  2. 在 Google Cloud Console 中,转到虚拟机实例页面,找到要连接到的实例的外部 IP 地址。保留此外部 IP 地址以供后续步骤使用。

    转到“虚拟机实例”

  3. 下载 putty.exe(如果您尚未下载)。

  4. 启动 putty.exe 以打开 PuTTY。系统将打开连接配置窗口。

  5. Host Name 字段中,输入与 SSH 密钥关联的用户名,以及您要连接到的实例的外部 IP 地址。请使用以下格式:

    USERNAME@EXTERNAL_IP

    请替换以下内容:

    • USERNAME:连接到实例的用户的用户名。此值必须是您在创建 SSH 密钥时指定的用户名。
    • EXTERNAL_IP:您要连接到的实例的外部 IP 地址。

    例如,请参考以下屏幕截图:

    将“Host Name”字段设置为 jane_doe@203.0.113.2 作为用户名和 IP 地址的示例

  6. Category 菜单中,依次转到 Connection > SSH > Auth

  7. Private key file for authentication 字段中,浏览到您的私钥文件所在的位置

    例如,请参考以下屏幕截图:

    在私钥文件字段中设置 my-ssh-key.ppk 文件的路径。

  8. 点击 Open 以打开一个与您的实例连接的终端。

连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

Chrome 操作系统(SSH 应用)

Chromebook 或已安装 Chrome 的操作系统支持将 Secure Shell 用作 SSH 客户端。如需从 Secure Shell 应用连接到实例,请执行以下操作:

  1. 使用某一可用方式向实例提供 SSH 公钥(如果您尚未执行此操作)。如果未完成,您将无法继续操作。

  2. 在 Chromebook 或 Chrome 浏览器中安装 Secure Shell(如果您尚未执行此操作)。

  3. 在 Google Cloud Console 中,转到虚拟机实例页面,找到要连接到的实例的外部 IP 地址。保留此外部 IP 地址以供后续步骤使用。

    转到“虚拟机实例”

  4. 在 Chrome 浏览器标签页中打开 Secure Shell 应用。您可以通过在地址栏中输入 chrome://apps 来访问 Chrome 应用。

  5. 输入与 SSH 密钥对关联的用户名和要连接到的实例的外部 IP 地址。请使用以下格式:

     USERNAME@EXTERNAL_IP
     

    请替换以下内容:

    • USERNAME:连接到实例的用户的用户名。此值必须是您在创建 SSH 密钥时指定的用户名。
    • EXTERNAL_IP:您要连接到的实例的外部 IP 地址。
  6. Identity 字段中,选择您要用于连接实例的 SSH 私钥文件。如有必要,请点击 Import 从本地工作站中选择私钥文件。

  7. 点击 Connect 以连接到实例。

连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

其他 SSH 方案

除了上面介绍的方案之外,其他使用 SSH 连接实例的方案包括:

连接到没有外部 IP 地址的实例

如果您拥有没有外部 IP 地址的隔离实例,您仍然可以使用其在 Google Cloud VPC 网络中的内部 IP 地址连接到这些实例。例如,您仍然可以使用以下方法连接到您有意将其与外部网络隔离的虚拟机:

通过 VPN 连接进行连接

如需使用 Virtual Private Network (VPN) 连接到没有外部 IP 地址的实例,请按如下所述操作:

  • 您必须使用可通过 Cloud VPN 隧道访问虚拟机实例的计算机。

    例如,您可能有一个由本地内部网络与 Google Cloud VPC 共用的 VPN。在这种情况下,请使用 gcloud 命令行工具、Linux 或 macOS 上的 SSH 或第三方 SSH 客户端(例如 Windows 上的 PuTTY)连接到实例。

如需了解详情,请参阅以下标签页:

gcloud

如需连接到没有外部 IP 地址的实例,请使用带有 --internal-ip 标志的 gcloud compute ssh 命令。

  1. 在 Google Cloud Console 中,转到虚拟机实例页面,找到要连接到的实例的内部 IP 地址。

    转到“虚拟机实例”

  2. 连接到实例。

    gcloud compute ssh INTERNAL_INSTANCE_NAME \
        --zone=ZONE \
        --internal-ip
    

    请替换以下内容:

    • INTERNAL_INSTANCE_NAME:要连接到的实例的名称。
    • ZONE:实例所在地区的名称。
  3. 连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

Linux 和 macOS

如需从 Linux 或 macOS 工作站连接到没有外部 IP 地址的实例,请执行以下操作:

  1. 使用某一可用方式向实例提供 SSH 公钥。如果未完成,您将无法继续操作。

  2. 在您的本地机器上,启动 ssh-agent 来为您管理 SSH 密钥:

    eval ssh-agent $SHELL
    
  3. 使用 ssh-add 命令将您的 SSH 私钥从本地计算机加载到代理中,并将 SSH 私钥用于所有 SSH 命令的身份验证。将 PRIVATE_KEY 替换为您的私钥文件的文件名。

    ssh-add ~/.ssh/PRIVATE_KEY
    
  4. 在 Google Cloud Console 中,转到虚拟机实例页面,找到要连接到的实例的内部 IP 地址。

    转到“虚拟机实例”

  5. 在本地终端中,使用 ssh 命令,并提供与您的 SSH 私钥关联的用户名以及要连接到的实例的内部 IP 地址。例如:

    ssh USERNAME@INTERNAL_INSTANCE_IP_ADDRESS

    请替换以下内容:

    • USERNAME:连接到实例的用户的用户名。此值必须是您在创建 SSH 密钥时指定的用户名。
    • INTERNAL_INSTANCE_IP_ADDRESS:您要连接到的实例的内部 IP 地址。

连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

Windows (PuTTY)

要从 Windows 工作站连接到没有外部 IP 地址的实例,请执行以下操作:

  1. 使用某一可用方式向实例提供 SSH 公钥(如果您尚未执行此操作)。如果未完成,您将无法继续操作。

  2. 在 Google Cloud Console 中,转到虚拟机实例页面,找到要连接到的实例的内部 IP 地址。

    转到“虚拟机实例”

  3. 按照上述步骤使用 PuTTY 从 Windows 连接到实例,但要做出以下更改:

    • 当步骤指示您指定外部 IP 地址时,请改为指定要连接的实例的内部 IP 地址。

连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

通过堡垒主机进行连接

连接到没有外部 IP 地址的实例的另一种方法是通过堡垒主机进行连接。 此外,您也可以使用堡垒主机连接到其他对等互连 VPC 网络上的实例。

如要通过堡垒主机从 Linux 和 macOS 连接到实例,请使用 gcloud 命令行工具或 SSH。如需从 Windows 进行连接,请使用第三方 SSH 客户端(例如 PuTTY)。

从堡垒主机连接到其他实例需要使用 SSH 私钥。您可以通过以下几种方法管理这些私钥:

  • 安装并配置 gcloud 命令行工具,让它来为您管理私钥。
  • 在 ssh 客户端中启用代理转发功能,以将您的私钥转发到堡垒主机实例。

请参阅以下示例中的完整步骤:

gcloud

借助 gcloud 命令行工具,您可以连接到没有外部 IP 地址的实例,而无需将 SSH 私钥转发到堡垒主机。如要执行此操作,请在本地工作站和堡垒主机实例上安装 gcloud(如果您尚未这样做)。

如需使用 gcloud 命令行工具连接到没有外部 IP 地址的实例,请执行以下操作:

  1. 为堡垒主机实例上的服务帐号设置 Compute Engine API 的读写访问权限范围,方法是在命令中加入 --scopes compute-rw。如需了解详情,请参阅更改实例的服务帐号和访问权限范围

  2. 授予必要的 IAM 权限,以允许堡垒主机使用 OS Login(建议做法)或项目元数据访问您的 SSH 公钥。使用以下任一过程:

    堡垒主机上的服务帐号现在可以应用您的 SSH 公钥。

  3. 连接到 Linux 堡垒主机实例。将 EXTERNAL_INSTANCE_NAME 替换为您用于获取内部网络访问权限的堡垒主机实例的名称。

    gcloud compute ssh EXTERNAL_INSTANCE_NAME
    
  4. 在 Linux 堡垒主机实例中,使用带有 --internal-ip 标志的 gcloud compute ssh 命令,通过实例的内部 IP 地址连接到实例。

    gcloud compute ssh INTERNAL_INSTANCE_NAME --internal-ip
    

    INTERNAL_INSTANCE_NAME 替换为您要连接到的实例的名称。

连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

Linux 和 macOS

如果您需要将私钥转发到堡垒主机实例,必须将您的密钥添加到 ssh-agent。然后,使用 gcloud compute ssh 命令或 ssh 命令建立与堡垒主机的初始连接,并转发 SSH 代理中的密钥。此过程仅适用于 Linux 和 macOS 工作站。如果您需要从 Windows 工作站将私钥转发到堡垒主机,请改为按照 PuTTY 说明进行操作。

要从 Linux 或 macOS 工作站连接到没有外部 IP 地址的实例,请执行以下操作:

  1. 使用一个可用选项来提供 SSH 公钥。确保将此 SSH 公钥提供给 Linux 堡垒主机实例和没有外部 IP 地址的实例。

  2. 在您的本地机器上,启动 ssh-agent 来为您管理 SSH 密钥:

    eval ssh-agent $SHELL
    
  3. 使用 ssh-add 命令将您的 SSH 私钥从本地计算机加载到代理中。添加后,SSH 命令会自动使用 SSH 私钥文件进行身份验证。

    $ ssh-add ~/.ssh/PRIVATE_KEY
    

    PRIVATE_KEY 替换为您的私钥文件的名称。

  4. 在 Google Cloud Console 中,转到虚拟机实例页面。 在外部 IP 列中,找到 Linux 堡垒主机实例的外部 IP 地址。在内部 IP 列中,找到您要连接到的内部实例的内部 IP 地址。

    转到“虚拟机实例”

  5. 使用 sshgcloud compute ssh 连接到 Linux 堡垒主机实例。无论使用哪种方式,您都可以加入 -A 参数来启用身份验证代理转发功能。

    使用 ssh 连接到 Linux 堡垒主机实例并转发您的私钥:

    ssh -A USERNAME@BASTION_HOST_EXTERNAL_IP

    请替换以下内容:

    • USERNAME:附加到您的 SSH 密钥的名称。
    • BASTION_HOST_EXTERNAL_IP:您用于获取内部网络访问权限的堡垒主机实例的外部 IP 地址。

    或者,您也可以使用 gcloud compute ssh 命令连接到堡垒主机实例并转发您的私钥。这种方式可让您使用 gcloud 命令行工具连接到堡垒主机实例,然后使用常规 ssh 和转发的凭据来连接到内部 IP 地址。

    gcloud compute ssh --ssh-flag="-A" BASTION_HOST_INSTANCE_NAME
    

    BASTION_HOST_INSTANCE_NAME 替换为您用于获取内部网络访问权限的堡垒主机实例的名称。

  6. 从 Linux 堡垒主机实例中,使用 SSH 连接到没有外部 IP 地址的实例:

    ssh USERNAME@INTERNAL_INSTANCE_IP_ADDRESS

    请替换以下内容:

    • USERNAME:附加到您的 SSH 密钥的名称。
    • INTERNAL_INSTANCE_IP_ADDRESS:您要连接到的实例的内部 IP 地址。

连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

Windows

要从 Windows 工作站连接到没有外部 IP 地址的实例,请执行以下操作:

  1. 使用一个可用选项来提供 SSH 公钥。确保将此 SSH 公钥提供给 Linux 堡垒主机实例和没有外部 IP 地址的实例。

  2. 在 Google Cloud Console 中,转到虚拟机实例页面。 在外部 IP 列中,找到 Linux 堡垒主机实例的外部 IP 地址。在内部 IP 列中,找到您要连接到的内部实例的内部 IP 地址。

    转到“虚拟机实例”

  3. 使用 PuTTY 连接到 Linux 堡垒主机实例。 如需将 SSH 私钥传递到堡垒主机,请选中 Allow agent forwarding 设置,如以下屏幕截图所示:

    对您要连接到的实例允许代理转发。

  4. 从 Linux 堡垒主机实例中,使用 SSH 连接到没有外部 IP 地址的实例:

    ssh USERNAME@INTERNAL_IP_ADDRESS
    

    请替换以下内容:

    • USERNAME:连接到实例的用户的用户名。此值必须是您在创建 SSH 密钥时指定的用户名。
    • INTERNAL_IP_ADDRESS:您要连接到的实例的内部 IP 地址。

    连接后,使用此终端在您的实例上运行命令。 完成后,运行 exit 命令断开与该实例的连接。

通过 IAP 连接

使用 SSH 搭配 IAP 的 TCP 转发功能可将 SSH 连接封装在 HTTPS 内部。这样一来,IAP 的 TCP 转发功能就能将网址发送至远程实例。

  1. roles/iap.tunnelResourceAccessor 角色授予要连接到虚拟机的用户。

  2. 连接到虚拟机。

    gcloud compute ssh INSTANCE_NAME --zone ZONE
    

    请替换以下内容:

    • INSTANCE_NAME:要连接到的实例的名称。
    • ZONE:实例所在可用区的名称。

如需了解详情,包括如何配置情境感知规则以及如何访问虚拟机上的其他 TCP 端口,请参阅使用 TCP 转发

以根用户身份连接到实例

默认情况下,公共映像和大多数常用操作系统都不允许使用 SSH 以根用户身份登录。您必须先将实例配置为允许以根用户身份使用 SSH 进行连接,实例才能以这种方式运作。

最佳做法是将 /etc/ssh/sshd_config SSH 配置文件的 PermitRootLogin 参数设置为 no。完成这项参数设置后,即使您在项目或实例元数据中为 root 指定了 SSH 密钥,也无法以根用户身份连接到实例。如果用户需要根用户权限,他们可以通过 sudo 运行相关命令来获取这些权限。

如果您将实例配置为允许以根用户身份使用 SSH 进行连接,并为该实例上的根用户配置了 SSH 密钥,则可以以根用户身份连接到该实例,方法是使用 gcloud compute ssh 命令,并在实例名称前指定 root@

gcloud compute ssh \
    --project=PROJECT_ID \
    --zone=ZONE \
    root@INSTANCE_NAME

请替换以下内容:

  • PROJECT_ID:包含实例的项目的 ID
  • ZONE:实例所在地区的名称。
  • INSTANCE_NAME:实例的名称

以服务帐号身份手动连接实例

在某些情况下,您可能需要连接到多个实例并运行多个命令,就像使用与该实例关联的服务帐号进行操作一样。您可以通过 gcloud compute ssh 命令,使用服务帐号的 SSH 凭据从一个实例连接到另一个实例,从而以服务帐号身份在第二个实例上运行命令。

gcloud 命令行工具会自动生成 SSH 密钥对,并将其与您实例上的服务帐号相关联。以服务帐号身份连接到另一个实例后,您可以使用服务帐号的 IAM 权限运行其他 gcloud 命令。

此示例假设您具有以下环境:

  • 实例 A:
    • 实例 A 具有与之关联的服务帐号。
    • 与实例 A 关联的服务帐号具有在项目级层或专门为实例 B 资源配置的必要 OS Login 角色
    • 该服务帐号在实例 A 上具有 https://www.googleapis.com/auth/cloud-platform 平台级范围。
  • 实例 B:
    • 实例 B 在运行实例 A 的同一内部网络上运行,或者在一个防火墙规则允许来自实例 A 的 SSH 连接的网络上运行。
    • 您的项目或实例 B 已启用 OS Login 功能
  • 您的个人用户帐号:
    • 您的帐号对与实例 A 关联的服务帐号具有 roles/iam.serviceAccountUser 角色。
    • 您的帐号具有实例 A 专用的 SSH 访问权限。
    • 您的帐号没有实例 B 的访问权限。该服务帐号是唯一拥有连接到实例 B 所必需的 OS Login 角色的帐号。

以该服务帐号的身份连接到实例 A 并执行命令。此步骤要求您拥有该服务帐号的 roles/iam.serviceAccountUser 角色:

  1. 以具备 roles/iam.serviceAccountUser 角色的用户身份连接到实例 A。例如,您可以使用 gcloud 命令行工具来建立第一个 SSH 连接:

    gcloud compute ssh instance-a --project=PROJECT_ID --zone=ZONE
  2. 只要您具有 roles/iam.serviceAccountUser 角色,则通过 SSH 连接到实例 A 后,就可以以该服务帐号的身份执行命令。在本示例中,在实例 A 上运行 gcloud 工具,以创建到实例 B 的链式 SSH 连接。gcloud 工具可确定实例 B 已启用 OS Login 功能,还可确定服务帐号具有使用 SSH 连接到实例 B 所需的 IAM 角色。

    gcloud compute ssh instance-b --project=PROJECT_ID --zone=ZONE

    输出内容类似如下:

    WARNING: Using OS Login user [sa_113491385848438711199] instead of default user [my-username]
    Linux instance-b 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64
    ⋮
    
  3. 您现在已经以该服务帐号的身份连接到实例 B,并可以以该服务帐号的身份执行命令。例如:

    sa_113491385848438711199@instance-b:~$ uname -a
    
    Linux instance-b 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux
    

后续步骤