SSH 支持

本页面介绍了如何使用 gcloud CLI 通过 SSH(或任何其他 TCP 协议)从本地机器连接到工作站。

Cloud Workstations 使用隧道在本地计算机上的端口与工作站上的端口之间转发 TCP 流量,而不会将工作站公开到互联网。系统会使用 gcloud CLI 中的凭据对连接进行身份验证,并根据目标工作站的 IAM 政策进行授权。

在本地端口和工作站之间建立 TCP 隧道后,您可以使用该隧道转发来自 SSH 客户端、curl 或任何其他使用 TCP 的应用的流量。

为方便起见,Cloud Workstations 提供 gcloud workstations ssh 命令,该命令可建立 TCP 隧道并运行 SSH 客户端,只需一个 gcloud CLI 命令即可完成。

对于所有其他使用情形,请使用 gcloud workstations start-tcp-tunnel 命令建立 TCP 隧道,并在单独的终端中运行将使用该隧道的应用(例如 curl)。

准备工作

  1. 如果您还没有要连接的工作站,请设置工作站

  2. 安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:

    gcloud init

    如果您使用的是外部身份提供方 (IdP),则必须先 使用联合身份登录 gcloud CLI

  3. 确保您在要连接的工作站上拥有 Cloud Workstations User IAM 角色。

    转到 IAM

使用 SSH 连接到工作站

如需与工作站建立安全的 SSH 连接,请使用 gcloud workstations ssh 命令,该命令会启动 TCP 隧道并运行 SSH 客户端。

在本地终端窗口中运行以下命令:

gcloud workstations ssh \
    --project=PROJECT_ID \
    --region=REGION \
    --cluster=CLUSTER_NAME \
    --config=CONFIG_NAME  \
    --port=WORKSTATION_PORT  \
    --local-host-port=localhost:LOCAL_PORT  \
    WORKSTATION_NAME

替换以下值:

  • PROJECT_ID:包含工作站的项目的 Google Cloud 项目 ID。如果省略,则使用当前项目。

  • REGION:工作站集群所在的区域,例如 us-central1

  • CLUSTER_NAME:包含工作站的工作站集群的名称。

  • CONFIG_NAME:包含相应工作站的工作站配置的名称。

  • WORKSTATION_PORT(可选):工作站上应将流量发送到的端口。如果省略,流量将发送到端口 22。所有预配置的 Cloud Workstations 映像都包含一个在工作站端口 22 上运行的 SSH 服务器。

  • LOCAL_PORT(可选):将从中发送流量的 localhost 端口。有效端口号的范围为 102465535。如果您省略 --local-host-port 标志或指定端口为 0,系统会自动选择一个未使用的端口。

  • WORKSTATION_NAME:工作站的名称。

SSH 配置和 .ssh/config 文件

使用 gcloud workstations ssh 时,该命令会将您的连接通过 localhost 进行路由。因此,它不会自动应用 ~/.ssh/config 文件中使用了工作站名称的 Host 条目。

如需应用自定义 SSH 配置,请选择以下选项之一:

方法 1:在命令行中传递标志

您可以通过在双短划线 (--) 后附加 SSH 选项,将这些选项直接传递给底层 SSH 客户端:

gcloud workstations ssh \
    --project=PROJECT_ID \
    --region=REGION \
    --cluster=CLUSTER_NAME \
    --config=CONFIG_NAME \
    WORKSTATION_NAME \
    -- -o SSH_OPTION=VALUE

方法 2:使用持久性 TCP 隧道和 .ssh/config

如果您希望使用 ~/.ssh/config 文件,请执行以下操作:

  1. 在单独的终端窗口中启动持久性 TCP 隧道,并指定本地端口:

    gcloud workstations start-tcp-tunnel \
        --project=PROJECT_ID \
        --region=REGION \
        --cluster=CLUSTER_NAME \
        --config=CONFIG_NAME \
        --local-host-port=localhost:LOCAL_PORT \
        WORKSTATION_NAME \
        22
    
  2. 在本地计算机上的 ~/.ssh/config 文件中添加配置块:

    Host WORKSTATION_NAME
        HostName localhost
        Port LOCAL_PORT
        User user
        # Disable host key checking for ephemeral cloud workstations
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
        # Add any other SSH options here
    
  3. 使用标准 SSH 连接到工作站:

    ssh WORKSTATION_NAME
    

使用 TCP 隧道将任意 TCP 流量转发到工作站

如需使用 ssh 以外的 TCP 应用连接到工作站,请使用 gcloud workstations start-tcp-tunnel 命令:

  1. 运行以下 gcloud CLI 命令以创建经过身份验证的 TCP 隧道。

    如需将命令复制到复制粘贴缓冲区,请点击 复制代码示例,然后将命令粘贴到本地终端窗口中:

    gcloud workstations start-tcp-tunnel \
        --project=PROJECT_ID \
        --region=REGION \
        --cluster=CLUSTER_NAME \
        --config=CONFIG_NAME \
        --local-host-port=localhost:LOCAL_PORT \
        WORKSTATION_NAME \
        WORKSTATION_PORT
    

    替换以下值:

    • PROJECT_ID:包含工作站的项目的 Google Cloud 项目 ID。如果省略,则使用当前项目。

    • REGION:工作站集群所在的区域,例如 us-central1

    • CLUSTER_NAME:包含工作站的工作站集群的名称。

    • CONFIG_NAME:包含相应工作站的工作站配置的名称。

    • LOCAL_PORT(可选):将从中发送流量的 localhost 端口。有效端口号的范围为 102465535。如果您省略 --local-host-port 标志或指定 0 的端口,系统会自动选择未使用的端口。

    • WORKSTATION_NAME:工作站的名称。

    • WORKSTATION_PORT:应将流量发送到的工作站端口。 预配置的 Cloud Workstations 映像包含在工作站端口 22 上运行的 SSH 服务器。

  2. gcloud CLI 命令会执行与工作站的连接测试,打开隧道,然后显示端口号:

    Listening on port [LOCAL_PORT].
    

    发送到 localhost:LOCAL_PORT 的所有流量都转发到工作站。该端口只能由本地计算机上运行的应用访问。

  3. gcloud CLI 保持运行状态,然后打开另一个终端以运行连接到工作站的应用。

    例如,如果您在工作站上运行一个服务于端口 WORKSTATION_PORT 的服务器,并且在上一步中创建了一个 TCP 隧道,用于在本地端口 LOCAL_PORT 和工作站端口 WORKSTATION_PORT 之间转发流量,则可以在本地计算机上运行 curl 以连接到工作站上的服务器:

    curl localhost:LOCAL_PORT
    Hello, world!
    
  4. 完成后,返回到启动 TCP 隧道的终端,然后按 Control+C 中断 gcloud CLI。

使用不同端口上的 SSH 服务器

自定义容器映像还可以使用任何端口上的 SSH 服务器。为了支持来自 gcloud CLI 隧道的连接,您必须配置自定义 SSH 服务器以允许密码身份验证,并将目标用户设置为空密码。Cloud Workstations 使用 Cloud IAM 来帮助确保只有授权流量会发送到 SSH 服务器。

保持 SSH 会话持久

如果网络连接中断,SSH 会话也会断开。如需在断开连接时保持进程运行,并在稍后重新连接到会话,请使用 tmux 等工具。

如需在工作站上安装 tmux,请执行以下操作:

  1. 在当前会话中手动安装 tmux 以立即使用:

    sudo apt update
    sudo apt install -y tmux
    
  2. 将工作站配置为在启动时安装 tmux。创建或附加到 /home/user/.workstation/customize_environment 文件,以包含以下命令:

    #!/bin/bash
    sudo apt update
    sudo apt install -y tmux
    

    如需了解详情,请参阅自定义现有工作站映像,而不对其进行扩展

  3. 将该文件设为可执行文件,以便在工作站启动时运行:

    chmod +x /home/user/.workstation/customize_environment
    

安装 tmux 后:

  1. 连接到工作站:

    gcloud workstations ssh \
        --project=PROJECT_ID \
        --region=REGION \
        --cluster=CLUSTER_NAME \
        --config=CONFIG_NAME \
        WORKSTATION_NAME
    
  2. 在工作站上启动新的 tmux 会话:

    tmux
    
  3. 如果连接断开,请重新连接并附加到您的会话,方法是在本地终端中运行以下命令:

    gcloud workstations ssh \
        --project=PROJECT_ID \
        --region=REGION \
        --cluster=CLUSTER_NAME \
        --config=CONFIG_NAME \
        WORKSTATION_NAME \
        -- -t tmux attach
    

后续步骤