![ELB 是否还会在 AWS 中路由出站回复流量](https://linux22.com/image/668057/ELB%20%E6%98%AF%E5%90%A6%E8%BF%98%E4%BC%9A%E5%9C%A8%20AWS%20%E4%B8%AD%E8%B7%AF%E7%94%B1%E5%87%BA%E7%AB%99%E5%9B%9E%E5%A4%8D%E6%B5%81%E9%87%8F.png)
我一直在尝试了解具有公共/私有子网的 AWS VPC 中的路由如何工作。
我按照亚马逊的建议设置了 ELB 和 NAT,将公共子网设置为 ELB,将 Web 服务器设置为私有子网。我已按照以下要求配置了安全组 (SG)http://blogs.aws.amazon.com/security/blog/tag/NAT一切按预期运行。太棒了!
我还不明白的是,在上述架构中,HTTP 回复是如何从 Web 服务器实例返回的。
因此,一个 Web 请求通过 HTTP 从公共互联网传入,80 命中 ELB,然后 ELB 将其带到 Web 服务器的私有 IP,太棒了。现在 Web 服务器必须回复。据我所知,回复将通过另一个更高的 TCP 端口 (1024-65535) 进行。NAT SG 仅允许通过端口 80 和 443 进行出站流量。那么这个回复如何返回到公共互联网呢?它无法通过 NAT。这是否意味着回复通过 ELB 返回。Amazon 图表未将 ELB 流量方向箭头指示为双向,ELB 文档也没有说明 ELB 的行为类似于有状态 NAT。是吗?
答案1
图中的箭头仅指示建立连接的方向,而不是流量的方向。
是的,返回流量会通过 ELB 返回。
但是,它不是有状态 NAT——它是一个 TCP 连接代理。ELB 机器在配置的侦听端口上接受 TCP 连接,如果配置了 SSL 会话,则终止该会话,并建立与后端服务器的新 TCP 连接。如果侦听器配置为 HTTP,ELB 将以有效负载感知模式运行,解析、记录和转发 HTTP 请求到后端,否则它将与有效负载无关,为每个传入连接建立与后端 1:1 的新 TCP 连接,并“将管道绑定在一起”(没有 HTTP 级别的感知或修改)。
无论哪种方式,应用程序传入连接的源地址都是 ELB 节点的地址,而不是原始客户端的地址。这就是响应流量返回到 ELB 并返回到客户端的方式。
在http模式下,ELB添加(或附加到)X-Forwarded-For
标题,以便您的应用程序可以识别原始客户端 IP,以及X-Forwarded-Proto: [ http | https ]
指示客户端连接是否使用 SSL 并X-Forwarded-Port
指示前端端口。
更新:上面指的是一种现在称为“ELB Classic”或 ELB/1.0 的负载均衡器(可以在它通过 HTTP 健康检查发送的用户代理字符串中找到)。
较新的第 7 层均衡器、应用程序负载均衡器或 ELB/2.0 在流量方面运行类似。第 4 层(“透明” TCP)功能已从 ALB 中删除,第 7 层功能得到显著增强。
网络负载均衡器是最新类型的负载均衡器,是一种第 3 层均衡器。与其他两种负载均衡器不同,它的行为非常类似于动态 NAT,仅处理入站(外部发起)连接,将源地址+端口通过 EIP 地址+端口映射到实例私有 IP:地址+端口 - EIP 绑定到“均衡器” - 与其他两种类型的均衡器不同,实例需要位于公共子网上,并使用自己的公共 IP 来实现这一点。
从概念上讲,网络负载均衡器似乎实际上修改了 Internet 网关的行为 - 网关本身是一个逻辑对象,无法被禁用、替换或以任何有意义的方式经历故障。这与 ELB 和 ALB 形成对比,后者实际上是在“隐藏”的 EC2 实例上运行。从各方面来看,NLB 都在网络基础设施本身上运行。
答案2
根据 AWS 的 NLB 文档,它是第 4 层而不是第 3 层。此外,后端或目标服务器不需要位于公共子网上。事实上,目标组的 IP 地址范围必须是以下之一:以下是可能的目标类型:
实例 目标由实例 ID 指定。
ip 目标由 IP 地址指定。
当目标类型为 ip 时,您可以指定以下 CIDR 块之一中的 IP 地址:
目标组的 VPC 子网
10.0.0.0/8(RFC 1918)
100.64.0.0/10(RFC 6598)
172.16.0.0/12(RFC 1918)
192.168.0.0/16(RFC 1918)
重要的
您不能指定可公开路由的 IP 地址。
我希望这有帮助。