[AWS][计算]AWS EC2 SSH连接错误排查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AWS][计算]AWS EC2 SSH连接错误排查相关的知识,希望对你有一定的参考价值。

对于这个题目,发一个blog挺不好意思的。但是很多用户 对AWS EC2连接却总是出现各类的问题。因为AWS的虚拟机不是直接使用用户名和密码就可以直接SSH上去,它严格遵循证书机制。借此直接拿我们总结的文档分享一下。

前提条件:如何进行 ssh 连接

    1. 在 Linux 或者 mac 环境下,常见的ssh的命令:ssh -i /证书路径/证书.pem ec2-user@ec2-52-81-19-50.cn-north-1.compute.amazonaws.com.cn
      (注意Amazon Linux的user name是ec2-user, 其他的系统镜像对应的user name也不一样)
OS UserName
Amazon Linux ec2-user
centos centos
ubuntu ubuntu
自定义AMI YourName
  1. 在 windows 下,请参考使用 putty 从 windows 连接到 linux 实例。通常分为两步,秘钥格式的转换,以及连接。
    详细参考:https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/AccessingInstances.html

此文主要涉及两大类错误类型,分别为 连接超时 以及 权限相关。请根据实际报错信息,查看相应的详细篇章。

  1. 连接超时。报错:Connection Timed Out。 通常是 网络设置错误,请检查对应的 IP , 安全组,ACL,子网路由表,网络 环境等。
  2. 权限相关。报错:Permission Denied 或者提示 Key 相关错误。通常是 秘钥或者用户名 的问题。

——————————————————————————————————

1. 连接超时

问题描述
创建并启动了 Amazon EC2 Linux 实例,但是无法使用 SSH 或通过 SSH 连接的实用工具(如 PuTTY)连接到实例。在连接到实 例时,连接超时,出现类似以下内容的错误: Networ error: Connection timed out或者 Error connecting to [instance], reason: -> Connection timed out: connect。该问题通常是由于安全组,路由表,网络 ACL 等网络配置设置不正确导致的。请按照故障排除中的几个步骤检查网络环境。

故障排除:

1.1 检查安全组:

安全组中的 source 为允许访问的 ip 源, port 为允许访问的端口。这是最常见的错误。 请检查该实例是否有开放 22 端口,并且
允许您的 ip 段访问(source)。为了安全考虑,请尽量讲您的 source 定义为只允许特定的 ip 地址段访问(如下图所示,单个ip
需要在最后加/32的后缀), 请检查当前机器的 ip 是否符合此 ip 段。

  • 这是最常见的错误。如果这一步设置没有问题,请看下一步。
  • 如果不知道如何操作,请阅读图下方的详细教程。
  • 补充说明:默认情况下该实例也无法 ping 通,如果希望ping这台实例,需要以类似的方法添加 ICMP 协议的 rule。

技术图片

具体操作如下。
1.打开 Amazon EC2 控制台。
2.在导航窗格中,选择 Instances。
3.查找要通过 SSH 连接的 EC2 实例。
4.在屏幕底部的 Description 选项卡中,选择要连接的 EC2 实例的安全组。
5.在屏幕底部的窗格中的 Inbound (入站) 选项卡中,确保设置了允许从当前公有 IP 地址进行 SSH 访问的规则。
6.如果设备所使用的 IP 不在列表中,请选择 Edit,然后选择 Add rule。
7.对于 Source,选择 您当前使用的IP 。 0.0.0.0/0 代表对所有 ip 开放。
8.选择 Save。

1.2 检查子网是否为公有子网:

在说这个之前,建议大家把非必要暴露在公网的服务器,尽量置放到私有子网中,通过跳板机或堡垒主机来管理自己的服务器。

公有子网是指允许 Internet 访问的子网。如果你的 EC2 在私有子网中,外界 Internet 是无法进行连接的, ssh 也会失败。
检查方法是,选择 VPC 服务,在 左侧的路由表(Route Table)中,选择 EC2 所在的子网,检查路由设定。

  • 如果有红框所标注的指向 Internet 网关的路由,则子网为公有子网,这一步没有问题。请检查下一步。
  • 如果缺失指向网关的路由,需要编辑并创建将 0.0.0.0/0 指向您的 Internet 网关 ID 的路由 (如图中红框所示)。
  • 如果该VPC 中没有网关 ( IGW ), 则需要先添加一个。如不知道如何操作,请阅读图下方的详细步骤教程。

技术图片

1.开 Amazon VPC 控制台。
2.在导航窗格中,选择 Route Tables,然后从列表中选择您的 VPC 路由表。
3.在 Routes (路由) 选项卡中,确保有指向 Internet 网关的默认路由。
4.如果没有,请从导航窗格中选择 Internet Gateways,并复制您的 Internet 网关 ID。如果没有 Internet 网关,请创建一个并将其连接至您的 VPC。确保复制新 Internet 网关 的 ID。
5.返回到 Route Tables,然后选择 Routes 选项卡。
6.编辑并创建将 0.0.0.0/0 指向您的 Internet 网关 ID 的路由。
7.保存路由表。

1.3 检查子网的网络访问控制列表 (ACL)

ACL 为子网级别的防火墙,默认网络 ACL 允许所有入站和出站流量。如果您没有对 ACL 进行过任何更改,请跳过这一步 。

  1. 打开 Amazon VPC 控制台。
  2. 在导航窗格中,选择 Subnets,然后选择您的子网。
  3. 在 Description (描述) 选项卡上,找到 Network ACL (网络 ACL),然后选择其 ID (acl-xxxxxxxx)。
  4. 选择网络 ACL。对于 Inbound Rules,验证规则是否允许来自你的计算机的流量。如果不允许,请删除或修改阻止来自您的计算机的流量的规则。对于 Outbound Rules,验证规则是否允许到您的计算机的流量。如果不允许,请删除或修改阻止到你的计算机的流量的规则。

1.4 确认IP地址是否发生变化

如果您曾经对实例进行过关机,然后再次开机的操作(在控制台上表现为,曾经对实例进行过 stop 然后 start 的操作)。在没有绑定弹性 ip 的情况下,您的ip地址已经发生变化,请在控制台上再次确认此时的 ip 地址。以下为具体操作步骤:

  1. 在导航窗格中,选择 Instances。
  2. 查找要通过 SSH 连接的 EC2 实例。
  3. 在屏幕底部的 Description 选项卡中,查看 Public IP 与您正在使用的 ip 地址是否一致。如果 IP 地址已经发生变化,请使用新的 IP 地址。
    技术图片

1.5 镜像的检查

请检查目前您使用的是否是官方的 AMI (镜像)。AWS的官方镜像一般在 Quick Start 当中,对于CentOS,在Marketplace中。

  1. 如果 Quick Start 含有您想要的操作系统,请尽量选择 Quick Start 中的镜像。
    技术图片
  2. 对于有些不在Quick Start中的镜像,如 CentOS , 在Marketplace 当中是提供的。请选择 Marketplace 发布的镜像。Markeplace 为厂家直供的 AMI。
    技术图片
  3. 除非您确定某个 AMI 的安全性,尽量不要使用 community 的镜像。community 属于个人发布的镜像,AWS 无法监管,可能有些社区版的镜像做了一些特殊的安全管理和控制,因此无法直接 ssh 上去。这种情况下,换成官方或者 Marketplace上的镜像即可。

1.6 检查实例负载

检查实例上的负载,服务器可能已超过负载,导致sshd服务无法正常工作,无法接受新的 ssh 请求。可以通过观察 Cloudwatch的指标确认此类问题。此时最简单的方式是可以尝试 通过 reboot 的方式是否能够解决。
如不能,可以通过 system manager 的session manager 工具尝试打开一个 session 进行相应的 command 操作 kill 掉一些不必要的资源。

1.7 其他原因

如果上述步骤您经过检查都没有问题,请检查以下原因:

  1. 22 端口被屏蔽:您目前是否处于办公或者酒店等公共WIFI区域,请核实该公共网络是否封禁了22端口,或者换个网络试试看。
  2. 电脑自身是否有防火墙屏蔽了22端口。
  3. 如果所有网络设置都正确,您仍然无法登录到实例;或者您未改动过任何实例配置,实例负载也正常的情况下,突然无法ssh 上去,有可能您的实例当前 IP 被墙。请您尝试用境外网络 (比如换一台海外的EC2用于 ssh,或者设置海外代理) 尝试一下是否能够 ssh 上去确认此问题。如果被墙,解决方法为 更换当前 IP 地址。
  4. 可以通过stop 实例,然后再次 start 实例 ,来更换 IP 地址。
  5. 申请一个EIP, 然后挂载 EIP 给 EC2。此时 IP 会换为 EIP 的地址。

2.权限相关

创建并启动了 EC2,但是无法使用 SSH 连接到实例,报错信息包括: Host key not found in [directory]、Permission denied (publickey) 或 Authentication failed, permission denied。此问题通常因为 秘钥或者用户名错误 导致的权
限问题,以下为具体排查方法。

故障排除

2.1. 检查秘钥对是否正确

每个 EC2 在启动的时候会有一个秘钥,此秘钥为第一次登录到EC2上的唯一方法,且只有启动实例前可以下载。请首先选中您的实例,在 Description 页面查看秘钥对的名称,确保您使用了正确的秘钥。

  1. 如果此项为空,则您无法ssh到该实例,请关闭该实例,重新启动新实例,并且记得下载秘钥。
    技术图片
  2. 如果您已经丢失了该秘钥对,请参考丢失秘钥时如何连接到实例 。(会比较麻烦)
    https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-key-pairs.html#replacing-lost-key-pair

2.2 用户名错误

如果您使用了官方镜像,正确的用户名如下所示:
对于 Amazon Linux 2 或 Amazon Linux AMI,用户名称是 ec2-user。
对于 CentOS AMI,用户名称是 centos。
对于 Debian AMI,用户名称是 admin 或 root。
对于 Fedora AMI,用户名为 ec2-user 或 fedora。
对于 RHEL AMI,用户名称是 ec2-user 或 root。
对于 SUSE AMI,用户名称是 ec2-user 或 root。
对于 Ubuntu AMI,用户名称是 ubuntu。
另外,如果 ec2-user 和 root 无法使用,请与 AMI 供应商核实。
如果是社区版本的 AMI, 无法保证其用户名,请与 AMI 制作者联系,或者转用官方 AMI。

2.3 密钥格式

通常,ssh 所需要的秘钥为pem格式的(从控制台下载的秘钥即为此格式)。

  1. 如果您是用 第三方工具 ssh-keygen 产生的秘钥,默认情况下,它会生成 OpenSSH 的密钥格式。此时报错 Private key must begin with "-----BEGIN RSA PRIVATE KEY-----" and end with "-----END RSA PRIVATE KEY-----"。解决方法为 使用 ssh-keygen -m PEM 创建秘钥
  2. 如果您使用 windows 机器,利用 putty 登录,需要先做一个从 pem 格式到 ppk 格式的转换,具体操作https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/putty.html

2.4 检查秘钥权限

如果遇到错误 bad permissions: ignore key: my_private_key.pem Permission denied (publickey).
这种情况是因为您的私钥文件权限太大,任何用户都可以对其进行读写操作,此时,为了保护您的私钥文件, SSH 会忽略您的密钥。 解决方法为,通过以下命令更改秘钥权限:chmod 400 my_private_key.pem

2.5 KNOWN_HOST相关错误

此情况通常见于切换了 EIP 等情况,比如 EIP 曾经挂载在机器 A 上,用了秘钥 A,此时切换了 EIP 到机器 B 上,对应的秘钥为秘钥 B,这时此 IP 的 known_host 对应 record 不匹配。解决方法为:打开 known_host 文件 (Linux /mac 地址: ~/.ssh/known_host ) 删除此 IP 的对应 record。
技术图片

有关EC2视频教程可以参考:https://edu.51cto.com/center/course/lesson/index?id=517073

以上是关于[AWS][计算]AWS EC2 SSH连接错误排查的主要内容,如果未能解决你的问题,请参考以下文章

在将ssh尝试到实例时关闭AWS EC2连接

AWS EC2 ssh连接在10秒后关闭

AWS EC2:ssh:连接到主机 10.0.0.206 端口 22:连接超时

通过SecureCRT连接AWS EC2 Linux

SSH 进入 AWS Cloud9 环境

无法通过 AWS Session Manager 工作获得 SSH 连接