无法SSH连接到远程的EC2实例

此文主要用来排查常见的无法 ssh 连接到 Linux 实例的问题并给出相应的解决方案。

在ssh登录失败时,根据报错的信息进行相应的处理

如何远程连接

两大类报错类型,分别为连接超时以及权限相关。请根据实际报错信息,查看相应的详细篇章。最后的章节也给出 了查看详细日志的方法。

1、连接超时。

Connection Timed Out。

通常是 网络设置错误,请检查对应的 IP , 安全组,ACL,子网路由表,网络 环境等。

2、权限相关。

Permission Denied 或者提示 Key 相关错误。通常是 秘钥或者用户名 的问题。

1、连接超时

问题描述

创建并启动了EC2实例,但是无法使用SSH或通过SSH连接的实用工具(如 PuTTY)连接到实例。在连接到实例时,连接超时,出现类似以下内容的错误:Network 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 段。

如果在办公局域网中, 您的 ip 地址可能无法固定,每次上网会发生变化,在这种情况下,此时建议设置 source 为您的办公网 络的 ip range。

● 这是最常见的错误。如果这一步设置没有问题,请看下一步。

● 如果不知道如何操作,请阅读图下方的详细教程。

● 补充说明:默认情况下该实例也无法 ping 通,如果希望ping这台实例,需要以类似的方法添加 ICMP 协议的 rule。

无法SSH连接到远程的EC2实例 - 图1

打开 Amazon EC2 控制台。

在导航窗格中,选择 Instances。

查找要通过 SSH 连接的 EC2 实例。

在屏幕底部的 Description 选项卡中,选择要连接的 EC2 实例的安全组。

在屏幕底部的窗格中的 Inbound (入站) 选项卡中,确保设置了允许从当前公有 IP 地址进行 SSH 访问的规则。 如果设备所使用的 IP 不在列表中,请选择 Edit,然后选择 Add rule。 对于 Source,选择 您当前使用的IP 。 0.0.0.0/0 代表对所有 ip 开放。 选择 Save。

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

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

● 如果有红框所标注的指向 Internet 网关的路由,则子网为公有子网,这一步没有问题。请检查下一步。

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

无法SSH连接到远程的EC2实例 - 图2

打开 Amazon VPC 控制台。

在导航窗格中,选择Route Tables,然后从列表中选择您的VPC路由表。在Routes (路由) 选项卡中,确保有指向Internet网关的默认路由。

如果没有,请从导航窗格中选择Internet Gateways,并复制您的Internet网关ID。如果没有Internet网关,请创建一个并将其连接至您的VPC。确保复制新Internet网关的ID。返回到Route Tables,然后选择Routes选项卡。编辑并创建将0.0.0.0/0指向您的Internet网关ID的路由,保存路由表。

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

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

打开 Amazon VPC 控制台。

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

无法SSH连接到远程的EC2实例 - 图3

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

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

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

1.5 镜像的检查

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

如果 Quick Start 含有您想要的操作系统,请尽量选择 Quick Start 中的镜像。

无法SSH连接到远程的EC2实例 - 图4

对于有些不在Quick Start中的镜像,如 CentOS , 在Marketplace 当中是提供的。请选择 Marketplace 发布的镜像。 Markeplace 为厂家直供的 AMI。

无法SSH连接到远程的EC2实例 - 图5

除非您确定某个 AMI 的安全性,尽量不要使用 community 的镜像。community 属于个人发布的镜像,AWS 无法监管, 可能有些社区版的镜像做了一些特殊的安全管理和控制,因此无法直接 ssh 上去。这种情况下,换成官方或者 Marketplace 上的镜像即可。

1.6检查实例负载

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

1.7其他原因

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

● 22端口被屏蔽:您目前是否处于办公或者酒店等公共WIFI区域,请核实该公共网络是否封禁了22端口,或者换个网络试试看。

● 您电脑自身是否有防火墙屏蔽了22端口。

如果所有网络设置都正确,您仍然无法登录到实例;或者您未改动过任何实例配置,实例负载也正常的情况下,突然无法ssh上去,有可能您的实例当前IP被墙。请您尝试用境外网络 (比如换一台海外的EC2用于ssh,或者设置海外代理) 尝试一下是否能够ssh上去确认此问题。如果被墙,解决方法为 更换当前 IP 地址。 ○ 可以通过stop 实例,然后再次 start 实例 ,来更换 IP 地址。 ○ 申请一个EIP, 然后挂载 EIP 给 EC2。此时 IP 会换为 EIP 的地址。

2、权限相关

2.1 问题描述

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

2.1检查秘钥对是否正确

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

2、如果此项为空,则您无法ssh到该实例,请关闭该实例,重新启动新实例,并且记得下载秘钥。如果您不清楚如何启动实 例,请参考启动虚拟机十分钟教程 如果您已经丢失了该秘钥对,请参考丢失秘钥时如何连接到实例。

无法SSH连接到远程的EC2实例 - 图6

2.2 用户名错误

如果您使用了官方镜像,正确的用户名如下所示:

● 对于 Amazon Linux 2 或 Amazon Linux AMI,用户名称是

● 对于 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格式的(从控制台下载的秘钥即为此格式)。

如果您是用 第三方工具 ssh-keygen 产生的秘钥,默认情况下,它会生成 OpenSSH 的密钥格式。此时报错Private key must begin with "——-BEGIN RSA PRIVATE KEY——-" and end with ——-END RSA PRIVATE KEY——"。解决方法为 使用 ssh-keygen -m PEM 创建秘钥

如果您使用windows机器,利用putty登录,需要先做一个从pem格式到ppk格式的转换,具体操作,请参考在windows上如何利用 putty 登录

2.4 检查秘钥权限

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

此时其他报错提醒语句可能包含:Permissions 0777 for 'my_private_key.pem' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.

2.5 konwn_host相关错误

此情况通常见于切换了EIP等情况,比如EIP曾经挂载在机器A上,用了秘钥A,此时切换了EIP到机器B上,对应的秘钥为秘钥B,这时此 IP 的known_host对应record不匹配。

解决方法为:打开 known_host 文件 (Linux /mac 地 址: ~/.ssh/known_host ) 删除此 IP 的对应 record。