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

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

通常,最好采用连接到实例文档中所述的 SSH 连接方法来连接实例。但是,如果您需要管理自己的凭据、使用第三方工具,或者使用其他连接路径进行连接,以下高级方法可能比标准方法更能满足您的需求。 如需了解 SSH 连接在 Compute Engine 中的工作原理(包括 SSH 密钥配置和存储),请参阅与 Linux 虚拟机的 SSH 连接

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

准备工作

支持的操作系统

Compute Engine 上提供的所有 Linux 操作系统均支持这些连接方法。对于 Fedora CoreOS,您必须先设置 SSH 访问,然后才能使用这些方法。

向实例提供 SSH 公钥

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

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

如果您不熟悉如何生成自己的 SSH 密钥,请参阅创建 SSH 密钥

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

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

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

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

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

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

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

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

通过 VPN 连接进行连接

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

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

    例如,您可能有一个由本地内部网络与 Google Cloud VPC 共用的 VPN。在这种情况下,您可以使用 Google Cloud CLI、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 连接到实例,请使用 Google Cloud CLI 或 SSH。如需从 Windows 进行连接,请使用第三方 SSH 客户端(例如 PuTTY)。

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

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

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

gcloud

您可以利用 Google Cloud CLI 连接到没有外部 IP 地址的实例,而无需将 SSH 私钥转发到堡垒主机。如要执行此操作,请在本地工作站和堡垒主机实例上安装 gcloud(如果您尚未安装的话)。

如需使用 Google Cloud CLI 连接到没有外部 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 命令连接到堡垒主机实例并转发您的私钥。这种方式可让您使用 Google Cloud CLI 连接到堡垒主机实例,然后使用常规 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 命令断开与该实例的连接。

通过 Identity-Aware Proxy (IAP) for TCP 连接

您可以启用 IAP TCP 转发来建立加密隧道,您可以通过该隧道将 SSH 连接转发到虚拟机。

如需为虚拟机启用 IAP TCP 转发,请执行以下操作:

  1. 创建防火墙规则以启用来自 IAP 的连接。
  2. 授予所需的 IAM 权限以启用 IAP TCP 转发。

如需连接到启用了 IAP TCP 转发的虚拟机,请使用隧道建立 SSH 连接

以根用户身份连接到实例

默认情况下,公共映像和大多数常用操作系统都不允许使用密码通过 SSH 以根用户身份登录。如果用户需要根用户权限,他们可以通过 sudo 运行相关命令来获取这些权限。

在 Compute Engine 虚拟机中,/etc/ssh/sshd_config SSH 配置文件将 PermitRootLogin 参数设置为 prohibit-passwordno。在 PermitRootLogin=prohibit-password 时,您将无法作为 root 连接虚拟机,除非在您的项目或实例元数据中为 root 指定 SSH 密钥。在 PermitRootLogin=no 时,即使您在项目或实例元数据中为 root 指定了 SSH 密钥,也无法连接。

您可以修改 PermitRootLogin 参数,但我们建议您通过 sudo 运行命令。

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

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

请替换以下内容:

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

后续步骤