Elastic Load Balancing
传统负载均衡器
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

为传统负载均衡器配置代理协议支持

代理协议是一种 Internet 协议,用于将连接信息从请求连接的源传递到请求连接到的目标。Elastic Load Balancing 使用代理协议版本 1,该版本使用用户可读的标头格式。

默认情况下,在对前端和后端连接使用传输控制协议 (TCP) 时,您的传统负载均衡器会将请求转发到实例,而不修改请求标头。如果您启用代理协议,则会向请求标头添加一个用户可读的标头,其中包含连接信息 (如源 IP 地址、目标 IP 地址和端口号)。该标头随后作为请求的一部分发送到实例。

注意

AWS 管理控制台不支持启用代理协议。

代理协议标头

在您具有负载均衡器来使用 TCP 进行后端连接时,代理协议标头有助于识别客户端的 IP 地址。因为负载均衡器会拦截客户端与您的实例之间的流量,因此您实例的访问日志中将包含负载均衡器的 IP 地址而不是原始客户端的 IP 地址。您可以分析该请求的第一行,以检索该客户端的 IP 地址和端口号。

IPv6 标头中的代理地址是负载均衡器的公有 IPv6 地址。此 IPv6 地址与从该负载均衡器以 ipv6dualstack 开头的 DNS 名称解析而来的 IP 地址相匹配。如果客户端使用 IPv4 进行连接,则代理标头中的地址是该负载均衡器的私有 IPv4 地址,不能在 EC2-Classic 网络外部通过 DNS 查找进行解析。

该代理协议行以回车符和换行符 ("\r\n") 结束,且具有以下形式:

PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"

示例:IPv4

下面是 IPv4 的代理协议行的示例。

PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n

示例:IPv6 (仅 EC2-Classic)

下面是 IPv6 的 IPv6 代理协议行的示例。

PROXY TCP6 2001:DB8::21f:5bff:febf:ce22:8a2e 2001:DB8::12f:8baa:eafc:ce29:6b2e 35646 80\r\n

启用代理协议的先决条件

开始之前,请执行以下操作:

  • 确认您的负载均衡器不在启用了代理协议的代理服务器之后。如果在代理服务器和负载均衡器上同时启用了代理协议,则负载均衡器会向已具有来自代理服务器的标头的请求添加另一个标头。根据实例的配置方式,这种重复可能会导致错误。

  • 确认您的实例可以处理代理协议信息。

  • 确认您的侦听器设置支持代理协议。有关更多信息,请参阅 用于 传统负载均衡器 的侦听器配置

使用 AWS CLI 启用代理协议

要启用代理协议,您需要创建 ProxyProtocolPolicyType 类型的策略,然后在实例端口上启用该策略。

使用以下过程为您的负载均衡器创建 ProxyProtocolPolicyType 类型的新策略,将新创建的策略应用于端口 80 上的实例,然后确认已启用该策略。

为负载均衡器启用代理协议

  1. (可选) 使用以下 describe-load-balancer-policy-types 命令列出 Elastic Load Balancing 支持的策略:

    aws elb describe-load-balancer-policy-types

    响应包含支持的策略类型的名称和描述。下面显示了 ProxyProtocolPolicyType 类型的输出:

    { "PolicyTypeDescriptions": [ ... { "PolicyAttributeTypeDescriptions": [ { "Cardinality": "ONE", "AttributeName": "ProxyProtocol", "AttributeType": "Boolean" } ], "PolicyTypeName": "ProxyProtocolPolicyType", "Description": "Policy that controls whether to include the IP address and port of the originating request for TCP messages. This policy operates on TCP/SSL listeners only" }, ... ] }
  2. 使用以下 create-load-balancer-policy 命令创建启用代理协议的策略:

    aws elb create-load-balancer-policy --load-balancer-name my-loadbalancer --policy-name my-ProxyProtocol-policy --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true
  3. 使用以下 set-load-balancer-policies-for-backend-server 命令在指定端口上启用新创建的策略。请注意,此命令将替代当前已启用的策略组。因此,--policy-names 选项必须同时指定要添加到列表中的策略 (例如 my-ProxyProtocol-policy) 和所有当前已启用的策略 (例如 my-existing-policy)。

    aws elb set-load-balancer-policies-for-backend-server --load-balancer-name my-loadbalancer --instance-port 80 --policy-names my-ProxyProtocol-policy my-existing-policy
  4. (可选) 使用以下 describe-load-balancers 命令验证是否已启用代理协议:

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

    响应包含以下信息,该信息表明 my-ProxyProtocol-policy 策略与端口 80 关联。

    { "LoadBalancerDescriptions": [ { ... "BackendServerDescriptions": [ { "InstancePort": 80, "PolicyNames": [ "my-ProxyProtocol-policy" ] } ], ... } ] }

使用 AWS CLI 禁用代理协议

您可以禁用与您的实例关联的策略,然后在将来启用它们。

若要禁用代理协议策略,请执行以下操作

  1. 使用以下 set-load-balancer-policies-for-backend-server 命令,通过在 --policy-names 选项中忽略代理协议策略来禁用代理协议策略,但仍应包含应保持启用的其他策略 (例如 my-existing-policy)。

    aws elb set-load-balancer-policies-for-backend-server --load-balancer-name my-loadbalancer --instance-port 80 --policy-names my-existing-policy

    如果没有其他要启用的策略,请使用 --policy-names 选项指定空字符串,如下所示:

    aws elb set-load-balancer-policies-for-backend-server --load-balancer-name my-loadbalancer --instance-port 80 --policy-names "[]"
  2. (可选) 使用以下 describe-load-balancers 命令验证是否已禁用策略:

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

    响应包含以下信息,表明没有与策略关联的端口。

    { "LoadBalancerDescriptions": [ { ... "BackendServerDescriptions": [], ... } ] }