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

Posted

技术标签:

【中文标题】运行 EC2 实例突然拒绝 SSH 连接【英文标题】:Running EC2 instance suddenly refuses SSH connection 【发布时间】:2012-12-11 03:49:23 【问题描述】:

我在几天前设置了 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 有没有变化? @Kirk:所有端口的源为 0.0.0.0/0,包括 22。协议:tcp。 您是否从您的实例创建了 AMI?如果是这样,从它运行新的实例。 万一您在配置文件中做错了,现在您在外面无法进入,EC2 中的系统日志将看不到您任何内容。如果它只是要从配置文件中注释掉一些东西(它发生在我之前,我正在更改我的 ssh 并且无法再进入)你可以简单地通过 ftp 连接(我有 vsftpd 和 Adob​​e DW)访问“/”,然后转到 /etc/ssh/ssh_config 或其他您可能想要注释掉您所做的事情并从 EC2 仪表板重新启动系统的地方。如果是关于配置文件,您可能需要 ftp 访问权限。 @kirk 非常感谢!我的 IP 已更改,我已将我的安全组设置为仅接受来自单个 IP。因此,我失去了对 4 个盒子的 SSH 访问权限!现已修复:)。 【参考方案1】:

转到您的 AWS 管理控制台 > 选择实例 > 右键单击​​并选择“获取系统日志” 这将列出出了什么问题。

【讨论】:

没有什么有用的...最后的日志是关于 EBS 卷的,我昨晚正在使用它。【参考方案2】:

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

另外,您可以从 AWS Web 控制台进行 ssh 吗?他们有一个 java 插件可以通过 ssh 进入实例。

【讨论】:

aws Web 控制台也说连接被拒绝。我现在会尝试重新启动。但是除了重启还有别的办法吗?它使用户无法在其中运行的服务和网站... 尝试远程登录到端口 22 上的实例。telnet hostname 22。如果它连接了,那至少会告诉我们 sshd 正在运行,但由于某种原因我们被阻止了,我们可以从那里进行故障排除。 连接被拒绝...我已经重新启动了实例,但仍然无法访问它。此外,现在 apache 和 mysql 也没有运行。帮忙? 这很奇怪。那么telnet也无法连接到22端口吗?您还可以尝试使用 -v 开关进行 ssh 吗?那输出什么? 似乎有些奇怪的问题。没有 ssh,我们真的什么都做不了。我会尝试涉及 AWS 支持【参考方案3】:

在@abhi.gupta200297 的帮助下,我们得以解决它。

问题是/etc/fstab中的错误,应该在fstab成功后启动sshd。但事实并非如此,因此 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

【讨论】:

你能在这里发表一篇博文或评论你用来替换 fstab 的 shell 命令/init 脚本吗?我遇到了同样的问题。 谢舍姆斯先生,你们是救生员。此注释应包含在亚马逊文档中。 我的问题特别是临时存储上的文件系统在机器关闭时被擦除,因此 fstab 无法在启动后挂载它。您的解决方案的想法也非常适合我的问题。 天啊!!很高兴我找到了这个。这同样发生在我身上。必须注释掉,获得访问权限并 fsck 驱动器。【参考方案4】:

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

PermitRootLogin without-passwordUseDNS no

其中一个附加操作是在没有换行符的情况下完成的,因此 sshd_config 文件的尾部如下所示:

PermitRootLogin without-passwordUseDNS noPermitRootLogin without-passwordUseDNS no

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

【讨论】:

每次实例通过 /etc/rc.local 文件启动(或重启)时都会添加这些行。为防止这种情况反复发生,您还需要注释掉 /etc/rc.local 文件中的 3 行相关行。这将永远解决问题。【参考方案5】:

对于那些因为重启后无法通过 SSH 连接到 EC2 实例而看到这篇文章的人,this is cross-posted 到 a similar question at serverfault:

来自the AWS Developer Forum post on this topic:

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

修复后,只需卸载卷、分离、重新附加到 你的另一个实例并再次启动它。

让我们通过指向 AWS 文档的链接来分解它:

    Stop the broken instance 并分离 EBS(根)卷,方法是进入 EC2 管理控制台,单击“弹性块存储”>“卷”,右键单击与您停止的实例关联的卷。 在与损坏的实例相同的区域和相同的操作系统中启动一个新实例,然后attach the original EBS root volume as a secondary volume to your new instance。下面第 4 步中的命令假设您将卷安装到名为“data”的文件夹中。 一旦你mounted the broken volume somewhere on the other instance, 通过发出以下命令检查“/etc/sshd_config”文件中的重复条目: cd /etc/ssh sudo nano sshd_config ctrl-v 很多次才能到文件底部 ctrl-k 在底部提到“PermitRootLogin without-password”和“UseDNS no”的所有行 ctrl-xY 保存并退出编辑的文件 @Telegard points out (in his comment) 我们只修复了症状。我们可以通过注释掉“/etc/rc.local”文件中的3个相关行来修复原因。所以: cd /etc sudo nano rc.local 查找“PermitRootLogin...”行并将其删除 ctrl-xY 保存并退出编辑的文件 修复后,只需unmount the volume, 通过进入 EC2 管理控制台,单击“Elastic Block Store”>“卷”进行分离,右键单击与您停止的实例关联的卷, reattach to your other instance 和 fire it back up again。

【讨论】:

这是关于这个问题的最有用的帖子!非常感谢。我会添加它以使该卷成为 Red HaT 下的 /dev/sda1 的根卷名称。 @Sych:乐于助人。卷附件文档中有一个部分提供了有关根卷命名的指导:docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 在我的情况下,/var/empty/sshd 的所有权错误。它应该是 root:root,但它是别的东西。不知道为什么会改变。【参考方案6】:

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

【讨论】:

【参考方案7】:

有同样的问题,但系统日志有这个:

启动 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 访问。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

在我的情况下,卷空间不足并且服务无法启动。我使用AWS tutorial(来自 Sherzod 的帖子)将它安装在一个好的 EC2 实例上并清理它并从启动中删除服务,然后重新安装它并验证一切是否正常。

【讨论】:

【参考方案10】:

对我来说,是我的 IP 发生了变化。希望这可以帮助某人。导航到安全组并在入站规则中更新您的“我的 IP”。

【讨论】:

【参考方案11】:

我遇到了同样的问题,因为权限被拒绝错误而无法连接到 aws 实例。

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

步骤:

    停止实例 操作 > 实例设置 > 编辑用户元

    输入以下脚本并保存

**内容类型:多部分/混合;边界=“//” MIME版本:1.0 --// 内容类型:文本/云配置; charset="us-ascii" MIME 版本:1.0 内容传输编码:7 位内容处置:附件;文件名="云配置.txt" #cloud-config cloud_final_modules:

[脚本用户,始终] - // 内容类型: 文本/x-shellscript; charset="us-ascii" MIME 版本:1.0 内容传输编码:7 位内容处置:附件;文件名="用户数据.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 --//**
    保存并使用正确的 pem 密钥连接到实例。

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

【讨论】:

以上是关于运行 EC2 实例突然拒绝 SSH 连接的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 SSH 连接到 EC2:权限被拒绝(公钥)

SSH 到 EC2 实例期间权限被拒绝(公钥)[重复]

尝试从其他计算机访问 ec2 时 ssh 权限被拒绝(公钥)

即使使用新的 EC2 实例,AWS SSH 登录仍会继续失败 [权限被拒绝 (PublicKey)]

Amazon EC2 实例“权限被拒绝(公钥)”

ssh - Amazon EC2 上的权限被拒绝(公钥)