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

上次更新时间:2020 年 3 月 2 日

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

简短描述

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

提高安全性:这种配置只能用于一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例(堡垒主机),其出站端口 443 与 Systems Manager 基础设施连接。这样一来,您无需任何入站连接便可以使用 Session Manager。本地资源需要仅允许来自充当堡垒主机的实例的入站流量。因此,不需要公开打开任何入站规则。

易用性:您可以直接从您的本地计算机访问私有 VPC 中的资源。

先决条件

完成 Session Manager 先决条件

安装 AWS CLI 的 Session Manager 插件

通过 Session Manager 启用 SSH 连接

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

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

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

3.    在本地计算机上安装 AWS 命令行界面 (CLI) 1.16.12 版或更新版本。

解决方法

1.    使用 Session Manager 启动 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.1 localport 转换为访问 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-1.compute-1.amazonaws.com:3306

在前面的示例中,端口 9090 是本地计算机上的可用端口。

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

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

注意:确保 instance2 上的所有安全组网络 ACL、安全规则或第三方安全软件都允许来自 instance1 的流量。在前面的示例中,instance2 需要允许来自 instance1 的端口 3306 访问。

场景 2

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

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

使用的资源

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

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

instance2:位于私有子网中的 EC2 数据库实例。

    主机名 = ec2-198-51-100-2.compute-2.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:ec2-198-51-100-2.compute-1.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.    访问 instance2 上的数据库。本地端口 9090 通过隧道传输到 instance2 上的端口 3306。

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

4.    从本地计算机上打开浏览器并导航至 instance3 上的网站,以进行访问。

http://127.0.0.1:9091

注意:确保 instance2 instance3 上的所有安全组网络 ACL、安全规则或第三方安全软件都允许来自 instance1 的流量。在前面的示例中,instance3 必须允许来自 instance1 的端口 80 访问。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?