运行EC2实例突然拒绝SSH连接

时间:2012-12-24 22:29:38

标签: apache ssh amazon-web-services amazon-ec2 connection

几天前我已经设置了EC2实例,甚至昨晚我也能够没问题地连接到它。今天早上,我不能说。端口22已在安全组中打开,自昨晚以来我没有改变任何内容。

错误:

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

我最近有类似的问题,我无法弄清楚它为什么会发生,所以我不得不创建一个新实例,再次设置它,并连接并配置所有EBS存储到新的。花了我几个小时......现在又发生了。在前一个中,我安装了denyhost,这可能阻止了我,但在当前版本中,只有apache2和mysql正在运行。

当前实例已经持续了16个小时,所以我认为这不是因为它没有完成启动...而且,端口22对所有源(0.0.0.0/0)开放并且正在使用tcp协议。

有什么想法吗?

感谢。

9 个答案:

答案 0 :(得分:26)

在@ 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的问题。

2015年4月23日更新

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

答案 1 :(得分:7)

看起来sshd可能因某种原因而停止了。实例EBS是否受到支持?如果是这种情况,请尝试将其关闭并重新启动。这应该可以解决问题。

此外,您是否能够从AWS Web控制台进行ssh?他们有一个java插件来ssh进入实例。

答案 2 :(得分:6)

对于那些遇到此帖子的人,因为您在重新启动后无法通过SSH连接到您的EC2实例,this is cross-posteda similar question at serverfault

来自the AWS Developer Forum post on this topic

  

尝试停止损坏的实例,分离EBS卷,然后   将其作为辅助卷附加到另一个实例。一旦你有了   将损坏的卷安装在另一个实例的某处,检查   / etc / sshd_config文件(靠近底部)。我有一些RHEL实例   Yum在sshd_config中插入了重复的行   由于语法错误导致sshd在启动时失败的底部。

     

一旦你修好它,只需卸下音量,分离,重新连接即可   你的另一个实例并重新启动它。

让我们通过指向AWS文档的链接来解决这个问题:

  1. Stop the broken instance并通过进入EC2管理控制台,点击" Elastic Block Store"来分离EBS(根)卷。 > "卷",右键单击与您停止的实例关联的卷。
  2. 在与损坏的实例相同的区域和相同的操作系统中启动新的实例,然后attach the original EBS root volume as a secondary volume to your new instance。下面步骤4中的命令假定您将卷装入名为" data"。
  3. 的文件夹中
  4. 一旦你mounted the broken volume somewhere on the other instance
  5. 检查" / etc / sshd_config"通过发出以下命令来获取重复条目的文件:
    • cd /etc/ssh
    • sudo nano sshd_config
    • ctrl-v多次到达文件的底部
    • ctrl-k底部的所有行提及" PermitRootLogin无密码"和" UseDNS no"
    • ctrl-xY保存并退出已修改的文件
  6. @Telegard points out (in his comment)我们只修复了症状。我们可以通过注释" /etc/rc.local"中的3个相关行来修复原因。文件。所以:
    • cd /etc
    • sudo nano rc.local
    • 寻找" PermitRootLogin ......"行并删除它们
    • ctrl-xY保存并退出已修改的文件
  7. 一旦您修复了它,只需unmount the volume
  8. 进入EC2管理控制台,点击" Elastic Block Store" > "卷",右键单击与您停止的实例关联的卷
  9. reattach to your other instance
  10. fire it back up again

答案 3 :(得分:4)

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

PermitRootLogin无密码
使用DNS没有

其中一个追加操作没有换行,所以sshd_config文件的尾部看起来像:

PermitRootLogin without-password
UseDNS noPermitRootLogin without-password
UseDNS no

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

答案 4 :(得分:1)

转到您的AWS管理控制台>选择实例>右键单击并选择“获取系统日志” 这将列出出错的地方。

答案 5 :(得分:0)

我通过分离EBS锁定了类似的ssh,但忘了修改/ etc / fstab

答案 6 :(得分:0)

有同样的问题,但是系统日志中有此内容:

以sshd开头:/ var / empty / sshd必须由root拥有,而不是组或世界可写。 [失败]

使用与上述相同的步骤分离卷并连接到可连接实例。然后使用:

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进行访问。

答案 7 :(得分:0)

如果您的ubuntu有systemd,则可以编辑/lib/systemd/system/local-fs.target并注释掉最后两行:

#OnFailure=emergency.target
#OnFailureJobMode=replace-irreversibly

我还没有对此进行广泛的测试,也不知道是否存在任何风险或副作用,但是到目前为止,它仍然具有吸引力。它会安装根卷和所有其他卷(显然,那些配置错误的卷除外),然后继续启动过程,直到SSH启动为止,因此您可以连接到实例并修复错误的fstab条目。

答案 8 :(得分:0)

在我的情况下,卷空间不足,服务无法启动。我使用了AWS tutorial(摘自Sherzod的文章)将其安装在良好的EC2实例上,在重新安装并验证一切正常之前将其清理并从启动中删除该服务。