EC2 实例无法相互访问

EC2 实例无法相互访问

我在同一个可用区和同一个账户中创建了两个 EC2 实例。它们使用不同的安全组。我希望实例 A 只接受来自实例 B 的某个端口的连接。

我不相信这些实例是 VPC,但不知道如何确认。我无法更改安全组,这让我认为它们不是 VPC。

在安全组中,实例 AI 为端口添加了一条规则,并使用实例 B 的公网 IP /32 作为源。然后我尝试使用实例 A 的公网 IP 从实例 B 进行连接,但连接尝试立即失败。

我尝试对每个实例的私有 IP 执行相同的步骤。我遗漏了什么?

这里有一篇文章回答了类似的问题,但涉及 VPC:无法连接到 VPC(Amazon AWS)中的 EC2 实例

两个实例具有相同的 VPC ID 和子网 ID。

我还尝试将源设置为实例 B 的安全组,但也没有用。

我正在用 mysql 尝试这个。在实例 B 上运行的 mysql 客户端立即失败并出现以下错误:

错误 2003 (HY000):无法连接到‘54.xx.xx.xx’上的 MySQL 服务器 (113)

为了检查 mysqld 设置是否存在问题,我尝试使用 ICMP Echo Reply 进行相同操作,但也没有起作用。

编辑 感谢最初的回答,我能够确认这两个实例正在 VPC 中运行(通过转到 VPC 控制台)。因此,我的问题与链接的文章非常相似。但是,在这种情况下,问题是实例不是默认实例,因此没有创建正确的路由和子网。以下是我的 VPC 设置方式:VPC 是默认的,并且具有与之关联的路由表。路由表隐式与与 VPC 关联的子网相关联。路由表中只有一条路由,目标是“本地”。

据我了解,这些都是默认创建的,文档应该允许两个实例相互连接。我还遗漏了什么?

答案1

我在 AWS 技术支持的帮助下解决了这个问题。以下是为像我这样的新手提供的信息:

问题是 iptables 在实例 B 上运行,不允许任何流量。我了解到 EC2 实例有两个级别的防火墙:安全组(在 AWS 控制台上管理)和 iptables(在主机上管理)。使用 iptables 的原因如下: https://wincent.com/wiki/Using_iptables_on_EC2_instances

大多数情况下,在运行 Amazon EC2 时,您无需担心使用主机级防火墙(如 iptables),因为 Amazon 允许您在“安全组”内运行实例,这实际上是一种防火墙策略,您可以使用它来指定应允许哪些外部连接到达实例。但是,这是一种“白名单”方法,不能直接将其用于正在运行的实例的“黑名单”目的。

就我而言,我不需要主机级防火墙,因此关闭了 iptables:

sudo service chkconfig stop
sudo chkconfig iptables off

以下是我得到的与该问题的评论相关的一些结果:

  • 连接私有 IP 成功
  • 使用私有 DNS 名称连接成功
  • 连接公共 IP 成功
  • 与公共 EIP 连接成功
  • 与公共 DNS 连接有效,但正如 Chad Smith 在他的回答中所说,DNS 返回私人的此名称的 IP

在我另一个实例上,此方法奏效的原因是,我在该实例中使用的映像未运行 iptables——每个映像都不同。我在本例中使用的映像使用 iptables 来禁止除 SSH 之外的所有连接。

答案2

有点离题,但这是该问题的唯一搜索结果。

我们遇到了类似的问题,但我们现有的实例重新启动后突然无法通信。原来是安全组中的规则太多了 - 只需删除一些允许的通信即可恢复。它在重新启动之前仍在运行,因为规则会随着时间的推移通过自动调用 API 而添加。

希望这对将来的某人有所帮助。

答案3

如果您无法修改正在运行的实例的安全设置,则它们将不会启动到 VPC 中。

即使对于不在 VPC 中的实例,EC2 也会将它们启动到互连的私有网络中。因此,您应该指定私有 IP 地址实例 A 的安全组中的实例 B。

答案4

AWS 为 VPC 和非 VPC 实例设置了单独的安全组,因此您需要以某种方式确定您是否在 VPC 上(只需转到 VPC 控制台并检查您是否在那里看到您的实例),然后确保您创建的安全组处于相同的上下文中。然后,您可以将安全组 A 添加到安全组 B 作为受信任,并执行相反的操作。这样,您只需允许两个主机在单个端口上的所有流量(我认为这是您的意图)。

相关内容