使用高级方法连接到实例

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

您可以通过以下几种高级方法连接到 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

要使用 SSH 从 Linux 或 macOS 机器进行连接,请在本地终端中使用内置的 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 地址。

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

      将“Host Name”字段设置为 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. 身份字段中,选择您要用于连接到该实例的 SSH 私钥文件。如有必要,请点击导入以从本地工作站中选择私钥文件。

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

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

其他 SSH 方案

除了上面详述的方案之外,您还可以通过以下方式使用 SSH 连接到实例:

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

如果您的实例处于隔离状态且没有外部 IP 地址(例如,实例被有意与外部网络隔离),您仍然可以通过以下方法,使用该实例在 Google Cloud Virtual Private Cloud (VPC) 网络中的内部 IP 地址连接到该实例。

通过 VPN 进行连接

要使用虚拟专用网 (VPN) 连接到没有外部 IP 地址的实例,您的计算机必须与要连接的实例连接到同一 VPN。例如,您可能有一个由本地内部网络与 Google Cloud 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 地址。

    转到“实例”页面

  5. 在本地终端中,使用 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. 为堡垒主机实例上的服务帐号设置 Compute Engine API 的读写访问权限范围,方法是在命令中加入 --scopes compute-rw。如需了解详情,请参阅更改实例的服务帐号和访问权限范围

  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 参数来启用身份验证代理转发功能。

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

    $ ssh -A [USERNAME]@[BASTION_HOST_EXTERNAL_IP_ADDRESS]

    其中:

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

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

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

    其中,[BASTION_HOST_INSTANCE_NAME] 是您用于获取内部网络访问权限的堡垒主机实例的名称。

  6. 使用 SSH 从 Linux 堡垒主机实例连接到没有外部 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 命令断开与该实例的连接。

通过 IAP 连接

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

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

root 用户身份连接到实例

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

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

如果您将实例配置为允许以根用户身份使用 SSH 进行连接,并为该实例上的根用户配置了 SSH 密钥,则可以根用户身份连接到该实例,方法是使用 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 实例所在的 Google Cloud 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 文档