尽管按照规则配置了NAT、Internet网关,AWS VPC仍无法访问Internet

Jor*_*usS 5 nat amazon-web-services amazon-vpc aws-nat-gateway

我对此有点迷失——我已经关注了AWS文档,但似乎我找不到更多的东西了。情况摘要是,我在 VPC 内有一个 EC2 实例,尽管按照 Amazon AWS 说明为 VPC 设置 NAT,但它无法访问 Internet。详情如下:

  1. 我有一个 VPC,其中有一个子网 (CIDR 10.0.0.0/24) 和一个 EC2 实例(它仅在 VPC 内具有私有 IP 地址,10.0.0.168)

  2. 我创建了一个互联网网关并将其附加到上述 VPC。

  3. 我为入站和出站流量创建了一个网络 ACL,其所有流量允许为 0.0.0.0/0,并将该 ACL 附加到 VPC 的唯一子网。

  4. VPC 子网安全组还允许 0.0.0.0/0 的所有流量进出

  5. 我创建了一个 NAT 网关,它在 VPC 内有一个私有 IP 地址 (10.0.0.95) 和一个公共弹性 IP 地址(假设是 18.154.34.97,但我认为这并不重要)。该 NAT 网关连接到 VPC 的唯一子网。

  6. 我创建了与 VPC 子网 (10.0.0.0/24) 关联的路由表,并包含两个条目:

    Destination     Target
    10.0.0.0/24     local
    0.0.0.0/0       nat-gateway-id
Run Code Online (Sandbox Code Playgroud)
  1. 为了访问 VPC,我创建了一个地址范围为 10.1.0.0/22 的客户端 VPN 终端节点,并将其与正确的 VPN 子网关联。

  2. 我可以使用 OpenVPN 连接到客户端 VPN 终端节点并通过 ssh 进入 EC2 实例。但是,从那时起我无法访问互联网。同样,当连接到此客户端 VPN 端点时,我的本地计算机也无法访问 Internet。我尝试 ping VPC 内的 NAT 地址 (10.0.0.95),但从任何一台机器都无法访问该地址。

  3. 一切都是我设置为绿色、活动等。使用可达性分析器时,我得到以下信息:

Route table rtb-(...) does not have an applicable route to igw-(...)
Run Code Online (Sandbox Code Playgroud)

我将数据路由到 NAT,而不是互联网网关,因为我知道,当我仅在 VPC 内拥有私有 IP 地址时,这是执行此操作的正确方法。

Traffic cannot reach the internet through internet gateway igw-(...) because the source address is not paired with a public IP address. To add or edit an IPv4 public IP address to the source, you can use an Elastic IP address.
Run Code Online (Sandbox Code Playgroud)

如果我正确理解 NAT,则在从 VPC 内实例之一接收数据后,它会成为 Internet 网关的源地址。此 NAT 具有公共弹性 IP 地址。

Internet gateway igw-(...) cannot accept traffic with spoofed addresses from the VPC.
Run Code Online (Sandbox Code Playgroud)

它不应该获得任何此类流量,因为它应该通过 NAT,对吗?

我失去了我在这里错过的东西......

Mar*_*cin 6

您需要有两个子网。一间公立,一间私立。

公有子网

公共子网可以启用公共 IP设置。它应该有NAT 网关和路由表:

 Destination     Target
    10.0.0.0/24     local
    0.0.0.0/0       internet-gateway
Run Code Online (Sandbox Code Playgroud)

私有子网

您的私有实例应该位于私有子网中。子网应该有路由表:

    Destination     Target
    10.0.0.0/24     local
    0.0.0.0/0       nat-gateway-id
Run Code Online (Sandbox Code Playgroud)

NACL

最好保留默认 NACL不变。很容易把它们搞乱。您应该能够仅使用安全组来控制对实例的访问和来自实例的访问。