安全地连接到虚拟机实例

在 Compute Engine 上开发项目的以下多种场景中,您希望禁止通过公共互联网访问您的实例:

  • 网络服务仍处于开发阶段,尚未准备好向外部用户公开,因为它们的功能尚不完整或尚未配置 HTTPS。
  • 实例提供的服务可能仅供项目中的其他实例使用。
  • 实例应该仅能通过公司办公室或数据中心的专用互连选项访问。

即使服务的设计意图是面向互联网的,也有必要将与服务的通信限制为面向用户组且通过安全渠道(如 SSH 或 HTTPS)发生,以保护敏感信息。

本文演示了几种确保与 Compute Engine 实例(无论是否具有外部 IP 地址)之间的通信安全无虞的方法。

在使用外部 IP 地址的机器上保护服务

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

在使用外部 IP 地址的机器上保护服务

在实例具有公共 IP 地址时,务必保证仅有您希望公开的服务和流量可供访问,同时也要保证在已公开的服务和流量中,敏感信息均在传输过程中得到保护。

防火墙

第一道防线是使用防火墙,显示哪些用户可以访问实例。通过创建防火墙规则,您可以对通过给定的一组端口传送到特定网络或目标机器的所有流量加以限制,仅允许来自指定源 IP 地址的流量。

防火墙并非独立解决方案,仅允许来自特定源 IP 的流量这一做法本身并不能保护敏感信息(例如登录凭据,创建或销毁资源或文件的命令,或者日志)。在可公开访问的机器上运行网络服务(例如具有外部 IP 的 Compute Engine 实例)时,您需要加密您的主机与已部署实例之间的所有通信,以确保适当的安全性。

此外,防火墙并非总是合适的解决方案。例如,防火墙不适用于没有静态 IP 地址的开发环境,例如漫游的笔记本电脑。

HTTPS 和 SSL

对于生产网络系统,建议配置 HTTPS/SSL。您可以通过将某个实例设置为 HTTPS 终结点或配置 HTTPS 负载平衡来设置 HTTPS/SSL。HTTPS/SSL 的初始阶段确实较为复杂,您需要执行以下任务:

如果您先前设置过 SSL 服务网域,那么应该可以直接对 Compute Engine 执行同样的操作。如果您没有这方面的经验,那么使用其他安全方法可能对您来说更加简单,例如端口转发SOCKS 代理

通过 SSH 进行端口转发

您可以使用 gcloud 命令行工具在给定本地端口上启动服务器,以通过 SSH 连接将所有流量转发到远程主机。

首先,记下您要与其建立安全连接的提供服务的实例和端口。然后运行以下命令:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888

上述命令中的参数定义如下:

  • example-instance 是您要连接到的实例的名称。
  • my-project 是您的 Google Cloud Platform (GCP) 项目 ID
  • us-central1-a 是运行您的实例的地区。
  • 2222 是您正在侦听的本地端口。
  • 8888 是您要连接的远程端口。

使用这些示例设置,如果您在浏览器中打开 http://localhost:2222/,HTTP 连接将通过您刚刚创建的 SSH 隧道到达远程主机,并通过 SSH 连接到指定实例,然后再通过加密的安全 SSH 连接连接到相同机器上的端口 8888

gcloud 命令创建并维护 SSH 连接,此方法仅适用于 SSH 会话处于活动状态的情况。只要您退出 gcloud 创建的 SSH 会话,通过 http://localhost:2222/ 进行的端口转发将立即停止工作。

如果要创建多条端口转发规则,则可以通过重复使用标志在单个命令行中指定多条规则:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888 -L 2299:localhost:8000

您还可以每次运行一条新的 gcloud 命令来创建单独的隧道。请注意,如果不退出并从头开始重新建立连接,则无法在现有连接中添加或移除端口转发。

基于 SSH 的 SOCKS 代理

如果要在您的云部署中连接到大量不同主机,最简单的方法是对浏览器作出更改,直接通过您的网络执行查找。通过这种方法,您可以使用主机的短名称,而不必按各主机的 IP 地址执行查找、为各服务打开端口或者为各主机/端口对创建 SSH 隧道。

在这里,您可以使用如下方法:

  1. 设置到网络中一台主机的单一 SSH 隧道,并在该主机上创建 SOCKS 代理。
  2. 更改浏览器配置,以使用该 SOCKS 代理主机执行所有查找。

注意,由于您使用该主机以隧道方式传输所有流量,因此通常情况下,请勿使用该浏览器或特定配置文件浏览网页,因为您会为此使用您的云服务的带宽。通常,我们建议您使用单独的浏览器配置文件,并在必要情况下切换到该配置文件。

启动 SOCKS 代理

要启动 SOCKS 代理,请运行以下命令:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-D" \
    --ssh-flag="1080" \
    --ssh-flag="-N"

上述命令中的参数定义如下:

  • example-instance 是您要连接到的实例的名称。
  • my-project 是您的 GCP 项目 ID
  • us-central1-a 是运行您的实例的地区。
  • 1080 是您正在侦听的本地端口。

请注意,在本例中,您不需要指定远程端口。由于 SOCKS 代理不绑定到任何特定的远程端口,因此您使用 SOCKS 代理建立的任何连接都将相对于您连接到的主机进行解析。

通过 SOCKS 代理,您可以使用代理实例的短名称,连接到与该实例共用 Compute Engine 网络的任何实例。此外,您还可以连接到给定实例上的任何端口。

这种方法比简单的端口转发方法要灵活得多,但也需要您更改网络浏览器中的设置以使用该代理。

接下来,您需要将 Chrome 或 Firefox 配置为使用该代理。

Chrome

Chrome 默认使用系统范围的代理设置,因此您需要使用命令行标志指定其他代理。默认情况下,启动 Chrome 会为已在运行的配置文件创建一个实例,因此,为了让您能够同时运行多个 Chrome 副本,并确保只有一个副本使用该代理,您需要一个新的配置文件。

使用新配置文件启动 Chrome。如果该配置文件不存在,则系统会自动创建一个。

Linux:

"/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

请务必将 localhost 端口设置为您之前在 gcloud 命令中使用的值(在我们的示例中为 1080)。

Firefox

在更改这些设置之前,您可能需要创建新的 Firefox 配置文件。否则配置文件会影响 Firefox 的所有实例,导致其均将该主机用作代理,而这很可能并不是您想取得的结果。

使用单独的配置文件运行 Firefox 后,您可以设置 SOCKS 代理:

  1. 打开偏好设置
  2. 点击高级 > 网络 > 设置以打开连接设置对话框。
  3. 选择手动代理配置 (Manual proxy configuration) 选项。
    1. SOCKS 主机 (SOCKS Host) 部分中,填写 localhost 作为主机,并填写您先前运行 gcloud 命令时选择的端口。
    2. 选择 SOCKS v5
    3. 勾选远程 DNS (Remote DNS) 框。
    4. 将其他所有条目留空。
  4. 点击确定并关闭偏好设置对话框。

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

如果实例没有外部 IP 地址,那么只有网络中的其他实例可以访问它们,或者只能通过 Cloud Identity-Aware Proxy 的 TCP 转发功能或通过托管 VPN 网关访问它们。您可以在网络中预配实例,以充当入站连接(堡垒主机)或网络出口(NAT 网关)的可信中继。若要在不设置此类连接的前提下实现更透明的连接,您可以使用托管 VPN 网关资源。

堡垒主机

堡垒主机提供接入包含专用网络实例的网络的外部入口点,如下图所示。来自互联网的通信。

堡垒主机(充当专用实例的网络的外部入口点)架构。

这种主机可以提供单一防御或审核点,而且可以启动或停止以启用或停用入站 SSH。利用堡垒主机,您可以连接到没有外部 IP 地址的实例。举例来说,通过这种方法,您就可以在不需要配置额外防火墙规则的前提下连接到开发环境,或者为外部应用管理数据库实例。

堡垒主机的完整安全强化介绍超出了本文讨论范围,但您可以采取一些初始步骤,包括:

  • 限制可与堡垒主机通信的源 IP 的 CIDR 范围。
  • 配置防火墙规则,仅允许来自堡垒主机的 SSH 流量传输到私有实例。

默认情况下,实例上的 SSH 会配置为使用私钥执行身份验证。使用堡垒主机时,您首先应登录堡垒主机,然后再登录目标私有实例。由于采用这种两步式登录方法,人们有时也将堡垒主机称为“跳转服务器”,您应使用 ssh 转发,而非通过将目标机器的私钥存储在堡垒主机上的方式访问目标机器。即使为堡垒主机和目标实例使用相同的密钥对,您也需要这样做,因为堡垒主机只能直接访问密钥对的公钥部分。

如需了解如何使用堡垒主机实例连接到 GCP 网络中的其他实例,并了解如何使用 ssh 转发功能,请参阅连接到没有外部 IP 地址的实例

使用 Cloud IAP 进行 TCP 转发

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

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

VPN

借助 Cloud VPN,您可以通过与 VPN 网关设备的 IPsec 连接将现有网络连接到 GCP 网络。这允许将来自您本地环境的流量直接路由到 Compute Engine 实例的专用 IP 接口。流量在通过公开链接传输到 Google 时会被加密。

有关使用 Compute Engine 设置、配置和使用 VPN 的详细信息,请参阅 Cloud VPN 文档

要了解如何通过现有 VPN 而非实例的外部 IP 地址连接到 GCP 网络上的实例,请阅读连接到没有外部 IP 地址的实例

使用 NAT 网关的出站流量

如果没有为实例分配外部 IP 地址,则实例无法与外部服务(包括其他 GCP 服务)建立直接连接。要允许这些实例访问公共互联网上的服务,您可以设置和配置 NAT 网关机器,由它代表网络中的任何实例路由流量。请注意,单个实例不应视为高可用性配置,不能支持多个实例的高流量吞吐量。

交互式串行控制台访问

在某个实例没有外部 IP 地址时,您可能仍需要与该实例进行交互,以执行问题排查或维护。如前所述,您可以选择设置堡垒主机,但所需设置工作量可能超过您的需求。如果要对没有外部 IP 地址的实例进行问题排查,可以考虑在串行控制台上启用交互式访问,这让您可以使用 SSH 与实例的串行控制台进行交互,并在串行控制台中运行命令。

要了解详情,请参阅与串行控制台进行交互

HTTPS 和 SSL 代理负载平衡器

对于作为 HTTPS 和 SSL 代理负载平衡器后端的实例,它们不必具有外部 IP 地址即可通过该负载平衡器进行访问。如要直接访问这些资源,您需要使用连接至没有外部 IP 地址的实例部分中所列的方法。

如需了解详情,请参阅针对这些负载平衡器的负载平衡文档

亲自试用其他 Google Cloud Platform 功能。查阅我们的教程

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

发送以下问题的反馈:

此网页
Compute Engine 文档