Amazon ec2 专用子网中TCP服务器的网络负载平衡器

Amazon ec2 专用子网中TCP服务器的网络负载平衡器,amazon-ec2,load-balancing,Amazon Ec2,Load Balancing,我正在尝试(我认为是)为定制tcp服务器(一种sftp)做一件简单的事情: 允许通信量通过aws网络进入端口2222,然后路由到专用子网中的实例 我在应用程序中也做了同样的工作,它工作得非常好 但是我无法让网络版本正常工作 我想知道这是否可能?当我创建网络负载平衡器时,我确实收到一条警告,说我的公共子网中没有实例(这是真的……所有实例都在私有子网中)。但奇怪的是,我在创建一个具有相同子网的应用程序负载平衡器时没有遇到这个错误 我是不是遗漏了什么 (我可以使用bastion主机ping我的服务器,

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

允许通信量通过aws网络进入端口2222,然后路由到专用子网中的实例

我在应用程序中也做了同样的工作,它工作得非常好

但是我无法让网络版本正常工作

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

我是不是遗漏了什么

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


网络负载平衡器能否将流量定向到专用子网中的实例?

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


实例需要位于公共子网上,其默认路由指向Internet网关,以便与面向外部的NLB一起工作,因为与其他负载平衡器产品不同,它们不会将响应流量返回到“平衡器的内部IP”,因为平衡器本身没有面向实例的IP地址,实例认为流量直接来自客户端IP。

因此每个人的响应都是绝对正确的

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

2222 0.0.0.0/0

我以前把它当作

2222 10.0.0.0/16(其中10.0.0.0/16是我的专有网络)

这不起作用,因为客户端可能来自任何地方,而不是来自我的网络,因为网络负载平衡器将客户端直接传递到后端基础设施


这个简单的改变立刻解决了这个问题。

如果这不起作用,我不会感到惊讶。NLB不会改变流量,也没有安全组。它们在与ALB不同的网络层上运行。它可能有一个很好的理由向您发出关于公共子网中没有实例的警告。你不能仅仅因为它对ALB有效就认为它有效,它们是根本不同的。很好的反馈。非常感谢。你能指出任何有助于支持你评论的相关文档吗?@FelipeAlvarez不太可能。这些见解大多是观察、测试和直觉的结果。事实证明,由于实现中的一个怪癖,这些实例实际上不需要位于公共子网上。如果它们位于专用子网上,则只要专用子网上有默认路由,公共NLB仍可工作。实际上,路由点在哪里并不重要,只需要配置一个路由点——如上所述,网络正在重写数据包,因此默认路由的目标被忽略,但如果没有默认路由,则会在重写之前丢弃它们。从概念上讲,网络负载平衡器是,在某些意义上与NAT网关非常相似,但其工作方向相反,允许外部客户端使用外部的公共IP访问内部计算机,并连接到内部的私有IP,并重写数据包,以便两端都能理解对话。默认路由怪癖参考:@AlecFenichel阅读上面的评论。它可以正常工作,只需正确的配置,但基于本质上是偶然工作的行为进行设计似乎不是一个好主意。