为经典负载均衡器配置安全组 - 弹性负载均衡
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为经典负载均衡器配置安全组

安全组 起到防火墙的作用,可控制允许往返于一个或多个实例的流量。在您启动 EC2 实例时,可将一个或多个安全组与该实例关联。对于每个安全组,添加一个或多个规则以允许流量。您可以随时修改某个安全组的规则;新规则会自动应用于与该安全组关联的所有实例。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的 Amazon EC2 安全组

经典负载均衡器在 EC2-Classic 和 VPC 中支持安全组的方式上存在明显的差异。在 EC2-Classic 中,负载均衡器提供一个特定源安全组,您可使用该组确保实例仅接收来自负载均衡器的流量。您无法修改此源安全组。在 VPC 中,您为负载均衡器提供安全组,以便您能够选择要允许的端口和协议。例如,您可以打开负载均衡器的 Internet 控制消息协议 (ICMP) 连接,以响应 Ping 请求 (但是,Ping 请求不会转发至任何实例)。

在 EC2-Classic 和 VPC 中,您必须确保实例的安全组允许负载均衡器在侦听器端口和运行状况检查端口上与您的实例进行通信。在 VPC 中,您的安全组和网络访问控制列表 (ACL) 必须在这些端口上允许两个方向的流量。

VPC 中的负载均衡器的安全组

在 VPC 中使用 Amazon Web Services Management Console创建负载均衡器时,您可为 VPC 选择现有安全组或为 VPC 创建新的安全组。如果您选择现有安全组,则它必须允许侦听器端口和运行状况检查端口上针对负载均衡器的双向流量。如果您选择创建安全组,则控制台将自动添加规则以允许这两个端口上的所有流量。

[非默认 VPC] 如果您使用 Amazon CLI 或 API 在非默认 VPC 中创建负载均衡器,但不指定安全组,则负载均衡器将自动与 VPC 的默认安全组关联。

[默认 VPC] 如果您使用 Amazon CLI 或 API 在默认 VPC 中创建负载均衡器,则您无法为负载均衡器选择现有安全组。相反,Elastic Load Balancing 将为安全组提供规则,以允许指定端口上针对负载均衡器的所有流量。Elastic Load Balancing 仅为每个 Amazon 账户创建一个此类安全组,其名称的格式为 default_elb_id(例如,default_elb_fc5fbed3-0405-3b7d-a328-ea290EXAMPLE)。您在默认 VPC 中创建的后续负载均衡器也使用此安全组。务必查看安全组规则以确保它们允许侦听器端口和运行状况检查端口上针对新负载均衡器的流量。删除负载均衡器时,不会自动删除此安全组。

如果您向现有负载均衡器添加侦听器,则必须检查安全组以确保它们允许新侦听器端口上的双向流量。

负载均衡器的安全组必须允许它们与您的实例进行通信。推荐规则取决于负载均衡器的类型(面向 Internet 或内部)。

下表显示了面向 Internet 的负载均衡器的推荐规则。

Inbound
协议 端口范围 评论

0.0.0.0/0

TCP

侦听器

在负载均衡器侦听器端口上允许所有入站流量

Outbound

目的地 协议 端口范围 评论

实例安全组

TCP

实例侦听器

在实例侦听器端口上允许流向实例的出站流量

实例安全组

TCP

运行状况检查

在运行状况检查端口上允许流向实例的出站流量

下表显示了内部负载均衡器的推荐规则。

Inbound
协议 端口范围 评论

VPC CIDR

TCP

侦听器

在负载均衡器侦听器端口上允许来自 VPC CIDR 的入站流量

Outbound

目的地 协议 端口范围 评论

实例安全组

TCP

实例侦听器

在实例侦听器端口上允许流向实例的出站流量

实例安全组

TCP

运行状况检查

在运行状况检查端口上允许流向实例的出站流量

使用控制台管理安全组

使用以下过程可更改与 VPC 中的负载均衡器关联的安全组。

更新分配给您的负载均衡器的安全组
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的 Load Balancing(负载均衡)下,选择 Load Balancers(负载均衡器)。

  3. 选择您的负载均衡器。

  4. Description 选项卡上,选择 Edit security groups

  5. Edit security groups 页面上,根据需要选中或清除安全组。

  6. 完成后,选择 Save

使用 Amazon CLI 管理安全组

使用以下 apply-security-groups-to-load-balancer 命令将安全组与 VPC 中的负载均衡器关联。指定的安全组会覆盖之前关联的安全组。

aws elb apply-security-groups-to-load-balancer --load-balancer-name my-loadbalancer --security-groups sg-53fae93f

以下为响应示例:

{ "SecurityGroups": [ "sg-53fae93f" ] }

VPC 中的实例的安全组

您的实例的安全组必须允许它们与负载均衡器进行通信。下表显示了推荐规则。

Inbound
协议 端口范围 评论

负载均衡器安全组

TCP

实例侦听器

在实例侦听器端口上允许来自负载均衡器的流量

负载均衡器安全组

TCP

运行状况检查

在运行状况检查端口上允许来自负载均衡器的流量

我们还建议您允许入站 ICMP 流量以支持路径 MTU 发现。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的路径 MTU 发现

VPC 中的负载均衡器的网络 ACL

VPC 的默认网络访问控制列表 (ACL) 允许所有入站和出站流量。如果创建自定义网络 ACL,则必须添加允许负载均衡器和实例进行通信的规则。

负载均衡器子网的推荐规则取决于负载均衡器类型(面向 Internet 或内部)。

下面显示了面向 Internet 的负载均衡器的推荐规则。

Inbound
协议 端口 评论

0.0.0.0/0

TCP

侦听器

在负载均衡器侦听器端口上允许所有入站流量

VPC CIDR

TCP

1024-65535

在临时端口上允许来自 VPC CIDR 的入站流量

Outbound

目的地 协议 端口 评论

VPC CIDR

TCP

实例侦听器

在实例侦听器端口上允许所有出站流量

VPC CIDR

TCP

运行状况检查

在运行状况检查端口上允许所有出站流量

0.0.0.0/0

TCP

1024-65535

在临时端口上允许所有出站流量

下面显示了内部负载均衡器的推荐规则。

Inbound
协议 端口 评论

VPC CIDR

TCP

侦听器

在负载均衡器侦听器端口上允许来自 VPC CIDR 的入站流量

VPC CIDR

TCP

1024-65535

在临时端口上允许来自 VPC CIDR 的入站流量

Outbound

目的地 协议 端口 评论

VPC CIDR

TCP

实例侦听器

在实例侦听器端口上允许流向 VPC CIDR 的出站流量

VPC CIDR

TCP

运行状况检查

在运行状况检查端口上允许流向 VPC CIDR 的出站流量

VPC CIDR

TCP

1024-65535

在临时端口上允许流向 VPC CIDR 的出站流量

实例子网的推荐规则取决于子网是私有还是公有子网。以下规则适用于私有子网。如果您的实例在公有子网中,请将源和目标从 VPC 的 CIDR 更改为 0.0.0.0/0

Inbound
协议 端口 评论

VPC CIDR

TCP

实例侦听器

在实例侦听器端口上允许来自 VPC CIDR 的入站流量

VPC CIDR

TCP

运行状况检查

在运行状况检查端口上允许来自 VPC CIDR 的入站流量

Outbound

目的地 协议 端口 评论

VPC CIDR

TCP

1024-65535

在临时端口上允许流向 VPC CIDR 的出站流量

EC2-Classic 中实例的安全组

要允许负载均衡器与在 EC2-Classic 中启动的实例之间通信,请为实例的安全组创建入站规则,从而允许来自所有 IP 地址的入站流量(使用 0.0.0.0/0 CIDR 块),或仅允许来自负载均衡器的入站流量(使用 Elastic Load Balancing 提供的源安全组)。

使用以下过程锁定负载均衡器和 EC2-Classic 中您的实例之间的流量。

使用控制台锁定负载均衡器和实例之间的流量
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的 Load Balancing(负载均衡)下,选择 Load Balancers(负载均衡器)。

  3. 选择您的负载均衡器。

  4. Description 选项卡上,复制源安全组的名称。

    
							ELB 源安全组
  5. Instances 选项卡上,选择已向负载均衡器注册的某个实例的实例 ID。

  6. Description 选项卡上,对于 Security groups,选择安全组的名称。

  7. Inbound 选项卡上,依次选择 EditAdd Rule

  8. Type 列中,选择协议类型。将填充 ProtocolPort Range 列。在 Source 列中,选择 Custom IP,然后粘贴您之前复制的源安全组的名称 (例如,amazon-elb/amazon-elb-sg)。

  9. (可选) 如果安全组中的规则的限制性高于您添加的规则的限制性,请使用其删除图标来删除限制性较低的规则。

使用 Amazon CLI 锁定负载均衡器和实例之间的流量
  1. 使用以下 describe-load-balancers 命令显示负载均衡器的源安全组的名称和所有者:

    aws elb describe-load-balancers --load-balancer-name my-loadbalancer

    响应将名称和所有者包含在 SourceSecurityGroup 字段中。例如:

    { "LoadBalancerDescriptions": [ { ... "SourceSecurityGroup": { "OwnerAlias": "amazon-elb", "GroupName": "amazon-elb-sg" } } ] }
  2. 向您实例的安全组添加规则,如下所示:

    1. 如果您不知道实例的安全组的名称,请使用以下 describe-instances 命令获取指定实例的安全组的名称和 ID:

      aws ec2 describe-instances --instance-ids i-315b7e51

      响应将安全组的名称和 ID 包含在 SecurityGroups 字段中。记下安全组的名称;在下一步中,您将使用该名称。

    2. 使用以下 authorize-security-group-ingress 命令向您实例的安全组添加规则以允许来自负载均衡器的流量:

      aws ec2 authorize-security-group-ingress --group-name my-security-group --source-security-group-name amazon-elb-sg --source-security-group-owner-id amazon-elb
  3. (可选)使用以下 describe-security-groups 命令来验证安全组是否具有新规则:

    aws ec2 describe-security-groups --group-names my-security-group

    响应包含一个 UserIdGroupPairs 数据结构,其中列出已获得实例访问权限的安全组。

    { "SecurityGroups": [ { ... "IpPermissions": [ { "IpRanges": [], "FromPort": -1, "IpProtocol": "icmp", "ToPort": -1, "UserIdGroupPairs": [ { "GroupName": "amazon-elb-sg", "GroupId": "sg-5a9c116a", "UserId": "amazon-elb" } ] }, { "IpRanges": [], "FromPort": 1, "IpProtocol": "tcp", "ToPort": 65535, "UserIdGroupPairs": [ { "GroupName": "amazon-elb-sg", "GroupId": "sg-5a9c116a", "UserId": "amazon-elb" } ] }, { "IpRanges": [], "FromPort": 1, "IpProtocol": "udp", "ToPort": 65535, "UserIdGroupPairs": [ { "GroupName": "amazon-elb-sg", "GroupId": "sg-5a9c116a", "UserId": "amazon-elb" } ] }, . . . }
  4. (可选)如果安全组中的规则不及您添加的规则严格,则使用 revoke-security-group-ingress 命令删除限制性较低的规则。例如,以下命令删除允许来自所有人的 TCP 流量 (CIDR 范围 0.0.0.0/0) 的规则:

    aws ec2 revoke-security-group-ingress --group-name my-security-group --protocol tcp --port 80 --cidr 0.0.0.0/0