我在私有子网中的EC2实例中运行应用程序(以增加额外的安全性),直接从与公有子网关联的面向Internet的NLB接收流量。
我还在公有子网中配置了NAT网关,以便私有EC2实例可以从Internet下载所需的任何内容。
我刚刚得出下一个结论:
如果我从互联网上请求:http://index.html
私有EC2实例使用NAT网关发回HTTP响应,因此您需要为该NAT处理付费。
https://aws.amazon.com/vpc/pricing/
"数据处理费用适用于通过NAT网关处理的每千兆字节,无论流量的来源或目的地如何"
与私有子网(Web / app服务器所在的位置)关联的路由表具有{ - local; 0.0.0.0/0 - NATGateway}如果删除0.0.0.0/0条目,则对服务器的HTTP请求不起作用。如果我删除NAT网关,我会遇到同样的问题。 此外,当我有NAT网关和路由表从私有子网使用它时,当我从Internet做一个简单的HTTP请求时,我也可以在NAT网关的监控选项卡中看到流量 - http:/// index html的
有人遇到同样的问题吗?我的理解是否正确?
是否有任何解决方法可以避免这种情况?我可以想到以下几点:
将应用程序移动到Web层(在公有子网中),以便EC2实例具有公共IP,因此不需要NAT网关来响应每个HTTP请求
除了应用程序层之外还创建一个Web层,以便所有流量都来自NLB< - > Web Tier< - > App Tier
创建NAT实例而不是NAT网关,这样就不需要为NAT处理付费。
谢谢!
答案 0 :(得分:7)
因此,事实证明NLB中存在一种奇怪的行为(错误?),需要默认路由到某些以使返回流量起作用。
情景:
向NLB发送流量不会给出回复。
添加:
这很有效。
但是,它实际上并没有使用NAT网关!
相反添加NAT网关,您可以改为创建到另一个实例的默认路由,例如:
0.0.0.0/0 -> another instance
然后,连接到NLB就可以了!
在幕后,VPC网络检测到来自实例的流量是响应来自NLB的请求,流量将路由到NLB。
但是,它仅在路由表中存在有效默认路由时才有效。路线没有被使用 - 网络覆盖它,所以它指向的并不重要。但是,它必须指向有效的资源。如果它指向一个不附加在任何东西上的ENI,它就不起作用。在我的测试中,如果你将它指回同一个实例,它似乎也无法工作。但是,我把它指向另一个实例并且它工作得很好。
AWS Support同意这不是最好的行为,但它是目前必须配置的方式。
底线: 不需要NAT网关。它只需要一个有效的默认路由,在路由返回流量时将被忽略。