

# 在 AWS Global Accelerator 中保留客户端 IP 地址
<a name="preserve-client-ip-address"></a>

保留和访问 AWS Global Accelerator 客户端 IP 地址的选项取决于加速器设置的端点。启用客户端 IP 地址保留后，到达负载均衡器的数据包将保留原始客户端的源 IP 地址。

自定义路由加速器上的端点始终保留客户端 IP 地址。标准加速器有三种类型的端点可以在传入的数据包中保留客户端的源 IP 地址：应用程序负载均衡器、Amazon EC2 实例和带有安全组的网络负载均衡器。对于添加为端点并启用客户端 IP 地址保留的特定资源具有一些要求和限制。有关更多信息，请参阅 [具有客户端 IP 地址保留功能的转换端点](about-endpoints.sipp.md)。

请注意，对于以下端点类型，Global Accelerator 不支持保留客户端 IP 地址：
+ 不带安全组的网络负载均衡器
+ 弹性 IP 地址

有关端点要求的详细信息，请参阅[对可添加为加速器端点的资源的要求](about-endpoints-caveats.md)。

**Topics**
+ [准则和限制](preserve-client-ip-address.how-to-enable-preservation.md)
+ [客户端 IP 地址保留的要求](about-endpoints.sipp-caveats.md)
+ [如何保留客户端 IP 地址](preserve-client-ip-address.headers.md)
+ [客户端 IP 地址保留的优势](preserve-client-ip-address.benefits-of-preservation.md)
+ [ENI 和安全的最佳实操](best-practices-aga.md)
+ [转换端点](about-endpoints.sipp.md)

# Global Accelerator 中保留客户端 IP 地址的准则和限制
<a name="preserve-client-ip-address.how-to-enable-preservation"></a>

在 AWS Global Accelerator 中准备和使用客户端 IP 地址保留功能时，请注意以下准则和限制。

计划添加客户端 IP 地址保留功能时，请注意以下事项：
+ 在您添加流量并开始将流量路由到保留客户端 IP 地址的端点之前，请确保更新所有必需的安全配置（例如安全组），以便在允许列表中包含用户客户端 IP 地址。
+ 您可能会在 AWS WAF 中看到客户端 IP 地址，而看不到 Global Accelerator IP 地址。将 Global Accelerator 配置为保留客户端 IP 地址并启用 AWS WAF 阻止来自应用程序负载均衡器的连接时(这些连接并非来自 Global Accelerator），客户端 IP 地址会显示在 AWS WAF 中。
+ 支持 Global Accelerator 的所有 AWS 区域 都支持客户端 IP 地址保留功能。有关受支持的 区域的列表，请参阅[AWS Global Accelerator 支持的 AWS 区域](preserve-client-ip-address.regions.md)。

创建新加速器时，默认情况下会为支持的端点启用客户端 IP 地址保留。是否默认启用客户端 IP 地址保留取决于端点类型：
+ 在 Global Accelerator 中使用面向互联网的应用程序负载均衡器作为端点时，新加速器会默认启用客户端 IP 地址保留。在创建加速器时您可以选择禁用该选项，也可以在稍后编辑加速器。
+ 在 Global Accelerator 中使用内部应用程序负载均衡器或 EC2 实例时，端点始终启用客户端 IP 地址保留。
+ 在 Global Accelerator 中添加带有安全组的网络负载均衡器作为端点时，默认不启用客户端 IP 地址保留。

请注意以下事项：
+ 内部应用程序负载均衡器和 EC2 实例始终启用客户端 IP 地址保留。对于这些端点，您无法禁用该选项。
+ 使用 AWS 控制台创建新加速器时，对于应用程序负载均衡器端点，“客户端 IP 地址保留”选项默认处于启用状态。对于带有安全组的网络负载均衡器端点，该选项默认处于不启用状态。添加端点后，您可以随时更新这些端点的“客户端 IP 地址保留”选项。
+ 使用 AWS CLI 或 API 操作创建新加速器且未指定“客户端 IP 地址保留”选项时，以下是客户端 IP 地址保留的默认设置：
  + 面向互联网的应用程序负载均衡器端点默认启用客户端 IP 地址保留。
  + 带有安全组的网络负载均衡器端点默认*不*启用客户端 IP 地址保留。

对于现有的加速器，您可以将不具有客户端 IP 地址保留功能的端点转换到保留客户端 IP 地址的端点。例如，现有的应用程序负载均衡器端点可以转换到新的应用程序负载均衡器端点。要转换到新端点，我们建议您执行以下操作，将流量从现有端点逐步转移到保留客户端 IP 地址的新端点：
+ 对于带有安全组的现有应用程序负载均衡器或网络负载均衡器端点，请先向 Global Accelerator 添加一个针对相同后端的重复的负载均衡器端点，并确保已启用客户端 IP 地址保留。然后调整端点的权重，将流量从*不具有*客户端 IP 地址保留功能的负载均衡器逐步转移到*具有*客户端 IP 地址保留功能的负载均衡器。
+ 对于现有的弹性 IP 地址端点，您可以将流量转移到具有客户端 IP 地址保留功能的 EC2 实例端点。首先向 Global Accelerator 添加 EC2 实例端点，然后调整端点的权重，将流量从弹性 IP 地址端点逐步转移到 EC2 实例端点。

有关分步转换指导，请参阅[转换端点以使用客户端 IP 地址保留功能](about-endpoints.sipp.md#about-endpoints.transition-to-IP-preservation)。

# 对保留客户端 IP 地址的端点的要求
<a name="about-endpoints.sipp-caveats"></a>

使用客户端 IP 地址保留功能对端点类型有一些特定的要求。> 您可以将此功能用于应用程序负载均衡器、带有安全组的网络负载均衡器和 Amazon EC2 实例类型端点，但须遵守本节中描述的其它要求。自定义路由加速器上的端点始终保留客户端 IP 地址。

本节介绍了与要添加的具有客户端 IP 地址保留功能的端点相关的特定信息。有关端点总体要求的信息，请参阅[对可添加为加速器端点的资源的要求](about-endpoints-caveats.md)。

此外，有关客户端 IP 地址保留的最佳实践的更多信息，请参阅[具有客户端 IP 地址保留功能的 ENI 和安全组的最佳实践](best-practices-aga.md)。

如果您打算使用客户端 IP 地址保留功能，除了对 Global Accelerator 中端点的总体要求外，在向 Global Accelerator 添加端点时还需注意以下事项。

**弹性 IP 地址**  
Global Accelerator 中的弹性 IP 地址端点不支持客户端 IP 地址保留。

**网络负载均衡器端点**  
如果您想在 Global Accelerator 中添加网络负载均衡器资源作为端点时启用客户端 IP 地址保留，请注意以下情况不支持客户端 IP 地址保留功能：  
+ 不带安全组的网络负载均衡器
+ 带有安全组且安全组连接了 TLS 侦听器的网络负载均衡器
+ 带有安全组且安全组对其 EC2 目标执行 IPv4 到 IPv6 的 NAT 转换的网络负载均衡器
此外，对于网络负载均衡器，仅当目标与网络负载均衡器位于同一 VPC 中时，才支持客户端 IP 地址保留功能。流量必须直接从网络负载均衡器流向目标。

**弹性网络接口**  
为了支持客户端 IP 地址保留功能，Global Accelerator 会在您的 AWS 账户中创建弹性网络接口，每个存在端点的子网都有一个弹性网络接口。有关 Global Acccelerator 如何使用弹性网络接口的更多信息，请参阅[具有客户端 IP 地址保留功能的 ENI 和安全组的最佳实践](best-practices-aga.md)。

**私有子网中的端点**  
您可以使用 Global Accelerator 将应用程序负载均衡器、网络负载均衡器或私有子网中的 EC2 实例作为目标，但必须将[互联网网关](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)连接到包含端点的 VPC。有关更多信息，请参阅 [AWS Global Accelerator 中的安全 VPC 连接](secure-vpc-connections.md)。  
最为最佳实践，如果要确保流量仅由 Global Accelerator 传送，请使用私有子网。此外，请确保恰当配置入站安全组规则，以正确允许或拒绝应用程序的流量。

**将客户端 IP 地址添加到允许列表**  
在您添加流量并开始将流量路由到保留客户端 IP 地址的端点之前，请确保更新所有必需的安全配置（例如安全组），以便在允许列表中包含用户客户端 IP 地址。网络访问控制列表（ACL）仅适用于出口（出站）流量。如果您需要筛选入口（入站）流量，则必须使用安全组。

**配置网络访问控制列表（ACL）**  
在加速器上启用客户端 IP 地址保留时，与您的 VPC 子网关联的网络 ACL 将适用于出口（出站）流量。但是，要允许流量通过 Global Accelerator 流出，必须将 ACL 配置为入站和出站规则。  
例如，要允许使用临时源端口的 TCP 和 UDP 客户端通过 Global Accelerator 连接到端点，请将端点的子网与允许发往临时 TCP 或 UDP 端口（端口范围 1024-65535，目标 0.0.0.0/0）的出站流量的网络 ACL 相关联。此外，创建匹配的入站规则（端口范围 1024-65535，源 0.0.0.0/0）。  
对于安全组和 WAF 请注意以下事项：  
+ 安全组和 AWS WAF 规则是用来保护资源的一组附加功能。例如，与您的 Amazon EC2 实例和应用程序负载均衡器关联的入站安全组规则允许您控制客户端可以通过 Global Accelerator 连接的目标端口，例如 HTTP 的端口 80 或 HTTPS 的 443 端口。
+ Amazon EC2 实例安全组适用于到达实例的任何流量，包括来自 Global Accelerator 的流量以及分配给实例的任何公有或弹性 IP 地址。

# 如何在 AWS Global Accelerator 中保留客户端 IP 地址
<a name="preserve-client-ip-address.headers"></a>

对于 Amazon EC2 实例、网络负载均衡器和应用程序负载均衡器，AWS Global Accelerator 以不同的方式保留客户端的源 IP 地址：
+ 对于 EC2 实例端点，会为所有流量保留客户端的 IP 地址。
+ 对于具有客户端 IP 地址保留功能的网络负载均衡器端点，Global Accelerator 与网络负载均衡器协作，在数据包的 IP 标头中包含原始客户端的 IP 地址，以便您的应用程序可以访问它。
+ 对于具有客户端 IP 地址保留功能的应用程序负载均衡器端点，Global Accelerator 与应用程序负载均衡器协作，提供 `X-Forwarded` 标头 `X-Forwarded-For`（其中包含原始客户端的 IP 地址），以便您的网络层可以访问它。

HTTP 请求和 HTTP 响应使用标头字段发送有关 HTTP 消息的信息。标头字段为冒号分隔的名称值对，各个值对之间由回车符 (CR) 和换行符 (LF) 进行分隔。RFC 2616 [信息标头](https://tools.ietf.org/html/rfc2616#section-4.2)中定义了标准 HTTP 标头字段集。此外还有应用程序广泛使用的非标准 HTTP 标头。某些非标准 HTTP 标头具有 `X-Forwarded` 前缀。

由于应用程序负载均衡器会终止传入的 TCP 连接并创建后端目标的新连接，因此它不会将客户端 IP 地址一直保留到目标代码（例如实例、容器或 Lambda 代码）中。您的目标在 TCP 数据包中看到的源 IP 地址是应用程序负载均衡器的 IP 地址。但是，应用程序负载均衡器确实保留了原始客户端 IP 地址，方法是先将其从原始数据包的回复地址中删除，再将其插入到 HTTP 标头中，然后通过新的 TCP 连接将请求发送到您的后端。

`X-Forwarded-For` 请求标头的格式如下所示：

```
X-Forwarded-For: client-ip-address
```

下面是 IP 地址为 203.0.113.7 的客户端的 `X-Forwarded-For` 请求标头的示例。

```
X-Forwarded-For: 203.0.113.7
```

下面是 IPv6 地址为 2001:DB8::21f:5bff:febf:ce22:8a2e 的客户端的 `X-Forwarded-For` 请求标头的示例。

```
X-Forwarded-For: 2001:DB8::21f:5bff:febf:ce22:8a2e
```

# 客户端 IP 地址保留的优势
<a name="preserve-client-ip-address.benefits-of-preservation"></a>

您可以在 Global Accelerator 中为特定端点配置客户端 IP 地址保留。对于使用 AWS Global Accelerator 配置的一些应用程序，您可能需要使用具有客户端 IP 地址保留功能的端点来访问原始客户端 IP 地址。

例如，如果您拥有客户端 IP 地址，则可以根据客户端 IP 地址收集统计信息。您还可以使用基于 IP 地址的筛选条件（例如[应用程序负载均衡器上的安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html)）来筛选流量。您可以使用负载均衡器的 `X-Forwarded-For` 标头（其中包含原始客户端 IP 地址信息）在运行于应用程序负载均衡器端点后的 Web 层服务器之上的应用程序中应用特定于用户 IP 地址的逻辑。您还可以在与应用程序负载均衡器或网络负载均衡器关联的安全组的安全组规则中使用客户端 IP 地址保留功能。有关更多信息，请参阅 [如何在 AWS Global Accelerator 中保留客户端 IP 地址](preserve-client-ip-address.headers.md)。对于 EC2 实例端点，会保留原始客户端 IP 地址。

对于未启用客户端 IP 地址保留的端点，边缘网络上的 Global Accelerator 服务使用的 IP 地址会将请求用户的 IP 地址替换为到达数据包中的源地址。流量流向加速器后面的系统时，将不会保留原始客户端的连接信息（例如客户端的 IP 地址和客户端的端口）。这适用于许多应用程序，尤其是那些可供所有用户使用的应用程序，例如公共网站。

对于不具有客户端 IP 地址保留功能的端点，您可以筛选 Global Accelerator 从边缘转发流量时使用的源 IP 地址。通过查看 Global Accelerator 流日志，您可以看到有关传入数据包的源 IP 地址（启用客户端 IP 地址保留时，这些地址也是客户端 IP 地址）的信息。有关更多信息，请参阅[Global Accelerator 边缘服务器的位置和 IP 地址范围](introduction-ip-ranges.md) 和[在 AWS Global Accelerator 中配置和使用流日志](monitoring-global-accelerator.flow-logs.md)。

# 具有客户端 IP 地址保留功能的 ENI 和安全组的最佳实践
<a name="best-practices-aga"></a>

在 AWS Global Accelerator 中使用客户端 IP 地址保留功能时，请记住本节中有关弹性网络接口（ENI）和安全组的信息和最佳实践。

为了支持客户端 IP 地址保留功能，Global Accelerator 会在您的 AWS 账户中创建弹性网络接口，每个存在端点的子网都有一个弹性网络接口。弹性网络接口 是 VPC 中表示虚拟网卡的逻辑网络组件。Global Accelerator 使用这些弹性网络接口将流量路由到加速器后面配置的端点。支持以这种方式路由流量的端点包括应用程序负载均衡器（内部和面向互联网）、带有安全组的网络负载均衡器以及 Amazon EC2 实例。

**注意**  
在 Global Accelerator 中添加内部应用程序负载均衡器或 EC2 实例端点时，您可以通过将互联网流量定位到私有子网中，让互联网流量直接流入虚拟私有云（VPC）中的端点或从这些端点中流出。有关更多信息，请参阅 [AWS Global Accelerator 中的安全 VPC 连接](secure-vpc-connections.md)。

**Global Accelerator 如何使用弹性网络接口**  
您具有启用了客户端 IP 地址保留的应用程序负载均衡器或网络负载均衡器端点时，负载均衡器所在的子网数量将决定 Global Accelerator 在您的账户中创建的弹性网络接口的数量。Global Accelerator 会为每个子网创建一个弹性网络接口，这些子网中至少有一个应用程序负载均衡器或网络负载均衡器的弹性网络接口，作为您账户中加速器的前端。  
以下示例说明了它的工作原理：  
+ **示例 1：**如果应用程序负载均衡器在子网 A 和子网 B 中具有弹性网络接口，然后您将该负载均衡器添加为加速器端点，则 Global Accelerator 会创建两个弹性网络接口，每个子网中一个。
+ **示例 2：**如果将在子网 A 和子网 B 中具有弹性网络接口的 ALB1 添加到 Accelerator1，然后将在子网 A 和子网 B 中具有弹性网络接口的 ALB2 添加到 Accelerator2，则 Global Accelerator 仅创建两个弹性网络接口：一个在子网 A 中，一个在子网 B 中。
+ **示例 3：**如果将在子网 A 和子网 B 中具有弹性网络接口的 ALB1 添加到 Accelerator1，然后将在子网 A 和子网 C 中具有弹性网络接口的 ALB2 添加到 Accelerator2，则 Global Accelerator 会创建三个弹性网络接口：一个在子网 A 中，一个在子网 B 中，一个在子网 C 中。子网 A 中的弹性网络接口为 Accelerator1 和 Accelerator2 提供流量。
如示例中 3 所示，如果同一子网中的端点位于多个加速器后端，则弹性网络接口可在加速器之间重复使用。  
Global Accelerator 创建的逻辑弹性网络接口并不呈现单台主机、吞吐量瓶颈或单点故障。与其它在可用区或子网中显示为单个弹性网络接口的 AWS 服务（例如网络地址转换（NATI）网关或网络负载均衡器等 服务）一样，Global Accelerator 是作为水平扩缩的高可用性服务实施的。  
估算加速器中端点使用的子网数量，以确定 Global Accelerator 将创建的弹性网络接口的数量。在创建加速器之前，请确保有足够的 IP 地址空间容量来容纳所需的弹性网络接口：即每个相关子网至少有一个空闲的 IP 地址。如果您没有足够的空闲 IP 地址空间，则必须为应用程序负载均衡器或网络负载均衡器以及相关的 Global Accelerator 弹性网络接口创建或使用一个有足够空闲 IP 地址空间的子网。  
当 Global Accelerator 确定账户中存在并未被加速器中的任何端点使用的弹性网络接口时，Global Accelerator 会删除该接口。

**Global Acccelerator 创建的安全组**  
在使用 Global Accelerator 和安全组时，请查看以下信息和最佳实践。  
+ 您可以将 Global Accelerator 创建的安全组用作您维护的其他安全组中的源组，但是 Global Accelerator 只能将流量转发到您在 VPC 中指定的目标。
+ 如果您修改 Global Accelerator 创建的安全组规则，则端点的运行状况可能会变得不佳。如果发生这种情况，请联系[AWS Support ](https://console.aws.amazon.com/support/home)寻求帮助。
+ Global Accelerator 会为每个 VPC 创建一个特定的安全组。无论弹性网络接口与哪个子网关联，为特定 VPC 内的端点创建的弹性网络接口均使用同一个安全组。

**重要**  
Global Accelerator 会创建与其弹性网络接口关联的安全组。尽管系统不会阻止，但您不应对这些组的任何安全组设置进行编辑。

# 具有客户端 IP 地址保留功能的转换端点
<a name="about-endpoints.sipp"></a>

如果您尚未为加速器中的端点配置客户端 IP 地址保留，请按照本节中的指南进行操作，添加一个或多个端点，并将其转换到保留用户客户端 IP 地址的端点。您可以选择将应用程序负载均衡器、带有安全组的网络负载均衡器或弹性 IP 地址端节转换到具有客户端 IP 地址保留功能的相应端点（相应的负载均衡器端点或 EC2 实例端点）。

本节介绍了如何使用 AWS Global Accelerator 控制台添加和转换端点。要将 API 操作与 Global Accelerator 结合使用，请参阅 [AWS Global Accelerator API 参考](https://docs.aws.amazon.com/global-accelerator/latest/api/Welcome.html)。

## 转换端点以使用客户端 IP 地址保留功能
<a name="about-endpoints.transition-to-IP-preservation"></a>

我们建议您逐步将端点转换到使用客户端 IP 地址保留功能的端点。
+ **添加新端点：**首先，向 Global Accelerator 中添加将新的负载均衡器或 EC2 实例端点，以便您可以保留客户端 IP 地址。
+ **逐步增加流量：**然后通过在端点上配置权重，将流量从现有端点逐步转移到新端点。
+ **随用随测：**将少量流量转移到具有客户端 IP 地址保留功能的新端点后，进行测试以确保您的配置按预期运行。然后，通过调整相应端点的权重，逐渐增加流向新端点的流量比例。

按照以下各节中的步骤转换端点。

支持 Global Accelerator 的所有 AWS 区域 都支持客户端 IP 地址保留功能。有关受支持的 区域的列表，请参阅[AWS Global Accelerator 支持的 AWS 区域](preserve-client-ip-address.regions.md)。

**重要**  
在开始将流量路由到保留客户端 IP 地址的端点之前，请确保已将允许列表中包含 Global Accelerator 客户端 IP 地址的所有配置都更新为包含用户客户端 IP 地址。

## 添加具有客户端 IP 地址保留功能的端点


1. 通过以下网址打开 Global Accelerator 控制台：[https://console.aws.amazon.com/globalaccelerator/home](https://console.aws.amazon.com/globalaccelerator/home)。

1. 在“加速器”页面上，选择一个加速器。

1. 在**侦听器**部分中，选择一个侦听器。

1. 在**端点组**部分中，选择一个端点组。

1. 在**端点**部分中，选择**添加端点**。

1. 在**添加端点**页面找到**端点**下拉菜单，从中选择支持客户端 IP 地址保留的端点。

1. 在**权重**字段中，与为现有端点设置的权重相比，选择一个较低的数字。例如，如果相应的应用程序负载均衡器的权重为 255，则可以先为新的应用程序负载均衡器输入权重 5。有关更多信息，请参阅 [如何通过端点权重管理流量](about-endpoints-endpoint-weights.md)。

1. 如果需要，在**保留客户端 IP 地址**下，选择**保留地址**。

1. 选择 **Save changes（保存更改）**。

接下来，按照此处的步骤编辑相应的现有端点（要用具有客户端 IP 地址保留功能的新端点替换掉的端点），来降低现有端点的权重，从而减少流向这些端点的流量。

## 要减少现有端点的流量


1. 在**端点组**页面上，选择不具有客户端 IP 地址保留功能的现有端点。

1. 选择**编辑**。

1. 在**编辑端点**页面的**权重**字段中，输入一个小于当前数字的数字。例如，如果现有端点的权重为 255，则可以为新端点输入 220 的权重（具有客户端 IP 地址保留功能）。

1. 选择 **Save changes（保存更改）**。

通过将新端点权重设置为较低的数字，对原始流量的一小部分进行测试后，您可以继续调整原始端点和新端点的权重来逐步转换所有流量。

例如，假设您从权重设置为 200 的现有应用程序负载均衡器开始，然后添加一个新的应用程序负载均衡器端点（该端点具有客户端 IP 地址保留功能），权重设置为 5。通过增加新应用程序负载均衡器的权重和减少原始应用程序负载均衡器的权重，逐步将流量从原始应用程序负载均衡器转移到新的应用程序负载均衡器。例如：
+ 原始权重 190/新权重 10
+ 原始权重 180/新权重 20
+ 原始权重 170/新权重 30，依此类推。

将原始端点的权重降低到 0 后，所有流量（在本示例场景中）都将流向新的应用程序负载均衡器端点（具有客户端 IP 地址保留功能）。

如果您还有其它端点（负载均衡器或 EC2 实例）需要转换到使用客户端 IP 地址保留功能的端点，请重复本节中的步骤进行转移。

如果您需要恢复端点的配置，以使流向该端点的流量不保留客户端 IP 地址，则可以随时这样做：先将*不具有*客户端 IP 地址保留功能的端点的权重增加到原始值，然后将*具有*客户端 IP 地址保留功能的端点的权重降低到 0。