使用高级方法连接到实例

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

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

准备工作

向实例提供 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:连接到该实例的用户的用户名。 对于 OS Login 帐号,用户名在用户个人资料中定义。如果您在元数据中管理 SSH 密钥,则用户名是您在创建 SSH 密钥时指定的名称。
    • 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 地址。

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

    假如用户名和 IP 地址分别为 jane_doe 和 203.0.113.2,则将 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 公钥(如果您尚未执行此操作)。如果您不这样做,则将无法继续操作。

  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 连接进行连接

如需使用虚拟专用网 (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 地址连接到实例。将 internal-instance-name 替换为您要连接的实例的名称。

    gcloud compute ssh internal-instance-name --internal-ip
    

连接后,使用此终端在您的实例上运行命令。 完成后,运行 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 命令的身份验证。将 private-key 替换为您的私钥文件的文件名。

    $ ssh-add ~/.ssh/private-key
    
  4. 查找 Linux 堡垒主机实例的外部 IP 地址,并查找您要连接的内部实例的内部 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 地址。将 bastion-host-instance-name 替换为您用于获取内部网络访问权限的堡垒主机实例的名称。

    gcloud compute ssh --ssh-flag="-A" bastion-host-instance-name
    
  6. 使用 SSH 从 Linux 堡垒主机实例连接到没有外部 IP 地址的实例。

    $ ssh username@internal-instance-ip-address

    替换以下内容:

    • username:附加到 SSH 密钥的名称。
    • internal-instance-ip-address:您要连接到的实例的内部 IP 地址。

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

Windows

如需从 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 转发功能就能将该连接发送至远程实例。

  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:实例的名称。

使用 PowerShell 终端连接到 Windows 实例

如果您拥有带 PowerShell 的 Windows 工作站,可以通过远程 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 并跳过凭据检查。将 ip-address 替换为您要连接的实例的外部 IP 地址、DNS 名称或 Windows 计算机名称。

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

连接后,命令提示符将更改为包含远程 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
    

后续步骤