如何通过 AWS Systems Manager 使用 SSH 隧道来访问我的私有 VPC 资源?

上次更新日期:2021 年 3 月 24 日

我想通过 AWS Systems Manager 使用 SSH 隧道来访问我的私有 VPC 资源。该如何操作?

简短描述

AWS Systems Manager Session Manager 使用 Systems Manager 基础设施与实例创建一个类似 SSH 的会话。Session Manager 可通过隧道传输真正的 SSH 连接,从而使您可以直接从本地计算机中通过隧道传输到 Virtual Private Cloud (VPC) 内的另一个资源。您创建的托管实例将充当您的 AWS 资源的堡垒主机或网关。这种配置的优势包括:

  • 提高安全性:这种配置仅可使用一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例(堡垒主机),并将出站端口 443 与 Systems Manager 基础设施连接。这样一来,您无需任何入站连接便可以使用 Session Manager。本地资源必须仅允许来自充当堡垒主机的实例的入站流量。因此,不需要公开打开任何入站规则。
  • 简便易用:您可以直接从您的本地计算机访问私有 VPC 中的资源。

注意:有关使用 Systems Manager 通过终端或一个端口转发访问 EC2 实例的说明,请参阅设置 Systems Manager

先决条件

完成 Session Manager 先决条件

安装 AWS 命令行界面 (AWS CLI) 的 Session Manage 插件

通过 Session Manager 启用 SSH 连接,并确保满足 SSH 连接要求

注意:您必须安装以下各项才能使用 SSH 功能:

1.    AWS Systems Manager 代理(SSM 代理)2.3.672.0 版或更新版本。

2.    在本地计算机上安装 Session Manager 插件 1.1.23 版或更新版本。

3.    在本地计算机上安装 AWS CLI v1.16.12 或更高版本

解决方法

要使用 Session Manager 启动 SSH 隧道,请执行以下步骤:

注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

1.    要启动 SSH 隧道,请运行以下命令:

ssh -i /path/my-key-pair.pem username@instance-id -L localport:targethost:destport

2.    要在第 1 步中创建的目标端口上测试对隧道的访问,请运行以下命令:

telnet 127.0.0.1 localport

在前面的示例中,127.0.0.1localport 转换为访问 targethost:destport

示例配置

场景 1

使用 SSM 主机用作堡垒主机,从您的本地计算机创建一个隧道,以访问 EC2 实例上运行的 MySQL 数据库。

使用的资源

instance1:用作堡垒主机并由 AWS Systems Manager 托管的 EC2 实例。

    主机名 = ec2-198-51-100-1.compute-1.amazonaws.com Instance id = i-0123456789abcdefa

instance2:在默认端口 3306 上运行 MySQL 数据库的 EC2 实例。

    主机名 = ec2-198-51-100-2.compute-1.amazonaws.com

说明

1.    从本地计算机(例如您的笔记本电脑)运行 SSH 命令以使用基于 Session Manager 的 SSH 连接 instance1。此命令在 instance2 上建立至端口 3306 的隧道,并在您本地计算机的端口 9090 上显示该隧道。

ssh -i /path/key-pair_instance1.pem username_of_instance1@i-0123456789abcdefa -L 9090:ec2-198-51-100-2.compute-1.amazonaws.com:3306

注意:在前述示例中,端口 9090 在本地计算机上可用。

2.    从本地计算机中,使用步骤 1 中所用的可用端口(在此示例中为 9090)访问数据库。

mysql -u user -h 127.0.0.1 -P 9090 -p password

重要提示:instance2 上的所有安全组网络访问控制列表(网络 ACL)、安全规则或第三方安全软件都必须允许来自 instance1 的流量。在前述示例中,instance2 必须允许来自 instance1 的端口 3306 访问。

场景 2

通过从您的本地计算机进行的单个 SSH 连接创建三个隧道:

  • 连接到 instance1 中的 SSH 端口
  • 访问 RDS 实例中的 MySQL 数据库
  • 访问 instance3 中的 Web 服务器

使用的资源

instance1:用作堡垒主机并由 AWS Systems Manager 托管的 EC2 实例。

    主机名 = ec2-198-51-100-1.compute-1.amazonaws.com Instance id = i-0123456789abcdefa

RDS 实例:位于私有子网中的 MySQL RDS 实例。

    主机名 = DBinstanceidentifier.abcdefg12345.region.rds.amazonaws.com

instance3:位于私有子网中的 EC2 实例

    主机名 = ec2-198-51-100-3.compute-3.amazonaws.com

说明

1.    使用 SSH 命令启动三个隧道的会话。

注意:命令中有三个单独的隧道调用。

ssh -i /path/key-pair_instance1.pem username_of_instance1@i-0123456789abcdefa -L 8080:ec2-198-51-100-1.compute-1.amazonaws.com:22 -L 9090:DBinstanceidentifier.abcdefg12345.region.rds.amazonaws.com:3306 -L 9091:ec2-198-51-100-3.compute-1.amazonaws.com:80

注意:在前述示例中,端口 8080、9090 和 9091 在本地计算机上可用。

2.    访问从本地计算机到 instance1 的 SSH。本地端口 8080 通过隧道传输到 instance1 上的 SSH 端口 (22)。key-pairusername 用于您通过隧道传输到的实例(在本示例中为 instance1)。

ssh -i /path/key-pair_instance1.pem username_of_instance1@127.0.0.1 -p 8080

3.    访问 RDS 实例上的数据库。本地端口 9090 通过隧道传输到 RDS 实例上的端口 3306。您可以使用 MySQL Workbench,它允许您使用 GUI 访问数据库服务器,127.0.0.1 为主机名,9090 为端口。或者,在 shell 命令提示符下运行以下命令:

mysql -u user -h 127.0.0.1 -P 9090 -p password

4.    要从本地计算机访问 instance3 上的网站,请打开浏览器并导航到网站。

http://127.0.0.1:9091

重要提示:RDS 实例instance3 上的所有安全组网络 ACL、安全规则或第三方安全软件都必须允许来自 instance1 的流量。在前述示例中,instance3 必须允许来自 instance1 的端口 80 访问。