EC2实例突然拒绝SSH连接

22

几天前我设置了EC2实例,昨晚我甚至可以轻松通过SSH连接到它。但是今天早上,我无法通过SSH连接到它。安全组中已经打开了22端口,并且自昨晚以来我没有更改过任何内容。

错误:

ssh: connect to host [ip address] port 22: Connection refused

最近我遇到了类似的问题,但是我不知道为什么会出现这种情况,所以我不得不创建一个新实例,重新设置它,并将所有 EBS 存储连接和配置到新实例上。花了我几个小时... 现在又再次发生了。在之前的那个实例中,我安装了 denyhost,可能阻止了我的访问,但在当前的实例中,只运行了 apache2 和 mysql。

目前的实例已经运行了16小时,所以我不认为它是因为没有完成引导而出现的...同时,端口22对所有来源(0.0.0.0/0)开放,使用tcp协议。

有什么想法吗?

谢谢。


您是否已经设置了实例上的SSH安全性,以允许所有IP或仅限您自己的IP?如果只有您自己的IP,请问您的IP地址是否发生了更改? - Kirk
@Kirk:源地址为0.0.0.0/0,包括22端口。协议:tcp。 - Sherzod
你是否已经从实例创建了AMI?如果是,可以从中运行新的实例。 - Roman Newaza
如果您在配置文件中做错了什么,现在无法进入系统,EC2的系统日志将不会显示任何信息。如果只是要从配置文件中注释掉某些内容(这在我之前发生过,当时我正在更改我的ssh,结果无法再登录),您可以通过具有对“/”访问权限的ftp连接(我使用vsftpd和Adobe DW)并转到/ etc / ssh / ssh_config或其他您可能想要注释掉已完成的事情的地方,并从EC2仪表板重新启动系统。如果涉及到配置文件,则可能需要FTP访问。 - Maziyar
1
@kirk 非常感谢!我的IP地址已更改,而且我已将安全组设置为仅接受来自单个IP的访问。由于此原因,我失去了4个框的SSH访问权限!现在问题解决了:)。 - CodeManiak
11个回答

30

在@abhi.gupta200297的帮助下,我们成功解决了该问题。

问题出在/etc/fstab文件中出现错误,sshd应该在fstab成功后启动。但是这并没有发生,导致sshd无法启动,这就是为什么它拒绝连接的原因。解决方法是创建一个临时实例,从原始实例挂载根EBS,并注释掉fstab中的部分内容,然后你会惊奇地发现,它让我重新连接上了。而且为了以后避免问题,我停止使用 fstab 并创建了一堆shell命令将EBS卷挂载到目录中,并将其添加到 /etc/init.d/ebs-init-mount文件中,然后运行 update-rc.d ebs-init-mount defaults 来初始化文件,现在我不再遇到锁定ssh的问题了。

更新4/23/2015

亚马逊团队创建了一个类似问题的视频教程,并展示了如何使用此方法进行调试:https://www.youtube.com/watch?v=_P29ZHu_feU


1
你能否在博客文章或评论中分享一下你用来替换fstab的shell命令/初始化脚本?我也遇到了同样的问题。 - S-K'
您好,shershams先生,您是救星啊。这个注释应该包含在亚马逊文档中。 - s29
我的问题是临时存储上的文件系统在机器关闭时被清除,因此fstab在启动后无法挂载它。你的解决方案的想法也非常适合我的问题。 - asaad
哦,太好了,我找到了这个。我也遇到了同样的问题。不得不注释掉,获取访问权限并对驱动器进行fsck操作。 - Sree

7

看起来sshd可能由于某些原因停止了。实例是否使用EBS备份?如果是这种情况,请尝试关闭并重新启动它。这应该可以解决问题。

另外,您能否从AWS Web控制台进行SSH连接?他们有一个java插件可以用来ssh到实例。


AWS Web控制台也显示连接被拒绝。我现在会尝试重新启动。但是除了重新启动之外,还有其他方法吗?这会导致那里运行的服务和网站对用户不可用... - Sherzod
尝试在22端口上对实例进行telnet。 telnet主机名22。如果连接成功,至少可以告诉我们sshd正在运行,但由于某些原因被阻止了,我们可以从那里进行故障排除。 - abhi.gupta200297
连接被拒绝...我已经重新启动了实例,但仍无法访问它。此外,Apache和MySQL也未运行。能帮忙吗? - Sherzod
这很奇怪。所以 telnet 也无法连接到 22 端口?您可以尝试使用 -v 开关进行 ssh 连接吗?输出是什么? - abhi.gupta200297
似乎出现了一些奇怪的问题。没有ssh,我们真的无法做任何事情。我会尝试联系AWS支持。 - abhi.gupta200297
让我们在聊天室里继续这个讨论 - abhi.gupta200297

6

对于那些因重新启动后无法通过SSH登录EC2实例而遇到此帖子的人,此处有一篇类似的问题serverfault上

来自AWS开发者论坛关于此主题的帖子

尝试停止损坏的实例,卸载EBS卷,并将其作为辅助卷附加到另一个实例。一旦您在其他实例上的某个位置挂载了损坏的卷,请检查/etc/sshd_config文件(靠近底部)。我有几个RHEL实例,其中Yum在底部插入了重复行,导致sshd由于语法错误而在启动时失败。

修复后,只需卸载该卷,分离,重新附加到其他实例并再次启动即可。

让我们拆分这个内容,并链接到AWS文档:

  1. 进入EC2管理控制台,单击“弹性块存储”>“卷”,右键单击与停止实例相关联的卷,停止损坏的实例并分离EBS(根)卷。
  2. 在同一地区且与损坏实例相同的操作系统中启动新实例,然后将原始EBS根卷作为辅助卷附加到您的新实例上。步骤4中的命令假定您将该卷挂载到名为“data”的文件夹中。
  3. 一旦您在其他实例上某个位置挂载了损坏的卷,
  4. 通过发出以下命令检查“/etc/sshd_config”文件中的重复条目:
    • cd /etc/ssh
    • sudo nano sshd_config
    • ctrl-v 多次以到达文件底部
    • ctrl-k 删除底部提到的所有“PermitRootLogin without-password”和“UseDNS no”行
    • ctrl-xY 保存并退出编辑文件
  5. @Telegard 在他的评论中指出我们只是修复了症状。我们可以通过在“/etc/rc.local”文件中注释掉3个相关行来修复原因。所以:
    • cd /etc
    • sudo nano rc.local
    • 查找“PermitRootLogin...”行并删除它们
    • ctrl-xY 保存并退出编辑文件
  6. 修复后,只需卸载该卷,
  7. 进入EC2管理控制台,单击“弹性块存储”>“卷”,右键单击与停止实例相关联的卷,重新附加到您的其他实例
  8. 再次启动它

这是关于这个问题最有用的帖子!非常感谢。 我还想补充一点,在 Red Hat 下,如果要将卷命名为根卷,请将其命名为 /dev/sda1。 - Sych
@Sych:乐意提供帮助。在卷附加文档中,有一个章节提供关于根卷命名的指导:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-attaching-volume.html#device_naming - Jeromy French
在我的情况下,/var/empty/sshd 的所有权设置错误。它应该是root:root,但却是其他东西。我不知道为什么会改变。 - cucu8

4
这在我的Red Hat EC2实例上发生了,因为每次启动实例时,这两行代码会自动添加到/etc/ssh/sshd_config文件的末尾:

PermitRootLogin without-password
UseDNS no

其中一个操作是没有换行符的,所以sshd_config文件的末尾看起来像这样:

PermitRootLogin without-password
UseDNS noPermitRootLogin without-password
UseDNS no

这导致sshd无法在下一次启动时启动。我认为这是由此处报告的错误引起的:https://bugzilla.redhat.com/show_bug.cgi?id=956531 解决方法是删除sshd_config文件底部的所有重复条目,并在末尾添加额外的换行符。

5
每次实例启动(或重新启动)时,这些行都会由/etc/rc.local文件添加。为了防止这种情况一遍又一遍地发生,您还需要注释掉/etc/rc.local文件中的3个相关行。这样就可以永久解决问题了。 - Telegard

1

我遇到了相同的问题,但系统日志中有以下内容:

Starting sshd: /var/empty/sshd 必须由 root 拥有,而不能是组或全局可写的。 [FAILED]

按照上面描述的步骤分离卷并附加到可连接的实例。然后使用以下命令:

sudo chmod 755 /var/empty/sshd

sudo chown root:root /var/empty/sshd

(https://support.microsoft.com/en-us/help/4092816/ssh-fails-because-var-empty-sshd-is-not-owned-by-root-and-is-not-group)

然后将其从原始EC2实例中分离并重新连接,现在可以通过ssh访问。


1

前往您的AWS管理控制台 > 选择实例 > 右键单击并选择“获取系统日志” 这将列出发生了什么错误。


3
那里没有有用的东西...最近的记录是关于EBS卷,这是我昨晚正在使用的。 - Sherzod

0

我曾经遇到过同样的问题,无法连接到 AWS 实例,出现了权限被拒绝的错误。

我通过屏幕共享呼叫与 AWS 团队联系,并且他们指导我使用以下用户元脚本更改 AWS 实例上的文件夹权限。

步骤:

  1. 停止实例
  2. 操作 > 实例设置 > 编辑用户元数据

enter image description here

  1. 输入以下脚本并保存

**Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules:

  • [scripts-user, always] --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash chown root:root /home chmod 755 /home chmod 700 /home/ubuntu chmod 700 /home/ubuntu/.ssh chmod 600 /home/ubuntu/.ssh/authorized_keys ls -ld /home /home/ubuntu /home/ubuntu/.ssh /home/ubuntu/.ssh/authorized_keys chown ubuntu:ubuntu /home/ubuntu -R --//**
  1. 保存并使用正确的pem密钥连接实例。

解决了我的问题 *将ubuntu更改为您的实例用户名


0

我因为分离EBS但忘记修改/etc/fstab而遇到了类似的ssh锁定问题


0
对我来说,问题是我的IP地址已更改。希望这能帮助到某些人。请导航至安全组并在入站规则中更新您的“我的IP”信息。

0
在我的情况下,存储空间已满,某个服务无法启动。我使用AWS教程(来自Sherzod的帖子)将其挂载到一个良好的EC2实例上进行清理,并在重新挂载和验证事物正常之前从启动项中删除该服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接