无法与我的 EC2 实例建立互联网连接 [使用 terraform 部署并为 ACL、安全组、Internet GW 打开 80 个 http 端口]

Can't establish internet connection to my EC2 instance [deployed with terraform and 80 http port opened for ACL, Security Group, Internet GW]

我已经使用 terraform aws 提供程序创建了一个 EC2 实例。实例是免费层 t2.micro.

的 Ubuntu 服务器

尽管我已经遵循了所有关于网络 ACL、安全组、路由 tables、互联网网关的亚马逊指南,但我仍然无法执行诸如

之类的简单命令

sudo apt-get update

当我从 ssh 端口 (22) 登录我的实例并执行上面的 sudo 命令时,我收到这条消息:

0% [Connecting to us-east-2.ec2.archive.ubuntu.com (52.15.159.198)]

我关注的资源:

  1. https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html?icmpid=docs_ec2_console#ec2-instance-connect-setup-security-group

  2. https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#vpc-igw-internet-access

  3. https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#nacl-rules

  4. https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules

还有很多问题。

请注意,我使用 ssh 连接到端口 22 并 ping ec2 的 public ip实例。我还创建了一个路由 table,它有一个连接到网络接口的互联网网关。

网络规则:

安全组规则:

路由 table 附加到我的实例

我唯一担心的是我使用的 vpc 有一个主 acl 网络(如默认),这不是我使用的那个(上面截图中有很多规则的那个)。但是,主路由 table 引导到正确的子网,该子网也附加到正确的 acl 网络。我猜这是因为在 terraform 中我使用 aws_network_acl 资源而不是 aws_default_network_acl.

因此,我唯一担心的可能是我的 vpc 连接了一个错误的 acl 网络,但是即使那个 acl 网络也允许所有入站-出站流量。所以访问 http 应该不会造成问题。由于我无法从我的 ec2 实例下载任何东西,我相信其他原因是我问题的根源。

提前感谢任何帮助。

Terraform code

安全组是有状态的。这意味着如果在一个方向上允许流量,则允许 return 响应返回。例如,您可以为入站流量打开端口 80,即使安全组中没有出站规则,Web 服务器也可以响应请求。

相比之下,网络访问控制列表 (NACL) 是无状态的。这意味着在一个方向上发送请求不会自动允许另一个方向的响应。

当向 Internet 向 Web 服务器发出 Web 请求时,它会转到远程服务器上的端口 80。但是,return 流量 不是 端口 80。相反,您对远程端口 80 的请求来自随机端口 在你自己的电脑上。因此,NACL 必须允许 return 流量到该随机端口。这可能是阻止对您下载软件的 Web 请求的响应的原因。

我以前觉得这个概念很难理解。我一直认为 端口 80 的请求必须 来自 我的端口 80。但事实并非如此。对 Internet 的 Web 请求将 永远不会 来自端口 80,因为该端口与该计算机上的 Web 服务器相关联。这实际上是有道理的,因为例如,假设计算机 A 在 Web 浏览器中打开两个选项卡并向 google.com:80facebook.com:80 发送请求。来自每个服务器的 return 流量需要返回到不同的端口,以便浏览器知道在每个选项卡中显示哪个响应。

是的,打开所有 NACL 端口是安全的。在传统网络中,安全性仅在 个子网之间的路由器中实施。这种安全性反映在 NACL 中。但是,云通过使用安全组提供了额外的安全层,这些安全组在每个资源上单独充当防火墙。这比传统的网络安全更强大。因此,在 NACL 级别允许所有流量是很正常的,除非您有非常具体的安全需求,例如创建 DMZ 或阻止特定类型的流量进入网络。