VPC 中具有 NAT 的非对称返回路由?

VPC 中具有 NAT 的非对称返回路由?

为了更好地理解 AWS VPC(以及一般的 NAT)的工作原理,我阅读了问题是,目标是实现以下目标:

# GOAL
172.31.0.0/16   local
A.B.C.D/32      nat-451b3be9
0.0.0.0/0       igw-b4ac67d0  

这让我很感兴趣:

还要注意,您尝试的配置将允许出站,但绝不允许从 ABCD 地址到该子网上的任何内容的入站连接(从外部发起),因为返回路由通过 NAT 网关是不对称的。

NAT 网关并非设计为在其提供 NAT 服务的任何子网上创建。实例通过其子网的路由表(对于没有公网 IP 的实例,指向 NAT-GW;对于有公网 IP 的实例,指向 IGW)到达外部资源,NAT-GW 通过其子网路由表(指向 IGW)到达互联网。

如果实例使用自己的公共 IP,则它必须通过 IGW 路由响应,因为入站流量来自那里,并且它不能尝试通过 NAT-GW 离开,因为如果流量被转换,外部的对等方将看到来自错误源 IP 的回复。

我试图确切地了解为什么它允许出站但不允许入站流量。这是我的想法:假设 EC2 实例具有弹性 IP 并且位于具有如上所述的路由表的子网中。然后 NAT 位于单独的子网中。假设A.B.C.D发起与 EC2 弹性 IP 的连接。连接不会进入 VPC,路由表会通过 NAT 发送它,然后转到实例,然后通过 NAT 返回吗?但是,由于它是通过 NAT 发送出去的,地址被转换(如上所述),并且对等方会丢弃数据包,因为它不是来自 EC2 实例的 IP。这是正确的理解吗?它仍然会到达 EC2 实例,但响应数据包永远不会被收到A.B.C.D

答案1

假设 ABCD 发起与 EC2 弹性 IP 的连接。该连接不会进入 VPC 吗?路由表会通过 NAT 发送它……

不是,原因有二:

  • VPC 路由表仅关注目的地数据包中的地址——而不是源地址。

  • 入站流量实际上并不查询 VPC 路由表。VPC 路由表附加到子网,用于通过在表中查找目标网关来为来自附加到路由表的子网中的机器的数据包选择路由。

当流量从外部进入 VPC 时,Internet 网关会将数据包的目标地址从实例的 EIP 转换为实例的私有 IP,并且不使用路由表查找 - IGW 将流量直接发送到实例。

然后实例会回复,并且外部机器的目标地址会通过 VPC 路由表查找将回复发送到 NAT 设备,从而导致所描述的不对称。


换句话说,通过 NAT 网关发送的唯一入站数据包是其目标地址是 NAT 网关的 EIP 的数据包。

答案2

互联网网关在逻辑上代表您的实例提供地址转换,因此当流量离开您的 VPC 子网并进入互联网时,回复地址字段将设置为您的实例的公有 IPv4 地址或弹性 IP 地址,而不是其私有 IP 地址。当流量进入 VPC 时,它会将公有 IP 地址转换回实例的私有地址,并将请求发送到 VPC 路由器,后者将数据包路由到实例。

但是,对于出站流量,VPC 路由器会选择最具体的路由并将数据包转发到 NAT GW,后者进行地址转换并将数据包发送到 IGW(通过 VPC 路由器)。然后,IGW 将目标地址替换为 NAT GW 的公有 IP。由于 IP 不匹配,对等端将断开连接。

如果连接是由对端发起的:

对等点 --> (EC2 公网 IP) --> IGW --> (EC2 私网 IP) --> EC2

如果连接由 EC2 发起:

EC2 -->(目标 IP)--> NAT GW -1-> IGW -2-> 对等

在第二种情况下,地址转换发生两次:

  1. EC2 私有 IP 到 NAT GW 私有 IP
  2. NAT GW 私有 IP 到 NAT GW 公有 IP。

答案3

我遇到了完全相同的问题。可以使用不使用与应用服务器相同路由表的负载均衡器来防止此问题。

例如,如果您希望应用服务器通过 NAT 网关将请求路由到外部服务,请引入一个新的路由表,该路由表仅有的由应用服务器使用。

# app server route-table
172.31.0.0/16   local
A.B.C.D/32      nat-451b3be9
0.0.0.0/0       igw-b4ac67d0

来自应用服务器的传出请求现在将通过 IP ABCD 的 NAT 网关进行路由

发送到应用服务器的请求应通过负载均衡器进行路由。负载均衡器(可能还有其余基础设施)应使用不引用 NAT 网关的默认路由表:

# default route-table
172.31.0.0/16   local
0.0.0.0/0       igw-b4ac67d0

任何传入的请求都将按如下方式路由:远程主机->负载均衡器->应用服务器->负载均衡器(因为它使用本地的 LB 的 IP 地址)->远程主机 - 无需通过 NAT 网关。

相关内容