使用高级方法连接到实例

如果您需要管理自己的凭据、使用第三方工具,或使用备用连接路径连接到实例,以下高级方法可能比连接到实例中介绍的标准方法更适合您的需求。

以下几种高级方法可以连接到 Linux 和 Windows Server 实例:

准备工作

为实例提供 SSH 公钥

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

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

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

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

  • (推荐)启用 OS Login 并使用 IAM 角色通过您的 Google 帐号或托管用户帐号为实例提供 SSH 公钥。为此,请按照使用 OS Login 管理实例访问权限中的步骤启用 OS Login 并创建角色。然后,查看将 SSH 密钥添加到用户帐号部分,将公钥添加到您要用于连接到实例的角色。

  • (不推荐)通过修改项目或实例元数据手动添加和移除 SSH 密钥。请参阅管理元数据中的 SSH 密钥。此方法会增加不必要的风险和复杂性,除非上述 OS Login 方法不起作用,否则不推荐采用此方法。如需了解详情,请参阅手动管理密钥所带来的风险

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

使用第三方工具进行连接

在为实例提供 SSH 公钥后,您可以使用第三方 SSH 工具以及匹配的 SSH 私钥进行连接。

如需连接实例,请点击本地操作系统对应的标签页,然后按照以下步骤操作:

Linux 和 macOS

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

  1. 如果您尚未为实例提供 SSH 公钥,请使用一个可用方案完成此操作。如未提供 SSH 公钥,您将无法继续执行以下步骤。

  2. 在 Console 中,转到实例页面(或点击下面的按钮),找到要连接到的实例的外部 IP 地址。

    转到实例页面

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

    ssh -i [PATH_TO_PRIVATE_KEY] [USERNAME]@[EXTERNAL_IP_ADDRESS]

    其中:

    • [PATH_TO_PRIVATE_KEY]您的 SSH 私钥文件的路径
    • [USERNAME] 是连接到该实例的用户的用户名。如果手动创建 SSH 密钥,则此值必须是您在创建 SSH 密钥时指定的用户名。
    • [EXTERNAL_IP_ADDRESS] 是您的实例的外部 IP 地址。

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

Windows (PuTTY)

Windows 不包含内置 SSH 客户端,这意味着您必须下载并安装第三方客户端。以下说明演示了如何使用 PuTTY 进行连接。

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

  1. 如果您尚未为实例提供 SSH 公钥,请使用一个可用方案完成此操作。如未提供 SSH 公钥,您将无法继续执行以下步骤。

  2. 在 Console 中,转到实例页面(或点击下面的按钮),找到要连接到的实例的外部 IP 地址。请保存此地址,以备后续步骤使用。

    转到实例页面

  3. 如果您尚未下载 putty.exe,请下载。

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

  5. 在连接配置页面的 Host Name 字段中,按以下格式输入与 SSH 密钥关联的用户名和要连接到的实例的外部 IP 地址:

    [USERNAME]@[EXTERNAL_IP_ADDRESS]

    其中:

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

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

      将主机名字段设置为 jane_doe@203.0.113.2

  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 公钥,请使用一个可用方案完成此操作。如未提供 SSH 公钥,您将无法继续执行以下步骤。

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

  3. 在 Console 中,转到实例页面(或点击下面的按钮),找到要连接到的实例的外部 IP 地址。请保存此地址,以备后续步骤使用。

    转到实例页面

  4. 在 Chrome 浏览器标签页中打开 Secure Shell 应用。

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

    [USERNAME]@[EXTERNAL_IP_ADDRESS]

    其中:

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

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

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

其他 SSH 方案

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

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

如果您拥有一个没有外部 IP 地址的隔离实例(例如有意与外部网络隔离的实例),您仍然可以通过以下方法使用其在 Google Cloud Platform 虚拟私有云 (VPC) 网络上的内部 IP 地址连接到该实例。

通过 VPN 进行连接

如需使用虚拟专用网 (VPN) 连接到没有外部 IP 地址的实例,您的计算机必须与要连接的实例连接到同一 VPN。例如,您可能拥有一个由本地内部部署网络与 GCP VPC 共享的 VPN。在这种情况下,请使用 gcloud 命令行工具、Linux 和 macOS 上的 SSH 或第三方 SSH 客户端(例如 Windows 上的 PuTTY)连接到实例。

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

gcloud

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

gcloud compute ssh [INTERNAL_INSTANCE_NAME] --internal-ip

其中 [INTERNAL_INSTANCE_NAME] 是您要连接到的实例的名称。

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

Linux 和 macOS

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

  1. 使用一个可用方案为实例提供 SSH 公钥。如未提供 SSH 公钥,您将无法继续执行以下步骤。

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

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

    $ ssh-add ~/.ssh/[PRIVATE_KEY]
    

    其中 [PRIVATE_KEY] 是您的私钥文件的文件名。

  4. 在 Console 中,转到实例页面(或点击下面的按钮),找到要连接到的实例的内部 IP 地址。

    [转到“实例”页面](https://console.cloud.google.com/compute/instances){: class="button button-primary" target="console" track-type="tasks" track-name="consoleLink" track-metadata-position="body" track-metadata-end-goal="attachDisk"}

    1. 在本地终端中,使用 ssh 命令以及与 SSH 私钥关联的用户名和要连接到的实例的内部 IP 地址。例如:
    $ ssh [USERNAME]@[INTERNAL_INSTANCE_IP_ADDRESS]

    其中:

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

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

Windows (PuTTY)

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

  1. 如果您尚未为实例提供 SSH 公钥,请使用一个可用方案完成此操作。如未提供 SSH 公钥,您将无法继续执行以下步骤。

  2. 在 Console 中,转到实例页面(或点击下面的按钮),找到要连接到的实例的内部 IP 地址。

    转到实例页面

  3. 使用 PuTTY 从 Windows 连接到实例,但指定要连接到的实例的内部地址,而不是指定外部 IP 地址。

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

通过堡垒主机进行连接

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

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

与其他方法相同,从堡垒主机连接到其他实例也需要 SSH 私钥。您可以通过以下几种方法解决这个问题:

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

gcloud

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

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

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

  2. 授予必要的 IAM 权限,以允许堡垒主机使用 OS Login(推荐)或项目元数据访问您的 SSH 公钥。

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

  3. 连接到 Linux 堡垒主机实例:

    gcloud compute ssh [EXTERNAL_INSTANCE_NAME]
    

    其中 [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. 查找 Linux 堡垒主机实例的外部 IP 地址,并查找您要连接到的内部实例的内部 IP 地址。您可以在“实例”页面上的外部 IP内部 IP 列中查找该地址。

    转到实例页面

  5. 使用 sshgcloud compute ssh 连接到 Linux 堡垒主机实例。对于任一选项,请包括 -A 参数以启用身份验证代理转发。

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

    $ ssh -A [USERNAME]@[BASTION_HOST_EXTERNAL_IP_ADDRESS]

    其中:

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

    或者,您可以使用 gcloud compute ssh 命令连接到堡垒主机实例并转发您的私钥。此选项允许您使用 gcloud 命令行工具连接到堡垒主机实例,然后在连接到内部 IP 地址时使用具有已转发凭据的常规 ssh

    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 (PuTTY)

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

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

  2. 查找 Linux 堡垒主机实例的外部 IP 地址,并查找您要连接到的内部实例的内部 IP 地址。您可以在“实例”页面上的外部 IP内部 IP 列中查找该地址。

    转到实例页面

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

    为您要连接到的实例启用代理转发。

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

    $ ssh [USERNAME]@[INTERNAL_IP_ADDRESS]
    

    其中:

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

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

通过 Cloud IAP 进行连接

搭配 SSH 使用 Cloud IAP 的 TCP 转发功能时,SSH 连接会封装在 HTTPS 内部,然后通过 Cloud IAP 的 TCP 转发功能发送至远程实例。

如需了解如何使用 Cloud IAP 连接到远程实例,请参阅使用 Cloud IAP 进行 TCP 转发

root 用户身份连接到实例

默认情况下,公有映像和大多数常见操作系统不允许使用 SSH 进行 root 登录。仅当您将其配置为以这种方式操作时,实例才允许您使用 SSH 以 root 身份进行连接。

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

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

gcloud compute ssh --project [PROJECT_ID] --zone [ZONE] root@[INSTANCE_NAME]

其中:

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

使用 PowerShell 连接到 Windows 实例

如果您的 Windows 工作站含有 PowerShell,则可以通过远程 PowerShell 会话连接到 Windows Server 实例。此过程类似于使用 SSH 连接到 Linux 实例。

  1. 如果您尚未在远程 Windows 实例上创建用户名和密码,请创建或重置您的 Windows 密码

  2. 添加一条防火墙规则,以在 Windows Server 实例所在的 GCP VPC 网络上打开端口 5986

  3. 在本地工作站上,打开 PowerShell 终端。

  4. (可选)您可以初始化一个变量以保留用户凭据,这样您就无需在每次连接到该实例时输入它们。如果跳过此步骤,您在之后会收到让您输入用户名和密码的提示。

    PS C:\> $credentials = Get-Credential
    
  5. 使用 Enter-PSSession 命令启动远程 PowerShell 会话,同时包含相应标志以使用 SSL 并跳过凭据检查。

    PS C:\> Enter-PSSession -ComputerName [IP_ADDRESS] -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck) -Credential $credentials
    

    [IP_ADDRESS] 是要连接到的实例的外部 IP 地址、DNS 名称或 Windows 计算机名称。

    转到实例页面

连接后,命令提示符将更改为包括远程 Windows 实例的 IP 地址。现在,您就可以使用终端在远程 Windows Server 实例上运行 PowerShell 命令。

作为 Enter-PSSession 命令的替代方法,您可以运行带有 -ScriptBlock 标志的 Invoke-Command,在远程实例上执行 PowerShell 命令,而无需建立交互式会话。

PS C:\> Invoke-Command -ComputerName [IP_ADDRESS] -ScriptBlock { [SCRIPT] } -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck) -Credential $credentials

其中:

  • [IP_ADDRESS] 是您要连接到的实例的 IP 地址、DNS 名称或 Windows 计算机名称。
  • [SCRIPT] 是要在远程实例上运行的一个或多个命令。例如,指定 Get-EventLog -log "Windows PowerShell" 以获取日志事件列表。

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

在某些情况下,您可能希望连接到实例并运行命令,就像使用与该实例关联的服务帐号进行操作一样。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 连接:

    my-username@localworkstation:~$ gcloud compute ssh instance-a --project my-project --zone us-east1-d
    
  2. 使用 SSH 连接到实例 A 后,如果您拥有 roles/iam.serviceAccountUser 角色,就可以以该服务帐号的身份执行命令。在此示例中,在实例 A 上运行 gcloud 命令行工具以创建到实例 B 的链式 SSH 连接。gcloud 命令行工具可确定实例 B 已启用 OS Login,并且可确定该服务帐号具有建立到实例 B 的 SSH 连接所必需的 IAM 角色。

    my-username@instance-a:~$ gcloud compute ssh instance-b --project my-project --zone us-east1-d
    
    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
    
    

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档