亚马逊AWS官方博客

在 AWS 控制台上使用基于网页界面的 EC2 Instance Connect 功能连接到 EC2 的 SSH

一、背景

1、常见的 EC2 登录方式

EC2 常见的登录方式包括:

  • 使用 Putty、Secure CRT 等 SSH 客户端软件,从外网 Internet 上或 VPC 内网堡垒机上登录 EC2
  • 使用 Session Manager 在任意位置登录,要求本 EC2 上有 Session Manager Agent,并有对应的 IAM Role,具体方法可参考本篇博客
  • 使用 AWS 控制台上的连接到 EC2 串口 Serial Console
  • 使用 AWS 控制台上的网页版本的 EC2 Instance Connect,可从外网 Internet 上或 VPC 内网使用 EC2 Instance Connect 的 VPC Endpoint 上登录 EC2

本文即讲解 EC2 Instance Connect 功能的使用。

2、两种网络场景(二选一)

EC2 Instance Connect 功能是一个基于 WEB 界面的 SSH 工具,有两种网络方式:

  • 从外网互联网上发起访问:EC2 具有 EIP 可从外网访问,且安全规则组放行了 EC2 Instance Connect 客户端的地址范围
  • 从 VPC 内网访问:本区域的本 VPC 内创建了 EC2 Instance Connect 的 VPC Endpoint,这样 EC2 Instance Connect 即可连接到纯内网的 EC2,且安全规则组放行了 VPC Endpoint 的地址范围

第二种使用方式有着特别的优势,即可不需要在外网部署任何堡垒机,也不需要在 VPC 上配置 EIP 和 NAT Gateway,即可通过 EC2 Instance Connect 连接到一台无法访问外部网络的私密状态的 EC2。本文分别讲述两种场景。

3、为操作系统安装 EC2 Instance Connect 软件包

最新的 Amazon Linux 2、Amazon Linux 2023 版本、Ubuntu 20.04 以上版本已经预装本软件包,可跳过本步骤。

如果是创建于 2023 年以前的老的 Amazon Linux 2 系统、CentOS 7.x 系统,需要额外安装软件包。使用 root 身份执行如下命令。

yum install ec2-instance-connect
systemctl start ec2-instance-connect.service
systemctl enable ec2-instance-connect.service

以上命令将安装 EC2 Connect 所需要的软件包。

如果是 Debian 系统,可在 Debian 上自行如下命令完成 EC2 Instance Connect 的安装和构建。

apt install devscripts dpkg-dev -y
git clone https://github.com/aws/aws-ec2-instance-connect-config.git
cd aws-ec2-instance-connect-config
./bin/make_deb.sh 1.1 18
dpkg -i ec2-instance-connect_1.1.19_all.deb

二、EC2 具有 EIP 可从互联网访问的场景

1、查询 EC2 Instance Connect 服务的地址范围

从外网即互联网登录时候,需要在 EC2 上配置安全规则组,放行来自 EC2 Instance Connect 服务的 IP 地址的请求。

查询 EC2 Instance Connect 的 IP 地址的方法是从 AWS 官网这里下载一个包含 AWS 所有 IP 网段的 JSON 文件,然后再使用 jq 程序对其按服务名称筛选,完整操作方法可参考这篇文档。

下载原始 JSON 后,查找关键字 EC2_INSTANCE_CONNECT 然后再查找当前对应的 Region。注意不同 Region 的 EC2 Connect 使用的 IP 段是不相同的。例如,新加坡 ap-southeast-1 的 EC2 Instance Connect 服务的源地址范围是 3.0.5.32/29

这里也提供一些常见的 Region 的 EC2_INSTANCE_CONNECT 的 IP 地址范围如下:

  • 北京区域 cn-north-1:43.196.20.40/29
  • 宁夏区域 cn-northwest-1:43.192.155.8/29
  • 美西 1 加利福尼亚 us-west-1:13.52.6.112/29
  • 美西 2 俄勒冈 us-west-2:18.237.140.160/29
  • 美东 1 弗吉尼亚 us-east-1:18.206.107.24/29
  • 美东 2 俄亥俄 us-east-2:3.16.146.0/29
  • 东京 ap-northeast-1:3.112.23.0/29
  • 香港 ap-east-1:43.198.192.104/29
  • 法兰克福 en-central-1:3.120.181.40/29

更多 AWS Region 的地址段请按上文提供的文档和博客来查询。

2、配置安全组

进入 EC2 服务,选中要修改安全组的 EC2,点击页面下方第二个标签页安全,然后找到安全组,点击安全组的名字。如下截图。

在安全规则组的界面上,点击 Inbound 入站规则,点击 Edit Inbound rules 编辑入站规则。如下截图。

在编辑安全组界面上,输入新的类型 TypeSSH,在 Source 来源地址位置,输入上一步查询获得的中国区北京区域的 EC2 Instance Connect 的 IP 范围,然后点击保存。如下截图。

至此配置完成。

3、从互联网发起测试连接

保存安全组成功后,选中要连接的 EC2,然后点击 Connect 按钮。如下截图。

在弹出的连接窗口内,点击第一个标签页 EC2 Instance Connect,选择连接类型 Connection TypeConnect using EC2 Instance Connect,然后在 User name 位置使用默认的 ec2-user,最后点击连接按钮。

连接成功,效果如下。如下截图。

至此操作完成。

三、EC2 位于私有子网、没有公网 IP 时候从 VPC 内网登录的场景

注:以下流程是首次使用本功能需要做的配置,后续不需要再重复创建 Endpoint。

1、创建 VPC Endpoint 要使用的安全组

首先为 VPC Endpoint 创建一个安全组,其规则是:

  • 入站规则:空(不允许任何入站)
  • 出站规则:允许去往 0.0.0.0/0

以上两条规则在创建新的安全组时候,都是默认状态,什么都不用做即可。如下截图。

创建完毕后,记录下本安全规则组的 ID。如下截图。

创建 VPC Endpoint 所需要的安全组完成。

2、在 EC2 的安全组内授权 VPC Endpoint 的安全组入站请求

找到本 EC2 所使用的安全组,编辑之。在入站规则位置,添加一条新的记录,协议是 SSH,Source 来源地址位置,粘贴上一步生成的 VPC Endpoint 的安全组 ID。如下截图。

这样,本 EC2 就会允许来自 EC2 Instance Connect Endpoint 对 SSH 端口的入站请求了。

3、在当前 VPC 配置 VPC Endpoint

首先创建好一个位于 Private 子网的 EC2。然后通过 EC2 界面观察只有内网 IP,没有外部 IP。同时,由于没有创建 NAT Gateway,因此本 EC2 是完全没有外部网络访问的。

在连接 EC2 界面,可看到黄色的提示说本 EC2 没有外网 IP。这时候下方的 Connect Type 默认是通过左侧选项即互联网连接。接下来要选择右侧的选项 Connect using EC2 Instance Connect Endpoint。如下截图。

当选择了右侧的选项使用 Endpoint 连接后,页面下方会出现 EC2 Instance Connect Endpoint 的下拉框,点击后可看到因为是首次使用,下拉框内并没有任何 Endpoint,而是出现一个 Create an endpoint 的链接。点击这个链接,将跳转去 VPC 界面进行配置。如下截图。

在创建 VPC Endpoint 的界面,输入 Endpoint 的名称叫 ec2-connect,这是个友好显示名称,自行起名不会影响功能和使用。接下来在 Service category 位置选择 EC2 Instance Connect Endpoint 的选项。然后在 VPC 位置选择本 EC2 所在的 VPC。如下截图。

将页面向下滚动,点击 Additional settings 展开高级菜单以及安全组设置,有如下几个关键参数:

  • 启用 VPC 高级设置里边的保留客户端 IP 选项,这样 EC2 看到的将会是当前登录 AWS 控制台的访问者的 IP;
  • 选择正确的 VPC,因为 Endpoint 和安全组都是区分 VPC 的,因此选错 VPC 就无法获取下一步配置的清单;
  • 然后选择本文上一个步骤创建的 VPC Endpoint 的安全组,因为上一步做了安全罪注意这里选错名字就无法登录;
  • 最后选择 Endpoint 所在子网的位置,选择本 VPC 的内部子网,也就是 EC2 所在的没有 EIP、也没有外网路由的完全私有的子网。

最后点击右下角的创建按钮,完成 Endpoint 创建。如下截图。

创建进行中。可看到 VPC Endpoint 的状态这里有一个 Pending。创建需要 3-5 分钟,必须等到 Pending 变成绿色的 Available 字样后才能开始使用。

在等待几分钟,并按刷新按钮查看,可看到 Endpoint 状态为可用。如下截图。

至此配置完成。

4、测试从 VPC Endpoint 发起连接

再次对 EC2 发起连接操作,当选择 EC2 Instance Connect Endpoint 后,已经可以从下拉框内看到 Endpoint 的名字了。选中后,点击连接。如下截图。

登录成功。使用 netstat -an 命令,可查看登录者 IP 地址。由于打开了保留 IP 地址功能,因此可以看到访问者的客户端 IP 地址。如下截图。

至此所有配置工作完成。

五、使用 VPC Endpoint 时进一步提升网络安全的手段

1、使用网络环境限定、多 VPC 场景说明

EC2 Instance Connect 是针对 EC2 的服务,其要连接的对象只能是本 Region 的 EC2,不能是其他 Region 的 EC2,也不能是通过 Direct Connect 专线连接的 IDC 的虚拟机。因此,您无需担心其他 Region 的 EC2 或者 IDC 的虚拟机被此功能连接。

如果是在内网场景,通过创建 VPC Endpoint 来连接到内网的 EC2 时候,需要注意,EC2 所在的 VPC 必须创建 Endpoint。如果只是某个 VPC 内创建了 EC2 Instance Connect 的 VPC Endpoint,但是 EC2 在另一个 VPC,此时即便两个 VPC 做了 Peering 互通,也是不能使用的。这是因为在 AWS Console 上 EC2 Instance Connect 的界面上选择 VPC Endpoint 时候,只能选本 EC2 所在的本 VPC 的 Endpoint。解决多 VPC 下都有 EC2 都需要从内网登录的办法是:给所有 EC2 所在的 VPC 都事先创建 VPC Endpoint 即可。

2、通过 IP 地址限定查询 VPC Endpoint 的连接

当 EC2 Instance Connect 的 VPC Endpoint 和要连接的 EC2 在同一个 VPC 内时候,二者之间的网络授权可以通过 Security Group 的互相授权来完成。在 EC2 的安全规则组上,添加一条允许 22 端口入站、来源是 VPC Endpoint 使用的安全组,即可允许 EC2 Instance Connect 连接到 EC2。这个场景就是本文上一章节讲述的场景。

如果需要显式的为登录 EC2 SSH 的 IP 地址授权,那么可通过如下方法查询。

登录到 VPC 界面,点击 Endpoint 服务。点击 Subnets 子网标签页,即可看到这个 Endpoint 使用的内网 IP。例如本文是 10.0.131.113。如下截图。

由此即可在 EC2 的安全组、或者网络安全防护工具上进行授权。

3、通过配置 VPC Endpoint 的出站规则进一步提升安全管控(可选)

为了进一步提升安全管控,例如有数个 EC2 在内网,有几个可以被 EC2 Instance Connect 连接,但是另外几个不希望被 EC2 Instance Connect 功能连接。那么此时,除了调整 EC2 的安全组之外,还可以配置 VPC Endpoint 的 Security Group 的出站规则。

例如在出站规则中,只显示的允许当个 EC2 的 IP。如下截图。

这个时候,本 VPC Endpoint 去往 VPC 的流量只能去往这个唯一的目标了,也就实现了进一步缩小可被连接的 EC2 范围,进一步提升了安全管控。

至此 EC2 Instance Connect 的基本使用方法介绍完成。

六、参考文档

使用 EC2 Instance Connect 连接到 Linux 实例:

https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/Connect-using-EC2-Instance-Connect.html

EC2 Instance Connect 代码库 on Github:

https://github.com/aws/aws-ec2-instance-connect-config

查询 AWS IP 地址范围:

https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/aws-ip-ranges.html

本篇作者

杨立军

AWS 弹性计算解决方案架构师,主要负责 AWS 弹性计算相关产品的技术咨询与方案设计。专注于混合云相关的服务和解决方案。

刘辛酉

AWS 解决方案架构师,曾服务于 Parallels、Siemens,在 Atos 担任管理服务部首席架构师。拥有十余年数据中心、互联网技术经验,长期为制造、汽车等行业头部客户提供 IT 咨询和服务。加入 AWS 后负责零售、快消、食品和制造等行业客户。擅长硬件、网络、安全等领域设计。