强制 AWS EC2 实例对本地流量使用私有 IP

Force AWS EC2 Instance to Use Private IP for Local Traffic

如果这个问题不适合这个社区,请原谅我;我找不到更合适的,Whosebug 总是在我需要的时候出现!

我正在尝试使用 Amazon EC2 设置堡垒主机。我希望连接到我的任何实例的唯一方法是来自这个堡垒实例的 SSH。包含 bastion 的 public 子网使用 CIDR 块 10.0.128.0/17,包含我的其他实例的子网使用 CIDR 块 10.0.0.0/17。我有网络 ACL 和安全组规则,允许 SSH 从堡垒传出到另一个子网,并允许 SSH 从堡垒传到另一个子网。一切都应该工作。不幸的是,我的堡垒正在尝试使用它们的 public IP 与其他实例通信,这当然不在 10.0.0.0/17 块中,因此流量被阻止。如何确保我的堡垒在与私有子网中的其他实例通信时使用私有 IP 地址?这似乎应该是 VPC 中本地流量的默认行为,但显然不是!

编辑:

我遗漏了一些关键信息。给我带来麻烦的 "private" 实例实际上是 public;它是一个 Wordpress 网络服务器,具有 public IP 52.14.20.167(请不要向其发送垃圾邮件,哈哈)和自定义 www DNS 名称。然而,虽然我希望我的堡垒能够使用该 DNS 名称通过 SSH 连接到它,但我仍然希望所有 SSH 流量都是本地的,这样我的安全组和网络 ACL 就可以非常严格。根据this AWS doc:

We resolve a public DNS hostname to the public IPv4 address of the instance outside the network of the instance, and to the private IPv4 address of the instance from within the network of the instance.

但是,我认为此规则仅适用于 AWS 提供的(IP-like)public DNS 名称。我的 custom DNS 始终解析为 public IP,而不是私有 IP,如下面堡垒子网的流日志所示。 10.0.128.6 是堡垒,52.14.20.167 是网络服务器。知道 190.14. 地址是什么。所以我更有教养的问题是,如何将自定义 DNS 名称解析为同一 VPC 中堡垒主机和第二个实例的私有 IP?

10.0.128.6  52.14.20.167    56008   22  6   7   420 1485465879  1485465996  REJECT  OK
190.173.143.165 10.0.128.6  27754   22  6   1   40  1485466241  1485466296  REJECT  OK
10.0.128.6  52.14.20.167    56012   22  6   7   420 1485466903  1485467016  REJECT  OK
190.13.10.206   10.0.128.6  28583   22  6   1   40  1485467140  1485467197  REJECT  OK
10.0.128.6  52.14.20.167    56014   22  6   7   420 1485467437  1485467557  REJECT  OK
14.158.51.244   10.0.128.6  55532   22  6   1   44  1485467500  1485467557  REJECT  OK

在与 OP 反复 question/answer 之后,我们确定问题的根本原因之一是使用自定义 DNS 名称。

用户将访问堡垒主机,并从那里将 自定义 DNS 名称解析为 a public IP 地址 对于有问题的 EC2 实例。这就是来自堡垒主机的流量未使用 EC2 实例的私有 IP 地址的原因。使用 EC2 实例的 private IP 地址的关键是从 中解析该实例的 AWS-assigned public DNS 主机名] AWS。正如 AWS 文档中的 OP 指出的那样,AWS-assigned public DNS 主机名将解析为来自 AWS 外部 的 public IP 地址,但会从 AWS 的 inside 解析到 private IP 地址。因此,关键是让用户使用 AWS-assigned public DNS 主机名。

保持使用自定义 DNS 主机名, 仍然从堡垒主机解析为 EC2 实例的私有 IP 地址的一种方法是使自定义DNS 名称是 CNAME 记录(而不是 A 记录),它指向 AWS-assigned public DNS 名称。是的,这需要在 new/different EC2 实例出现时更新该 DNS 记录,但无论如何都需要这样的更新,以便 A 记录指向新的 public IP 地址。通过使用 CNAME,事情应该按预期工作。

希望对您有所帮助!

为您的 ec2 实例设置 DNS 时,您需要使用 CNAME 记录而不是 A 记录。假设您有一个带有 url my-site.com 的 www 站点。如果你把 DNS 记录 my-site.com A your_public_ip example my-site.com A 52.14.20.167 如果您尝试从 VPC 内部的任何服务器访问 url,您的流量将超出 aws VPC。

为避免这种情况,您需要将该记录更改为 my-site.com CNAME your_EC2_instance_AWS_DNS_address

示例: my-site.com CNAME ec2-XX-YY-ZZZ-17.eu-west-1.compute.amazonaws.com

有了这个,如果你在 AWS 之外访问你的 www 服务,你将得到你的 public ip 解析,并且在 AWS VPC 内,你将获得你的服务的私有地址,流量将留在 AWS VPC 内。