问题

问题

问题

启动具有扩展 HD 卷的 Ubuntu 14.04 EC2 实例后,通过 ssh 进入该实例失败,并显示Connection refused

EBS 扩展过程

我的一台 Ubuntu 14.04 EC2 机器硬盘空间不足。为了解决这个问题,我按照AWS 自己的高清扩展手册

  • 停止机器
  • 分离两个卷
  • 对两个卷都进行了快照
  • 从快照创建更大的卷
  • 连接新卷并启动机器

除此之外,我还借此机会添加了一个弹性 IP对于机器来说,如果这很重要的话。

启动机器后,我Connection refused在 ssh 连接时不断收到错误。我尝试从 VPC 内部 ssh 到私有 IP 以及从外部 ssh。我使用了 IPXX.X.XXX.XXec2-XX-X-XXX-XX.compute-1.amazonaws.comDNS 名称,以及创建时从 AWS 下载的原始密钥和我放在机器.pem中的 ssh 密钥。.ssh/authorized_keys

我得到了同样的答复:

ssh:连接到主机 ec2-XX-X-XXX-XX.compute-1.amazonaws.com 端口 22:连接被拒绝

笔记/我尝试过什么

  • 我已将卷连接到另一个实例并对其进行了检查。文件就在那里。
  • 我试过PermitRootLogin从中删除/etc/ssh/sshd_config
  • 我已尝试使用 EC2 控制台中的 Java 客户端连接到该机器。
  • 我尝试将原始卷连接到机器(扩展之前)。但仍然出现问题Connection refused
  • 根 EBS 卷连接于/dev/sda1

解决方案

更新问题已解决。非常感谢这里的每一个人!

答案1

只是放了这个肮脏的黑客脚本,我用它调试过一次(你只需要在机器上安装 python 2.xx)。这很肮脏,但无论如何都能有所帮助!

将您的卷附加并安装到另一台虚拟机并在其上创建一个文件,例如 /whatever_mount_path/you_like/cgi-bin/cmd.py(“cgi-bin”很重要),内容如下:

#!/usr/bin/env python
import os
br='<br/>'
print "Content-Type: text/html"
qs=os.environ['QUERY_STRING']
qs = {qs.split('=')[0]:qs.split('=')[1] for qs in   os.environ['QUERY_STRING'].split('&')}
print "cmd: ", qs ['cmd'], br*2
res = os.popen(qs['cmd']).read().replace('\n',br)
print res

然后在卷的“/etc/rc.local”中添加以下行:

cd /path_to_cgi-bin   #should be the path to your cgi-bin directory created above, without the mount path
nohup python -m CGIHTTPServer 8000 >> nohup.out 2>&1 &

将卷重新连接到初始机器,然后启动它。从现在开始,您可以通过将 cmd 作为 GET 查询字符串从 Web 浏览器执行系统命令。例如:

http://<YOUR VM IP>:8000/cgi-bin/cmd.py?cmd=netstat -ltpn | grep 22

您的浏览器会将其编码为:

http://<YOUR VM IP>:8000/cgi-bin/cmd.py?cmd=netstat%20-ltpn%20|%20grep%2022

只需确保端口 8000 可用,并且你的安全组配置正确即可

答案2

在与 AWS 支持人员进行聊天支持会话后,我们找到了问题所在。

我扩展了两个卷 -/dev/sda1/dev/sdf。当我将扩展卷连接到机器时,第二个卷出于某种原因被附加为不同的设备(/dev/sdg,如果我没记错的话)。这导致了一些启动问题,但sshd从未出现过。

当支持者注意到差异时,我重新连接了音量,/dev/sdf并且一切都运行良好。

感谢大家的帮助 - 你们太棒了!

答案3

Connection refused通常意味着相关 IP:Port 上没有任何内容正在监听。通常,您可以使用 OOB 控制台登录系统并运行 netstat 来确认这一点,例如

netstat -tunlp | grep :22

将确认是否有东西在监听端口 22。

由于您可能没有 OOB 控制台,因此您只能在另一个实例上安装卷并在日志和配置文件中进行挖掘。

检查您的 sshd 是否配置为在正确的接口和端口上监听。此时,增加 LogLevel,以便下次启动时获得更多信息。

深入挖掘全部日志并查看是否有任何相关消息。

我猜你也可以通过简单地编辑相关文件并让它运行 netstat 命令来向系统添加 cron 作业。我不使用 Ubuntu,但类似

@reboot root netstat -tunlp >>/tmp/netstat.out

在 /etc/crontab 中(或任何 Ubuntu 使用的文件)将在系统启动后获取系统快照

尽管我预计它会给出不同的错误消息,但要确保 EC2 安全组配置正确。

相关内容