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

注:在2023年9月之前,EC2 Instance Connect功能只在AWS海外区域可用。2023年9月中国区正式上线,且新增了VPC Endpoint功能的至此,可以连接纯内网的EC2了,不再依赖EIP。

一、背景

1、常见的EC2登录方式

EC2常见的登录方式包括:

  • 使用Putty、SecureCRT等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

Debian系统安装的详情也可参考这篇博客。

二、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,将这个地址段填写到安全规则组的Inbound的放行地址段中。

这里也提供一些常见的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 Type是Connect 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