ELB 后面的 Docker 容器获取动态端口,这些端口会自动向 ELB 注册,以便它们可以将流量重定向到它们。
为了使 ELB 可以访问您的 Web 服务器,您必须打开所有来自您的安全组内的端口 1024 - 65535。
有没有办法不必向一系列端口开放安全组,而只需向 ELB 正在使用的罐子开放?
ELB 后面的 Docker 容器获取动态端口,这些端口会自动向 ELB 注册,以便它们可以将流量重定向到它们。
为了使 ELB 可以访问您的 Web 服务器,您必须打开所有来自您的安全组内的端口 1024 - 65535。
有没有办法不必向一系列端口开放安全组,而只需向 ELB 正在使用的罐子开放?
AWS 永远不会修改安全组,因为这可能会导致冲突和安全问题。唯一的例外是 Elastic Beanstalk 等服务。您可能必须按照论坛所说的去做并允许端口范围。
根据http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PortMapping.html
The default ephemeral port range is 49153 to 65535, and this range is used for Docker versions prior to 1.6.0. For Docker version 1.6.0 and later, the Docker daemon tries to read the ephemeral port range from /proc/sys/net/ipv4/ip_local_port_range; if this kernel parameter is unavailable, the default ephemeral port range is used. You should not attempt to specify a host port in the ephemeral port range, because these are reserved for automatic assignment. In general, ports below 32768 are outside of the ephemeral port range.
如果你真的关心什么端口,据我所知,你有几个选择:
TCP 0-65535
在sg-foo
哪里sg-foo
sg-foo
中,并设置规则sg-app
(您的应用程序所在的安全组在哪里)并允许来自内部sg-app
的流量TCP 0-65535
sg-foo
sg-app
在容器实例安全组中,将传入流量限制在 32768-65535 的端口范围和您的 VPC 和负载均衡器的相关子网 CIDR(例如,10.0.0.0/16)。
根据文档,可以分配为 docker 发布端口(动态端口)的 EC2 主机端口是临时端口范围:49153–65535 和 32768–61000。
在我看来,它们是过度包装(49153-61000?),但这是文件所说的。应该是32768-65535?请有人解释原因。
如果动态端口映射设置正确,那么您将在目标组中看到已注册的目标以及为任务分配的端口。您还将在以下临时端口范围的已注册目标中看到该任务:49153–65535 和 32768–61000。
例如,您可以看到端口32776是为 ECS 任务容器动态分配的。
$ sudo status ecs
ecs start/running, process 3176
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b95c013c6ba *****.dkr.ecr.us-east-2.amazonaws.com/\ecs_monolith_myecs/xyz "node server.js" 3 minutes ago Up 3 minutes 0.0.0.0:32776->3000/tcp ecs_monolith_ABC-1-XYZ-feb4d68dd3d2bfad7500
dbe356e8de8c amazon/amazon-ecs-agent:latest "/agent" 45 minutes ago Up 45 minutes (healthy) ecs-agent
因此,我们可以为来自 ELB targat 组的传入流量开放 49153–65535 和 32768–61000(或 32768-65535),ECS 服务正在为动态端口映射更新这些流量。
对于 ALB,我们可以限制来自附加到 ALB 的 SG 的流量。但是 NLB 没有 SG,其原因似乎是 NLB 没有在 EC2 上运行,因此没有 SG,因为 ALB 在 EC2 上运行,因此有 SG。
NLB 在您的 VPC 中显示为 ENI,但实际上并非如此。它是我们称为 HyperPlane 的组件的扩展。而 ALB 和 CLB 在 AWS 管理的 EC2 实例上运行,因此它们具有附加的“真实”ENI,因此能够使用安全组。
NLB 有一个静态 IP。但是,如果 ELB 的目标组的目标类型是instance,则源 IP 将保留在Target Groups for Your Network Load Balancers中。
如果您使用实例 ID 指定目标,则会保留客户端的源 IP 地址并将其提供给您的应用程序。
如果您按 IP 地址指定目标,则源 IP 地址是负载均衡器节点的私有 IP 地址。如果您需要客户端的 IP 地址,请启用代理协议并从代理协议标头中获取客户端 IP 地址。
如果 ECS 的网络模式是 awsvpc,那么我们可以使用 IP 来确保流量只来自 NLB,否则,除了使用外部客户端 IP 范围之外,似乎没有办法限制来源。