亚马逊AWS官方博客

使用 AWS Systems Manager 转发 Amazon EC2 实例端口

端口转发是将网络流量从一个 IP 地址和端口号组合重定向到另一个的有用方法。 通过端口转发,您可以从您的工作站访问位于私有子网中的 EC2 实例。

在这篇文章中,我们将使用一个用例来做介绍:客户对其 Amazon Elastic Compute Cloud (Amazon EC2)  实例有严格的安全要求,只允许在 Amazon Virtual Private Cloud (Amazon VPC) 内进行私有连接:该Amazon EC2 实例只有一个私有 IP 地址,无法访问 NAT 网关或堡垒主机。

如下图所示,Amazon EC2 实例为内部应用程序提供 Web 界面,以远程方式工作的员工必须安全地访问该界面。为了支持这样的应用场景,我们使用适用于 AWS Systems Manager接口 VPC 终端节点来让 Amazon EC2 实例上的 AWS Systems Manager 代理与 Systems Manager 服务终端节点之间的私有连接变得更加容易。 我们配置 AWS Systems Manager Session Manager 以启用员工本地工作站和私有 Amazon EC2 实例之间的端口转发,以便于他们可以安全地访问 Web 应用程序。

图 1 – 使用 AWS Systems Manager 端口转发访问私有 Amazon EC2 实例

 

先决条件

出于演练的目的,我们假设您的 AWS 环境如下:

关于本篇博文
阅读时间 10 分钟
学习水平 中级 (300)
使用的服务  Amazon VPC、 AWS PrivateLink、 AWS Systems Manager

 

使用私有子网创建 Amazon VPC

VPC 是由 AWS 对象(例如 Amazon EC2 实例)所填充的 AWS 云的隔离部分。 按照 Amazon VPC 入门指南使用 Amazon VPC 控制台中的 Amazon VPC 向导创建 VPC。 在我们的使用场景中,我们只需要私有子网来启动我们的 Amazon EC2 实例。

要在向 Systems Manager 服务发出请求时使用 AWS 私有网络连接到其默认公共终端节点 DNS 名称,请确保为您VPC 中的Enable DNS hostnames 和 Enable DNS support属性已被启用。

在私有 Amazon VPC 中启动 Amazon EC2 实例

您可以如启动 Amazon EC2 实例指南中所述的方式使用 AWS 管理控制台启动 Linux 实例。在本篇文章中,我们使用 Amazon Linux 2 Amazon 系统映像 (AMI) 来默认预安装 Systems Manager 代理。 请参阅 Systems Manager 代理概述以查看预安装了 Systems Manager 代理的 AMI 列表。

在公有子网中创建 Amazon EC2 实例并安装您所选择的 Web 服务器。 第一个 Web 服务器安装需要公共 Internet 连接。 在我们的场景中,我们需要让 Amazon EC2 实例位于私有子网中。 按照说明将 Amazon EC2 实例移动到另一个子网,以将您的 Amazon EC2 实例迁移到私有子网。

为 AWS Systems Manager 配置接口 VPC 终端节点

按照创建接口终端节点的步骤创建以下接口终端节点:

  • com.amazonaws.region.ssm:Systems Manager 服务的终端节点。
  • com.amazonaws.region.ec2messages:Systems Manager 使用此终端节点从 Systems Manager 代理调用 Systems Manager 服务。
  • com.amazonaws.region.ec2:如果您使用 Systems Manager 创建启用 VSS 的快照,则必须确保您拥有 EC2 服务的终端节点。 如果未定义 EC2 终端节点,枚举附加 EBS 卷的调用将失败。 这会导致 Systems Manager 命令失败。
  • com.amazonaws.region.ssmmessages:此终端节点是使用会话管理器通过安全数据通道连接到您的实例所必需的,在本例中是我们的端口转发要求。

为接口终端节点启用私有 DNS

接口终端节点的私有 DNS 功能将私有托管区域与包含记录集的 Amazon VPC 相关联。 该功能还允许您使用 AWS 私有网络连接到 Systems Manager 服务,同时向 Systems Manager 默认公共终端节点 DNS 名称发出请求。 要使用该功能,请确保为您的 Amazon VPC 启用属性启用 DNS 主机名和启用 DNS 支持。 默认情况下,在为 AWS 服务创建的终端节点上启用私有 DNS。

以下示例显示解析为私有 IP 地址的 ssm.us-east-1.amazonaws.com 服务终端节点,即使此 Amazon EC2 实例位于私有子网内,也可以由 Systems Manager 管理。

[ec2-user@ip-10-100-1-52 ~]$ nslookup ssm.us-east-1.amazonaws.com

Server:         10.100.0.2

Address:        10.100.0.2#53

Non-authoritative answer:

Name:   ssm.us-east-1.amazonaws.com

Address: 10.100.254.180

Name:   ssm.us-east-1.amazonaws.com

Address: 10.100.1.176

 

区域参数

Region 表示 AWS Systems Manager 支持的 AWS 区域的标识符,例如 us-east-2 代表美国东部(俄亥俄)区域。 有关受支持区域值的列表,请参阅 AWS Systems Manager 终端节点文档中的区域列。

下图显示了端口转发要求所需的所有接口 VPC 终端节点,以 us-east-1 区域为例。

图 2 – AWS Systems Manager 的接口 VPC 终端节点

设置 AWS Systems Manager

默认情况下,AWS Systems Manager 无权对您的实例执行操作。 您可以使用 IAM 实例配置文件授予访问权限,该配置文件是在启动时将 IAM 角色信息传递给 Amazon EC2 实例的容器。

在配置您的 AWS Systems Manager 权限后,请按照 AWS Systems Manager 快速设置指南在您的 Amazon EC2 实例中快速配置所需的 IAM 角色和常用的 AWS Systems Manager 功能。

AmazonSSMRoleForInstancesQuickSetup 角色必须附加到 Amazon EC2 实例,以便 AWS Systems Manager 有权对您的实例执行操作。

图 3 – AWS Systems Manager 快速设置创建的 IAM 角色

按照 AWS Systems Manager 实例配置文件指南验证或创建具有会话管理器权限的 IAM 实例配置文件。

AWS Systems Manager 设置完成后,Amazon EC2 实例将注册到 AWS Systems Manager 服务。 运行以下命令以验证设置是否完成。 (在此示例中,有两个 Amazon EC2 实例具有由 AWS Systems Manager 管理的仅限 IP 的私有访问权限。)

sigitp@host-lab:~$ aws ssm get-inventory
{
    "Entities": [
        {
            "Data": {}, 
            "Id": "i-0006803bf97sgtsgt"
        }, 
        {
            "Data": {
                "AWS:InstanceInformation": {
                    "Content": [
                        {
                            "ComputerName": "ip-10-100-1-52.ec2.internal", 
                            "InstanceId": "i-005cc2c4661sgtsgt", 
                            "IpAddress": "10.100.1.52", 
                            "AgentType": "amazon-ssm-agent", 
                            "ResourceType": "EC2Instance", 
                            "AgentVersion": "2.3.1319.0", 
                            "PlatformVersion": "2", 
                            "PlatformName": "Amazon Linux", 
                            "PlatformType": "Linux"
                        }
                    ], 
                    "TypeName": "AWS:InstanceInformation", 
                    "SchemaVersion": "1.0", 
                    "CaptureTime": "2020-07-03T19:29:40Z"
                }
            }, 
            "Id": "i-005cc2c4661sgtsgt"
        }, 
        {
            "Data": {
                "AWS:InstanceInformation": {
                    "Content": [
                        {
                            "ComputerName": "ip-10-100-1-110.ec2.internal", 
                            "InstanceId": "i-0cb65f68833sgtsgt", 
                            "IpAddress": "10.100.1.110", 
                            "AgentType": "amazon-ssm-agent", 
                            "ResourceType": "EC2Instance", 
                            "AgentVersion": "2.3.1319.0", 
                            "PlatformVersion": "2", 
                            "PlatformName": "Amazon Linux", 
                            "PlatformType": "Linux"
                        }
                    ], 
                    "TypeName": "AWS:InstanceInformation", 
                    "SchemaVersion": "1.0", 
                    "CaptureTime": "2020-07-03T19:23:25Z"
                }
            }, 
            "Id": "i-0cb65f68833sgtsgt"
        } 
    ]
}

使用 Session Manager 端口转发访问 Amazon EC2 实例

注意:在尝试开始会话之前,请确保您已完成上述设置会话管理器的步骤。 有关更多信息,请参阅 Session Manager 入门

要使用 AWS Systems Manager 命令行界面 (AWS CLI) 进行端口转发,必须在您的本地计算机上安装 Session Manager 插件。 有关更多信息,请阅读 AWS CLI 文档的安装会话管理器插件

aws ssm start-session \
--target instance-id \
--document-name AWS-StartPortForwardingSession \ 
--parameters '{"portNumber":["80"], "localPortNumber":["9090"]}'
The following snippet shows port forwarding AWS CLI execution for one of the Amazon EC2 instances:
sigitp@host-lab:~$ aws ssm start-session --target i-005cc2c4661sgtsgt --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["80"], "localPortNumber":["9090"]}'

Starting session with SessionId: sigit@domain.com-03aaac7aee3sgtsgt
Port 9090 opened for sessionId sigit@domain.com-03aaac7aee3sgtsgt.
Waiting for connections...

打开 Web 浏览器以访问 localhost:9090 上的 Amazon EC2 实例 Web 应用程序:

图 4 – 使用 Session Manager 端口转发访问私有 Amazon EC2 实例上的 Web 应用程序

会话管理器 AWS CLI 将记录会话接受的连接:

sigitp@host-lab:~$ aws ssm start-session --target i-005cc2c4661sgtsgt --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["80"], "localPortNumber":["9090"]}'

Starting session with SessionId: sigit@domain.com-03aaac7aee3sgtsgt
Port 9090 opened for sessionId sigit@domain.com-03aaac7aee3sgtsgt.
Waiting for connections...

Connection accepted for session sigit@domain.com-0d4eb1bc72esgtsgt.

清理

请务必关闭您为了完成本示例所启动的所有 Amazon EC2 实例。

 

总结

在本篇文章中,我们引导您创建一个带有私有子网的 Amazon VPC,并使用一个简单的 Web 服务器启动一个私有 Amazon EC2 实例。 我们还介绍了接口 VPC终端节点配置、AWS Systems Manager 快速设置,最后使用 Session Manager 端口转发功能访问私有 Web 应用程序。

端口转发适用于 Windows 和 Linux 实例。 它现已在提供 AWS Systems Manager 的所有 AWS 区域推出。 连接 Amazon EC2 实例时无需额外费用; 您需要为来自接口 VPC 终端节点的传出流量付费。

本篇作者

Sigit Priyanggoro

全球系统集成商团队的高级合作伙伴解决方案架构师。 他与合作伙伴和客户一起研究管理工具、电信和移动领域的 AWS 技术。 在业余时间,他在乐队中担任吉他手和备用鼓手。 您可以通过 Dev.To 上的@sigitp 与他联系。

Sruthi Maddineni

Sruthi Maddineni 是 AWS Systems Manager 的一名软件开发工程师,主要从事 Session Manager 工作。 工作之余,Sruthi 喜欢远足、旅行和尝试不同的美食。

校译作者

Jerry Yuen

目前服务于亚马逊云科技解决方案架构师,负责基于亚马逊云科技的方案咨询,设计和架构评估。在运维,DevOps方面有丰富的经验,目前侧重于运管理和治理。