问题
启动具有扩展 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.XX
和ec2-XX-X-XXX-XX.compute-1.amazonaws.com
DNS 名称,以及创建时从 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 安全组配置正确。