【问题标题】:Network Load Balancer to TCP Server in Private Subnet网络负载均衡器到私有子网中的 TCP 服务器
【发布时间】:2018-04-21 19:09:03
【问题描述】:

我正在尝试为自定义 tcp 服务器(一种 sftp)做(我认为是)一件简单的事情:

允许流量通过 aws network 负载均衡器进入端口 2222,然后路由到私有子网中的实例。

我对应用程序负载均衡器做了同样的事情,效果很好。

但我无法让 network 版本正常工作。

我想知道这是否可能?当我创建网络负载均衡器时,我确实收到一条警告,说我的公共子网中没有实例(这是真的......所有实例都在私有子网中)。但奇怪的是,在创建具有相同子网的 应用程序 负载均衡器时,我没有收到此错误。

我错过了什么吗?

(我可以使用堡垒主机ping我的服务器没有问题,所以我知道它正在运行。我还在所有相关的安全组中打开了端口2222。)

网络负载平衡器能否将流量引导至私有子网中的实例?

【问题讨论】:

  • 如果这不起作用,我不会感到惊讶。 NLB 不变地传递流量,并且没有安全组。它们在与 ALB 不同的网络层运行。它可能有充分的理由向您发出有关公共子网中没有实例的警告。您不能仅仅因为它适用于 ALB 就认为它会起作用,它们是根本不同的。

标签: amazon-ec2 load-balancing


【解决方案1】:

NLB 似乎修改了网络基础设施的行为,而不是像 ALB 或经典 ELB 那样基于“隐藏 EC2 实例”,因此需要不同的网络配置。

实例需要位于公共子网上,其默认路由指向 Internet 网关,才能使用面向外部的 NLB,因为与其他负载均衡器产品不同,它们不会将响应流量返回到“平衡器的内部 IP”,因为平衡器没有自己的面向实例的 IP 地址,并且实例将流量视为直接来自客户端 IP。

【讨论】:

  • 很好的反馈。谢谢你。您能否指出任何有助于支持您的 cmets 的相关文档?
  • @FelipeAlvarez 不是真的。这些见解主要是观察、测试和直觉的结果。事实证明,这些实例实际上并不需要在公共子网上,因为实现中的一个怪癖。如果它们位于私有子网上,则只要私有子网有默认路由,公共 NLB 仍然可以工作。路由指向哪里实际上并不重要,只需要配置一个 - 网络正在重写数据包,如上所述,因此默认路由的目标被忽略,但没有默认路由,它们在可能会发生重写。
  • 从概念上讲,网络负载均衡器在某些意义上与 NAT 网关非常相似,但它的工作方向相反,允许外部客户端使用外部的公共 IP 访问内部机器,连接到内部的私有 IP,并重写数据包,以便两端都能理解对话。
  • 默认路由怪癖参考:stackoverflow.com/a/48798518/1695906
  • @AlecFenichel 阅读了上面的 cmets。只要配置正确,它就可以工作,但根据本质上是偶然的行为进行设计似乎是个坏主意。
【解决方案2】:

所以每个人的反应都是绝对正确的。

解决方案是简单地更改与网络接口关联的安全组,该网络接口又与我的私有子网关联,如下所示:

2222 0.0.0.0/0

我以前是这样的

2222 10.0.0.0/16(其中 10.0.0.0/16 是我的 vpc)

这不起作用,因为客户端可能来自任何地方,但它们不是来自我的网络,因为网络负载平衡器将客户端直接传递给后端基础架构。

这个简单的更改立即解决了问题。

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2019-07-19
    • 2023-03-24
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多