【问题标题】:Dynamic ports and AWS Applocation Load balancer and ECS动态端口和 AWS 应用程序负载均衡器和 ECS
【发布时间】:2017-02-11 10:43:36
【问题描述】:

ELB 后面的 Docker 容器获取动态端口,这些端口会自动向 ELB 注册,以便它们可以将流量重定向到它们。

为了使 ELB 可以访问您的 Web 服务器,您必须打开来自您的安全组内的所有这些端口 1024 - 65535。

有没有办法不必向一系列端口开放安全组,而只对 ELB 正在使用的罐子开放?

【问题讨论】:

    标签: amazon-web-services amazon-elb amazon-ecs aws-security-group


    【解决方案1】:

    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.

    如果您真的关心什么端口,据我所知,您有几个选择:

    1. 不专门使用 ALB 和转发端口,因此您可以在 ELB 安全组中指定它们。
    2. 将 ALB 与您的应用程序放在同一个安全组中,并使用内部安全组规则,例如 TCP 0-65535 for sg-foo 其中sg-foo 是 ALB 和应用程序所在的安全组
    3. 将 ALB 放在安全组 sg-foo 中,并在 sg-app 上设置规则(其中 sg-app 是您的应用程序所在的安全组)并允许来自 sg-foo 内部 sg-app 的流量 TCP 0-65535

    【讨论】:

      【解决方案2】:

      在容器实例安全组中,将传入流量限制在 32768-65535 的端口范围和您的 VPC 和负载均衡器的相关子网 CIDR(例如 10.0.0.0/16)。

      【讨论】:

        【解决方案3】:

        根据文档,可以分配为 docker 发布端口(动态端口)的 EC2 主机端口是临时端口范围:49153–65535 和 32768–61000。

        在我看来他们是过度包装(49153-61000?),但这是文件所说的。应该是32768-65535?请有人解释原因。

        • How do I set up dynamic port mapping for Amazon ECS?

          如果动态端口映射设置正确,那么您将在目标组中看到已注册的目标以及为任务分配的端口。您还将在以下临时端口范围的已注册目标中看到该任务: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 的安全组 (SG)

        对于 ALB,我们可以限制来自附加到 ALB 的 SG 的流量。但是 NLB 没有 SG,原因似乎是 NLB 没有在 EC2 上运行,因此没有 SG,因为 ALB 在 EC2 上运行,因此有 SG。

        NLB 在您的 VPC 中显示为 ENI,但实际上并非如此。它是我们称为 HyperPlane 的组件的扩展。而 ALB 和 CLB 在 AWS 管理的 EC2 实例上运行,因此它们具有附加的“真实”ENI,因此能够使用安全组。

        使用 ELB IP CIDR 块

        NLB 有一个静态 IP。但是,如果ELB的目标组的目标类型是instance,则源IP保留为Target Groups for Your Network Load Balancers

        如果您使用实例 ID 指定目标,则会保留客户端的源 IP 地址并将其提供给您的应用程序。

        如果您按 IP 地址指定目标,则源 IP 地址是负载均衡器节点的私有 IP 地址。如果您需要客户端的 IP 地址,请启用代理协议并从代理协议标头中获取客户端 IP 地址。

        如果ECS的网络模式是awsvpc,那么我们可以使用IP来确保流量只来自NLB,否则看起来除了使用外部客户端IP范围之外没有办法限制来源。

        【讨论】:

          猜你喜欢
          • 2017-01-04
          • 2019-12-17
          • 2017-09-27
          • 2018-02-26
          • 1970-01-01
          • 2021-07-02
          • 2017-05-23
          • 2021-02-01
          • 1970-01-01
          相关资源
          最近更新 更多