为您的 Classic Load Balancer 配置代理协议 - Elastic Load Balancing
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为您的 Classic Load Balancer 配置代理协议

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

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

注意

Amazon Web Services Management Console 不支持启用代理协议。

代理协议标头

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

标头中的代理地址IPv6是您的负载均衡器的公共IPv6地址。此IPv6地址与从您的负载均衡器名称中解析的 IP 地址相匹配,该DNS名称以ipv6或开头dualstack。如果客户端与连接IPv4,则标头中的代理地址是负载均衡器的私有IPv4地址,无法通过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

启用代理协议的先决条件

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

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

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

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

使用 Amazon 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" ] } ], ... } ] }

使用 Amazon 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": [], ... } ] }