当来自实例X的NLB DNS进行卷曲时,内部networkloadbalancer不会路由到实例X

时间:2019-05-28 06:31:25

标签: amazon-web-services nlb

  • 我有一个网络负载平衡器(NLB)的内部(解析为专用ips)
  • 端口80上的NLB侦听器指向目标组。目标组中只有一个实例10.141.80.140。

问题:
当我在实例10.141.80.140 上并卷曲NLB的DNS 我没有回应。
希望NLB重定向到10.141.80.140 ,但这不会发生。
当我在10.141.80.140上时,NLB DNS仅不重定向-重定向是从同一子网中的其他实例进行的

详细信息:

  • 围绕EC2 10.141.80.140的安全组在世界范围内是开放的,入站的和出站的
  • 当我从具有相同安全组和其他设置的同一子网中的另一个实例10.141.80。 122 中卷曲NLB DNS时-NLB正确解析为10.141.80.140
  • 当我从实例中卷曲NLB DNS时,NLB应该将其解析为10.141.80。 140 -NLB DOESNT 解析为10.141.80.140
  • 当我从实例10.141.80卷曲实例ip 10.141.80.140时。 140 -我得到响应
  • 当我从实例10.141.80中卷曲实例ip 10.141.80.140时。 122 -我得到响应

问题:
有什么东西会阻止NLB解决实例的请求, 在NLB侦听器目标组内将哪个路由返回到实例?

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个众所周知的行为,我将很高兴解释。 Network Load Balancer引入了源地址保留功能-传入连接的原始IP地址和源端口保持不变。当目标响应请求时,VPC内部人员将捕获此数据包并将其转发到NLB,NLB会将其转发到其目的地。

此行为有一个副作用:当OS内核检测到出口数据包具有本地地址之一作为目标地址时,它将将该数据包直接转发到应用程序。

例如,给定以下组件:

  • 我们有一个内部NLB和一个后端实例。两者都部署在10.0.0.0/24子网中。
  • NLB具有IP 10.0.0.10和端口80上的侦听器,该侦听器将请求转发到端口8080。
  • 后端实例的地址为10.0.0.55,并且具有侦听端口8080的Web服务器。它具有允许所有传入的本地流量的安全组。

  • 如果该实例尝试与NLB建立通信;通讯流程如下:

    • 该实例希望通过telnet NLB:它请求在端口80上针对NLB DNS名称建立TCP连接。
      • 由于它是传出通信,因此从临时端口开始;实例发送一个SYN数据包(1):
        • 来源:10.0.0.55:40000
        • 目的地:10.0.0.10:80
      • NLB接收数据包并将其转发到后端实例(10.0.0.55:80)。
      • 由于地址保留功能,后端实例接收到具有以下信息的SYN数据包:
        • 来源:10.0.0.55:40000
        • 目的地:10.0.0.55:80
      • 操作系统在内部路由数据包(因为其目的地是自己的计算机),这是发生问题的时间:
        • 启动套接字期望从10.0.0.10:80(NLB)开始的SYN_ACK。
        • 但是,它从10.0.0.55:40000(实例本身)接收SYN_ACK。
        • 操作系统将发送多个TCP_RETRANSMISSION直到超时。

对于公共NLB不会发生这种情况,因为该实例将需要在VPC中进行NAT才能使用其公共IP地址将请求发送到NLB。内核将不会在内部转发数据包。

最后,可能的解决方法是按照后端的IP地址而不是实例ID来注册后端。使用此方法,由NLB转发的流量将包含NLB内部IP作为源IP,从而禁用了“源地址保留”功能。不幸的是,如果您正在使用AutoScaling组启动实例,则它只能通过其ID注册已启动的实例。对于ECS任务,将网络配置为“ awsvpc”会强制NLB通过其IP注册每个目标。