【问题标题】:How can I make an AWS EC2 allow ssh connections regardless of the EBS in /dev/sda1?无论 /dev/sda1 中的 EBS 如何,如何使 AWS EC2 允许 ssh 连接?
【发布时间】:2021-09-16 04:07:14
【问题描述】:

我有一个应用程序已经在 EC2 上成功运行了几年。系统为 Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1032-aws x86_64)。

这是一个小而简单的应用程序,流量低。直到今天,我才对服务器本身进行任何更改。我想处理X packages can be updated. 消息,所以我跑了:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

然后我跑了sudo reboot。重新启动后,应用程序运行完美。我可以通过公共 URL 正常访问它并查看内容,包括 db(直接在服务器上的 postgresql)数据,没有任何问题或意外。

但是,当我再次尝试通过 ssh 连接到机器时,我做不到。我做ssh -i "key.pem" -vvv ubuntu@<IP> 并得到:

debug1: Connecting to <IP> [<IP>] port 22.
debug1: connect to address <IP> port 22: Operation timed out
ssh: connect to host <IP> port 22: Operation timed out

没有对安全组进行任何更改。另外,这是一个很小的项目,我从来没有设置过 EC2 Instance Connect 或类似的东西。

我曾想过启动一个新的 EC2 并只是切换 EBS 卷,认为 EBS 会带来应用程序和数据,而实例本身将具有配置和权限。

我对此不太了解(显然),并且很惊讶地得知 EBS 卷本身似乎是问题所在,并且掌握了所有的牌。

我可以在两个 EC2 实例之间来回切换 EBS 卷。在任何给定时间,在/dev/sda1 附加了最新(因此是空白)EBS 卷的任何一个都允许 SSH,但肯定不会运行该应用程序。而且,反之亦然:无论哪个 EC2 实例具有原始 EBS 卷,都可以完美运行应用程序,但让我无法访问 ssh。

在这种情况下,问题是:如何让其中一个 EC2 实例绕过此 EBS 问题并自行决定是否允许我使用 ssh 连接?

或者:我在这里遗漏的明显和/或愚蠢的事情是什么?

PS:我确实有弹性 IP 来解决所有这些问题,所以 DNS 似乎不是问题的根源。

【问题讨论】:

  • 您是否一次只有 一个 EBS 卷附加到一个实例?如果是这样,当您说“最新的(因此是空白的)EBS 卷”时,它并不是真正的空白——它包含操作系统。阻止访问的“旧”卷出现问题,例如激活防火墙或更改文件权限。您可以尝试启动好卷,然后将“坏”卷附加为附加卷。这将使您可以访问磁盘以检查 /home/ubuntu/.ssh/authorized_keys 文件(检查内容以及文件权限)。
  • 抱歉让您等了这么久才回来签到。我按照您的建议做了,学习非常有趣!谢谢!我能够从新的启动,然后连接旧的并检查一下。关键的东西在权限和内容方面看起来是一样的。我还尝试了其他一些文件,但没有发现任何实际解决问题的方法。如果是防火墙,我在哪里查看和比较配置等一些常见的地方?
  • 抱歉,这超出了我的知识范围。这可能会有所帮助:Security - Firewall | Ubuntu
  • 确实有帮助!再次感谢!通过阅读建议的文章,我能够理解我可以将 ufw 行添加到我拥有的现有重启脚本中,这可能是确保服务器启用 ssh 的一种方法。成功了!
  • 我创建了一个答案来解释这一切。如果您有能力/有兴趣,请随时查看并提供反馈和/或更改等。

标签: linux amazon-web-services ubuntu amazon-ec2 ssh


【解决方案1】:

在 John Rotenstein 的帮助下,我得以解决这个问题。

以下是核心步骤:

第 1 阶段 - 附加和挂载附加卷

根据 John 的评论,可以从“好”卷启动实例,然后附加并安装“坏”卷。这使我能够浏览文件并查找问题。

AWS 面板

  1. 使用 /dev/sda1 作为名称将卷以 root 附加到 EC2 实例
  2. 启动 EC2 实例
  3. 在实例启动后附加另一个卷

终端

  1. SSH 进入服务器

  2. 查看根卷信息:

~$ df -hT /dev/xvda1
  1. 检查已安装的卷:
~$ lsblk
  1. 查看其他卷信息:
~$ df -hT /dev/xvdf1
  1. 切换到root用户:
~$ sudo su -
  1. 创建一个目录作为挂载路径:
~$ mkdir /addvol
  1. 将附加卷挂载到路径:
~$ mount /dev/xvdf1 /addvol
  1. 检查其他卷内容:
~$ ls -la /addvol/home/ubuntu

现在我可以查看和导航附加卷的内容、查找配置文件、查看授权密钥、文件权限等。

This article from AWS 帮了我很多忙。

终于到了这一步,我没有发现密钥或权限等有任何问题。约翰指给我this article dealing with Ubuntu's firewall things

第 2 阶段 - 处理防火墙

我从the article 运行了一些命令并试图了解它们是如何工作的。

一旦我掌握了一点,我决定使用卷上现有的重启脚本来确保防火墙可以通过 SSH 连接。

我更新了现有的自定义重启脚本,添加了以下几行:

sudo ufw allow ssh
sudo ufw allow 22
sudo ufw disable
sudo ufw --force enable

基本上它调用两次允许 ssh,一次按名称,然后按端口。我是这个东西的新手,只是为了矫枉过正。

然后它会禁用并启用防火墙,以确保它在配置了这些新闻内容的情况下运行。

因为sudo ufw enable需要交互,所以我选择使用sudo ufw --force enable

第 3 阶段 - 测试和使用它!

脚本更新后,我退出了服务器。

AWS 面板:

  1. 停止 EC2 实例
  2. 从实例中分离一个卷
  3. 从实例中分离另一个卷
  4. 重新附加“坏”卷,这次以 root 身份进行
  5. 启动 EC2 实例

终端:

  1. SSH 进入实例 - 瞧!

注意:在真正 100% 工作之前,我的电脑抱怨 known_hosts 的事情。服务器密钥必须在更新/升级和/或所有卷更改之后发生更改。我认为必须确认主机没什么大不了的,所以我通常只是清除本地.ssh/known_hosts 文件中的所有内容。如果您更喜欢具体,您可以在那里专门找到服务器的信息,然后只删除相关行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多