

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

# 为经典负载均衡器配置代理协议
<a name="enable-proxy-protocol"></a>

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

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

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

**Topics**
+ [代理协议标头](#proxy-protocol)
+ [启用代理协议的先决条件](#proxy-protocol-prerequisites)
+ [使用启用代理协议 AWS CLI](#enable-proxy-protocol-cli)
+ [使用禁用代理协议 AWS CLI](#proxy-protocol-disable-policy-cli)

## 代理协议标头
<a name="proxy-protocol"></a>

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

标头中的代理地址 IPv6 是您的负载均衡器的公共 IPv6 地址。此 IPv6 地址与从您的负载均衡器的 DNS 名称中解析的 IP 地址相匹配，该名称以`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
```

## 启用代理协议的先决条件
<a name="proxy-protocol-prerequisites"></a>

开始之前，请执行以下操作：
+ 确认您的负载均衡器不在启用了代理协议的代理服务器之后。如果在代理服务器和负载均衡器上同时启用了代理协议，则负载均衡器会向已具有来自代理服务器的标头的请求添加另一个标头。根据实例的配置方式，这种重复可能会导致错误。
+ 确认您的实例可以处理代理协议信息。
+ 确认您的侦听器设置支持代理协议。有关更多信息，请参阅 [经典负载均衡器的侦听器配置](using-elb-listenerconfig-quickref.md)。

## 使用启用代理协议 AWS CLI
<a name="enable-proxy-protocol-cli"></a>

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

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

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

1. （可选）使用以下 [describe-load-balancer-policy-types](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancer-policy-types.html) 命令列出 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"
           },
           ...
       ]
   }
   ```

1. 使用以下[create-load-balancer-policy](https://docs.aws.amazon.com/cli/latest/reference/elb/create-load-balancer-policy.html)命令创建启用代理协议的策略：

   ```
   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
   ```

1. 使用以下 [set-load-balancer-policies-for-backend-server](https://docs.aws.amazon.com/cli/latest/reference/elb/set-load-balancer-policies-for-backend-server.html) 命令在指定端口上启用新创建的策略。请注意，此命令将替代当前已启用的策略组。因此，`--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
   ```

1. （可选）使用以下[describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html)命令验证代理协议是否已启用：

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

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

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

## 使用禁用代理协议 AWS CLI
<a name="proxy-protocol-disable-policy-cli"></a>

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

**禁用代理协议策略**

1. 使用以下 [set-load-balancer-policies-for-backend-server](https://docs.aws.amazon.com/cli/latest/reference/elb/set-load-balancer-policies-for-backend-server.html) 命令禁用代理协议策略，方法是将其从`--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 "[]"
   ```

1. （可选）使用以下[describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html)命令验证策略是否已禁用：

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

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

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