

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

# AWS Client VPN 的工作原理
<a name="how-it-works"></a>

在 AWS Client VPN 中，有两种类型的用户角色与 Client VPN 端点交互：管理员和客户端。

Client VPN 支持 IPv4、IPv6 和双堆栈（IPv4 和 IPv6）连接。您可以创建使用 IPv4、IPv6 或两者的端点，从而允许您连接到 VPC 中的 IPv6 资源或从 IPv6 网络上的客户端进行连接。这种灵活性可以帮助已经实施或正在过渡到 IPv6 基础设施的组织。

*管理员*负责设置和配置服务。这包括创建 Client VPN 端点、关联目标网络、配置授权规则，以及设置额外的路由（如果需要）。在设置和配置 Client VPN 端点后，管理员下载 Client VPN 端点配置文件并将其分发给需要访问的客户端。Client VPN 端点配置文件包含 Client VPN 端点的 DNS 名称和建立 VPN 会话所需的身份验证信息。有关设置服务的更多信息，请参阅 [开始使用 AWS Client VPN](cvpn-getting-started.md)。

*客户端* 是最终用户。这是连接到 Client VPN 端点以建立 VPN 会话的人。客户端使用基于 OpenVPN 的 VPN 客户端应用程序从其本地计算机或移动设备上建立 VPN 会话。建立 VPN 会话后，它们就可以安全地访问关联子网所在的 VPC 中的资源。如果已配置所需的路由和授权规则，则客户端还可以访问 AWS、本地网络或其他客户端中的其他资源。有关连接到 Client VPN 端点以建立 VPN 会话的更多信息，请参阅《AWS Client VPN 用户指南》**中的[入门](https://docs.aws.amazon.com/vpn/latest/clientvpn-user/user-getting-started.html)。

下图阐明基本的 Client VPN 架构。

![\[Client VPN 架构\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/architecture.png)


## Client VPN 场景和示例
<a name="scenario"></a>

AWS Client VPN 是一种完全托管的远程访问 VPN 解决方案，便于客户端安全地访问 AWS 和本地网络内的资源。有多个选项可用于配置访问权限。本部分提供为您的客户端创建和配置 Client VPN 访问的示例。

**场景**
+ [使用 Client VPN 访问 VPC](#scenario-vpc)
+ [使用 Client VPN 访问对等 VPC](#scenario-peered)
+ [使用 Client VPN 访问本地网络](#scenario-onprem)
+ [使用 Client VPN 访问 Internet](#scenario-internet)
+ [使用 Client VPN 进行客户端到客户端访问](#scenario-client-to-client)
+ [使用 Client VPN 限制对网络的访问](#scenario-restrict)

### 使用 Client VPN 访问 VPC
<a name="scenario-vpc"></a>

此场景的 AWS Client VPN 配置包括单一目标 VPC。如果您需要向客户端授予仅对于单个 VPC 中的资源的访问权限，我们建议您采用此配置。

![\[访问 VPC 的 Client VPN\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-scenario-vpc.png)


开始之前，请执行以下操作：
+ 创建或确定至少具有一个子网的 VPC。确定 VPC 中要与 Client VPN 端点关联的子网并记下其 IPv4 CIDR 范围。
+ 为与 VPC CIDR 不重叠的客户端 IP 地址确定合适的 CIDR 范围。
+ 查看[使用规则和最佳实践 AWS Client VPN](what-is-best-practices.md)中的 Client VPN 终端节点的规则和限制。

**实施此配置**

1. 在 VPC 所在的区域中创建 Client VPN 终端节点。要执行此操作，请执行 [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md) 中介绍的步骤。

1. 将子网与 Client VPN 端点相关联。要执行此操作，请执行[将目标网络与 AWS Client VPN 终端节点关联](cvpn-working-target-associate.md)中介绍的步骤，并选择您之前确定的子网和 VPC。

1. 添加授权规则以向客户端授予访问 VPC 的权限。要执行此操作，请执行[添加授权规则](cvpn-working-rule-authorize-add.md)中介绍的步骤，而对于**目标网络**，输入 VPC 的 IPv4 CIDR 范围。

1. 向资源的安全组添加规则，以允许来自在步骤 2 中应用到子网关联的安全组的流量。有关更多信息，请参阅 [安全组](client-authorization.md#security-groups)。

### 使用 Client VPN 访问对等 VPC
<a name="scenario-peered"></a>

此场景的 AWS Client VPN 配置包括与另一个 VPC（VPC B）对等连接的目标 VPC（VPC A）。如果您需要向客户端授予对目标 VPC 以及其他与其对等的 VPC（例如，VPC B）中资源的访问权限，建议您采用此配置。

**注意**  
仅当在拆分隧道模式下配置 Client VPN 端点时，才需要执行允许访问对等 VPC 的过程（在网络图后概述）。在全隧道模式下，原定设置情况下允许访问对等 VPC。

![\[访问对等 VPC 的 Client VPN\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-scenario-peer-vpc.png)


开始之前，请执行以下操作：
+ 创建或确定至少具有一个子网的 VPC。确定 VPC 中要与 Client VPN 端点关联的子网并记下其 IPv4 CIDR 范围。
+ 为与 VPC CIDR 不重叠的客户端 IP 地址确定合适的 CIDR 范围。
+ 查看[使用规则和最佳实践 AWS Client VPN](what-is-best-practices.md)中的 Client VPN 终端节点的规则和限制。

**实施此配置**

1. 在 VPC 之间建立 VPC 对等连接。按照 *Amazon VPC 对等指南* 中的[创建并接受 VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)的步骤进行操作。确认 VPC A 中的实例可以使用对等连接与 VPC B 中的实例通信。

1. 在目标 VPC 所在的同一个区域中创建 Client VPN 端点。在图中，这是 VPC A。执行[创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md)中介绍的步骤。

1. 将您确定的子网与您创建的 Client VPN 端点关联。要执行此操作，请执行[将目标网络与 AWS Client VPN 终端节点关联](cvpn-working-target-associate.md)中介绍的步骤，同时选择 VPC 和子网。原定设置情况下，我们将 VPC 的原定设置安全组与 Client VPN 端点相关联。您可以使用[将安全组应用于中的目标网络 AWS Client VPN](cvpn-working-target-apply.md)中所述的步骤关联不同的安全组。

1. 添加授权规则以向客户端授予访问目标 VPC 的权限。要执行此操作，请执行 [添加授权规则](cvpn-working-rule-authorize-add.md) 中介绍的步骤。对于**要启用的目标网络**，输入 VPC 的 IPv4 CIDR 范围。

1. 添加路由以将流量定向到对等 VPC。在图中，这是 VPC B。要执行此操作，请执行[创建 AWS Client VPN 端点路由](cvpn-working-routes-create.md)中介绍的步骤。对于**路由目标**，输入对等 VPC 的 IPv4 CIDR 范围。对于**目标 VPC 子网 ID**，选择与 Client VPN 端点关联的子网。

1. 添加授权规则以向客户端授予访问对等 VPC 的权限。要执行此操作，请执行 [添加授权规则](cvpn-working-rule-authorize-add.md) 中介绍的步骤。对于**目标网络**，输入对等 VPC 的 IPv4 CIDR 范围。

1. 向 VPC A 和 VPC B 中实例的安全组添加规则，以允许来自在步骤 3 中应用了Client VPN 端点的安全组的流量。有关更多信息，请参阅 [安全组](client-authorization.md#security-groups)。

### 使用 Client VPN 访问本地网络
<a name="scenario-onprem"></a>

此场景的 AWS Client VPN 配置仅包括访问本地网络。如果您需要向客户端授予仅对于本地网络中资源的访问权限，我们建议您采用此配置。

![\[访问本地网络的 Client VPN\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-scenario-on-premises.png)


开始之前，请执行以下操作：
+ 创建或确定至少具有一个子网的 VPC。确定 VPC 中要与 Client VPN 端点关联的子网并记下其 IPv4 CIDR 范围。
+ 为与 VPC CIDR 不重叠的客户端 IP 地址确定合适的 CIDR 范围。
+ 查看[使用规则和最佳实践 AWS Client VPN](what-is-best-practices.md)中的 Client VPN 终端节点的规则和限制。

**实施此配置**

1. 通过 AWS Site-to-Site VPN 连接在 VPC 与您自己的本地网络之间进行通信。要执行此操作，请执行 *AWS Site-to-Site VPN 用户指南*中的[使用入门](https://docs.aws.amazon.com/vpn/latest/s2svpn/SetUpVPNConnections.html)中描述的步骤。
**注意**  
或者，您可以通过使用 VPC 和本地网络之间的 Direct Connect 连接来实现此方案。有关更多信息，请参阅 [Direct Connect 用户指南](https://docs.aws.amazon.com/directconnect/latest/UserGuide/)。

1. 测试您在上一步中创建的 AWS Site-to-Site VPN 连接。要执行此操作，请执行 *AWS Site-to-Site VPN 用户指南*中的[测试 Site-to-Site VPN 连接](https://docs.aws.amazon.com/vpn/latest/s2svpn/HowToTestEndToEnd_Linux.html)中介绍的步骤。如果 VPN 连接按预期正常工作，则继续执行下一步。

1. 在 VPC 所在的区域中创建 Client VPN 终端节点。要执行此操作，请执行 [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md) 中介绍的步骤。

1. 将先前确定的子网与 Client VPN 终端节点关联。要执行此操作，请执行 [将目标网络与 AWS Client VPN 终端节点关联](cvpn-working-target-associate.md) 中介绍的步骤，并选择 VPC 和子网。

1. 添加一个路由，该路由允许访问 AWS Site-to-Site VPN 连接。要执行此操作，请执行 [创建 AWS Client VPN 端点路由](cvpn-working-routes-create.md) 中介绍的步骤；对于**路由目标**，请输入 AWS Site-to-Site VPN 连接的 IPv4 CIDR 范围，对于 **目标 VPC 子网 ID**，请选择与 Client VPN 端点关联的子网。

1. 添加授权规则以向客户端授予访问 AWS Site-to-Site VPN 连接的权限。要执行此操作，请执行 [向 AWS Client VPN 终端节点添加授权规则](cvpn-working-rule-authorize-add.md) 中介绍的步骤，而对于**目标网络**，请输入 AWS Site-to-Site VPN 连接 IPv4 CIDR 范围。

### 使用 Client VPN 访问 Internet
<a name="scenario-internet"></a>

此场景的 AWS Client VPN 配置包括单一目标 VPC 和对 Internet 的访问。如果您需要向客户端授予对单一目标 VPC 中资源的访问权限并另外允许访问 Internet，建议您采用此配置。

如果您完成了 [开始使用 AWS Client VPN](cvpn-getting-started.md)教程，则您已实现了本场景。

![\[访问 Internet 的 Client VPN\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-scenario-igw.png)


开始之前，请执行以下操作：
+ 创建或确定至少具有一个子网的 VPC。确定 VPC 中要与 Client VPN 端点关联的子网并记下其 IPv4 CIDR 范围。
+ 为与 VPC CIDR 不重叠的客户端 IP 地址确定合适的 CIDR 范围。
+ 查看[使用规则和最佳实践 AWS Client VPN](what-is-best-practices.md)中的 Client VPN 终端节点的规则和限制。

**实施此配置**

1. 确保您将用于 Client VPN 端点的安全组允许发送到 Internet 的出站流量。为此，请添加允许发送到 0.0.0.0/0 的 HTTP 和 HTTPS 流量的出站规则。

1. 创建 Internet 网关并将其附加到 VPC。有关更多信息，请参阅 *Amazon VPC 用户指南* 中的[创建并附加 Internet 网关](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway)。

1. 通过将通向 Internet 网关的路由添加到路由表，使子网成为公用子网。在 VPC 控制台中，选择 **Subnets**（子网），选择要与 Client VPN 端点关联的子网，选择 **Route Table**（路由表），然后选择路由表 ID。选择**操作**，选择 **Edit routes (编辑路由)**，然后选择**添加路由**。对于 **Destination (目的地)**，输入 `0.0.0.0/0`，然后为 **Target (目标)** 选择上一步中的 Internet 网关。

1. 在 VPC 所在的区域中创建 Client VPN 终端节点。要执行此操作，请执行 [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md) 中介绍的步骤。

1. 将先前确定的子网与 Client VPN 终端节点关联。要执行此操作，请执行 [将目标网络与 AWS Client VPN 终端节点关联](cvpn-working-target-associate.md) 中介绍的步骤，并选择 VPC 和子网。

1. 添加授权规则以向客户端授予访问 VPC 的权限。要执行此操作，请执行[添加授权规则](cvpn-working-rule-authorize-add.md)中介绍的步骤，而对于**要启用的目标网络**，输入 VPC 的 IPv4 CIDR 范围。

1. 添加允许进入 Internet 的流量的路由。要执行此操作，请执行[创建 AWS Client VPN 端点路由](cvpn-working-routes-create.md)中介绍的步骤；对于 **Route destination**（路由目标），输入 `0.0.0.0/0`，对于 **Target VPC Subnet ID**（目标 VPC 子网 ID），选择与 Client VPN 端点关联的子网。

1. 添加授权规则以向客户端授予访问 Internet 的权限。要执行此操作，请执行[添加授权规则](cvpn-working-rule-authorize-add.md)中介绍的步骤，而对于**目标网络**，输入 `0.0.0.0/0`。

1. 确保 VPC 中资源的安全组具有一条规则，该规则允许从与 Client VPN 端点关联的安全组进行访问。这将允许您的客户端访问 VPC 中的资源。

### 使用 Client VPN 进行客户端到客户端访问
<a name="scenario-client-to-client"></a>

此场景的 AWS Client VPN 配置使客户端能够访问单个 VPC，并支持客户端相互路由流量。如果连接到同一 Client VPN 端点的客户端也需要相互通信，我们建议使用此配置。当客户端连接到 Client VPN 端点时，客户端可以使用从客户端 CIDR 范围分配给它们的唯一 IP 地址相互通信。

![\[客户端到客户端访问\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-scenario-client-to-client.png)


开始之前，请执行以下操作：
+ 创建或确定至少具有一个子网的 VPC。确定 VPC 中要与 Client VPN 端点关联的子网并记下其 IPv4 CIDR 范围。
+ 为与 VPC CIDR 不重叠的客户端 IP 地址确定合适的 CIDR 范围。
+ 查看[使用规则和最佳实践 AWS Client VPN](what-is-best-practices.md)中的 Client VPN 终端节点的规则和限制。

**注意**  
此方案不支持使用 Active Directory 组或基于 SAML 的 IdP 组的基于网络的授权规则。

**实施此配置**

1. 在 VPC 所在的区域中创建 Client VPN 终端节点。要执行此操作，请执行 [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md) 中介绍的步骤。

1. 将先前确定的子网与 Client VPN 终端节点关联。要执行此操作，请执行 [将目标网络与 AWS Client VPN 终端节点关联](cvpn-working-target-associate.md) 中介绍的步骤，并选择 VPC 和子网。

1. 将路由添加到路由表中的本地网络。要执行此操作，请执行 [创建 AWS Client VPN 端点路由](cvpn-working-routes-create.md) 中介绍的步骤。对于**路由目标**，输入客户端 CIDR 范围；对于**目标 VPC 子网 ID**，指定 `local`。

1. 添加授权规则以向客户端授予访问 VPC 的权限。要执行此操作，请执行 [添加授权规则](cvpn-working-rule-authorize-add.md) 中介绍的步骤。对于**要启用的目标网络**，输入 VPC 的 IPv4 CIDR 范围。

1. 添加授权规则以向客户端授予访问客户端 CIDR 范围的权限。要执行此操作，请执行 [添加授权规则](cvpn-working-rule-authorize-add.md) 中介绍的步骤。对于**要启用的目标网络**，输入客户端 CIDR 范围。

### 使用 Client VPN 限制对网络的访问
<a name="scenario-restrict"></a>

您可以配置 AWS Client VPN 端点以限制对 VPC 中特定资源的访问。对于基于用户的身份验证，您还可以根据访问 Client VPN 终端节点的用户组限制对网络各部分的访问。

#### 使用安全组限制访问
<a name="scenario-restrict-security-groups"></a>

您可以通过添加或删除引用了安全组（应用到目标网络关联的安全组，即 Client VPN 安全组）的安全组规则，授予或拒绝对您 VPC 中特定资源的访问权限。此配置在[使用 Client VPN 访问 VPC](#scenario-vpc) 中介绍的场景基础之上进行了扩展。除了该情景中配置的授权规则之外，还应用此配置。

要授予对特定资源的访问权限，请确定与运行资源的实例相关联的安全组。然后，创建允许来自 Client VPN 安全组的流量的规则。

在下图中，安全组 A 是 Client VPN 安全组，安全组 B 与 EC2 实例相关联，安全组 C 与 EC2 实例相关联。如果您向安全组 B 添加允许从安全组 A 进行访问的规则，则客户端可以访问与安全组 B 关联的实例。如果安全组 C 没有允许从安全组 A 进行访问的规则，则客户端无法访问与安全组 C 关联的实例。

![\[限制对 VPC 中资源的访问\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-scenario-security-groups.png)


在开始之前，请检查 Client VPN 安全组是否与 VPC 中的其他资源相关联。如果您添加或删除引用 Client VPN 安全组的规则，则可能还会授予或拒绝对其他关联资源的访问权限。为防止出现这种情况，请使用专门为与 Client VPN 端点一起使用而创建的安全组。

**创建安全组规则**

1. 通过以下网址打开 Amazon VPC 控制台：[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在导航窗格中，选择 **Security Groups**。

1. 选择与运行您资源的实例相关联的安全组。

1. 选择 **Actions (操作)**、**Edit inbound rules (编辑入站规则)**。

1. 选择 **Add Rule (添加规则)**，然后执行以下操作：
   + 对于 **Type (类型)**，选择 **All traffic (所有流量)** 或要允许的特定流量类型。
   + 对于**源**，请选择**自定义**，然后输入或选择 Client VPN 安全组的 ID。

1. 选择 **Save rules (保存规则)**。

要删除对特定资源的访问权限，请检查与运行资源的实例相关联的安全组。如果存在允许来自 Client VPN 安全组的流量的规则，请将其删除。

**检查安全组规则**

1. 通过以下网址打开 Amazon VPC 控制台：[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在导航窗格中，选择 **Security Groups**。

1. 选择 **Inbound Rules (入站规则)**。

1. 查看规则列表。如果有一个规则，其中 **Source**（源）是 Client VPN 安全组，请选择 **Edit Rules**（编辑规则），然后为该规则选择 **Delete**（删除）（x 图标）。选择 **Save rules (保存规则)**。

#### 根据用户组限制访问
<a name="scenario-restrict-groups"></a>

如果您的 Client VPN 端点配置为进行基于用户的身份验证，则可以授予特定用户组访问网络特定部分的权限。为此，请完成以下步骤：

1. 在 Directory Service 或 IdP 中配置用户和组。有关更多信息，请参阅以下主题：
   + [Client VPN 中的 Active Directory 身份验证](ad.md)
   + [基于 SAML 的联合身份验证的要求和注意事项](federated-authentication.md#saml-requirements)

1. 为 Client VPN 端点创建授权规则，以允许指定的组访问网络的全部或某个部分。有关更多信息，请参阅 [AWS Client VPN 授权规则](cvpn-working-rules.md)。

如果您的 Client VPN 端点配置为进行双向身份验证，则无法配置用户组。创建授权规则时，必须向所有用户授予访问权限。要允许特定用户组访问网络的特定部分，您可以创建多个 Client VPN 端点。例如，对于访问网络的每个用户组，请执行以下操作：

1. 为该用户组创建一组服务器以及客户端证书和密钥。有关更多信息，请参阅 [相互认证 AWS Client VPN](mutual.md)。

1. 创建 Client VPN 终端节点。有关更多信息，请参阅 [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md)。

1. 创建授权规则，以授予对网络全部或某个部分的访问权限。例如，对于管理员使用的 Client VPN 端点，您可以创建授权规则，以授予对整个网络的访问权限。有关更多信息，请参阅 [添加授权规则](cvpn-working-rule-authorize-add.md)。

# 中的客户端身份验证 AWS Client VPN
<a name="client-authentication"></a>

客户端身份验证是在 AWS 云端的第一个入口点实施的。它用于确定是否允许客户端连接到客户端 VPN 终端节点。如果身份验证获得成功，客户端连接到客户端 VPN 终端节点并建立 VPN 会话。如果身份验证失败，连接被拒绝，客户端无法建立 VPN 会话。

客户端 VPN 提供以下类型的客户端身份验证：
+ [Active Directory 身份验证](ad.md)（基于用户）
+ [双向身份验证额](mutual.md)（基于证书）
+ [单点登录（基于 SAML 的联合身份验证）](federated-authentication.md)（基于用户）

您可以单独使用上面的方法之一，也可以将双向身份验证与基于用户的方法结合使用，如下所示：
+ 双向身份验证和联合身份验证
+ 双向身份验证和 Active Directory 身份验证

**重要**  
要创建 Client VPN 端点，无论您使用何种身份验证，都必须在 AWS Certificate Manager中预置服务器证书。有关创建和预置服务器证书的更多信息，请参阅[相互认证 AWS Client VPN](mutual.md)中的步骤。
如果您将双向身份验证和基于用户的身份验证结合使用，则必须使用这两种方法在 VPN 中正确进行身份验证。

# Client VPN 中的 Active Directory 身份验证
<a name="ad"></a>

Client VPN 通过与集成来提供活动目录支持 Directory Service。借助 Active Directory 身份验证，客户端可对照现有 Active Directory 组进行身份验证。使用 Directory Service，Client VPN 可以连接到本地网络中 AWS 或内部网络中配置的现有活动目录。这样，您就可以使用您的现有客户端身份验证基础结构。如果您使用的是本地 Active Directory，并且没有现有的 AWS 托管 Microsoft AD，则必须配置 Active Directory 连接器（AD Connector）。您可以使用一个 Active Directory 服务器对用户进行身份验证。有关 Active Directory 集成的更多信息，请参阅 [AWS Directory Service 管理指南](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/)。

为 AWS 托管的 Microsoft AD 或 AD Connector 启用多重身份验证（MFA）后，Client VPN 支持多重身份验证（MFA）。如果启用了 MFA，客户端在连接到 Client VPN 端点时必须输入用户名、密码和 MFA 代码。有关启用 MFA 的更多信息，请参阅 *AWS Directory Service 管理指南*中的[为 AWS 托管的 Microsoft AD 启用多重身份验证](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_mfa.html)和[为 AD Connector 启用多重身份验证](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ad_connector_mfa.html)。

有关在 Active Directory 中配置用户和组的配额和规则，请参阅[用户和组配额](limits.md#quotas-users-groups)。

# 相互认证 AWS Client VPN
<a name="mutual"></a>

借助双向身份验证，Client VPN 使用证书在客户端和服务器之间执行身份验证。证书是由证书颁发机构（CA）颁发的数字化身份。当客户端尝试连接到 Client VPN 端点时，服务器使用客户端证书对客户端进行身份验证。您必须创建服务器证书和密钥，以及至少一个客户端证书和密钥。

您必须将服务器证书上传到 AWS Certificate Manager (ACM)，并在创建 Client VPN 端点时指定该证书。将服务器证书上载到 ACM 时，还需要指定证书颁发机构 (CA)。如果客户端证书的 CA 与服务器证书的 CA 不同，您只需将客户端证书上传到 ACM。有关 ACM 的更多信息，请参阅 [AWS Certificate Manager 用户指南](https://docs.aws.amazon.com/acm/latest/userguide/)。

您可以为将连接到 Client VPN 端点的每个客户端创建单独的客户端证书和密钥。这使您能够在用户退出组织时撤销特定的客户端证书。在这种情况下，当您创建 Client VPN 端点时，可以为客户端证书指定服务器证书 ARN，前提是客户端证书与服务器证书是由相同 CA 颁发的。

AWS Client VPN 中使用的证书必须符合 [RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile](https://datatracker.ietf.org/doc/html/rfc5280) 中的规定，包括备忘录第 4.2 节中指定的证书扩展。

**注意**  
Client VPN 端点仅支持 1024 位和 2048 位 RSA 密钥大小。此外，客户端证书的“主题”字段中必须具有 CN 属性。  
更新 Client VPN 服务所用的证书（无论是通过 ACM 自动轮换、手动导入新证书还是更新 IAM Identity Center 元数据）时，Client VPN 服务将自动使用较新的证书更新 Client VPN 端点。这是一个自动化流程，最多可能需要 5 个小时。

**Topics**
+ [启用双向身份验证](client-auth-mutual-enable.md)
+ [续订您的服务器证书](mutual-renew.md)

# 启用双向认证 AWS Client VPN
<a name="client-auth-mutual-enable"></a>

你可以在 Windows Linux/MacOS 或 Windows 的 Client VPN 中启用双向身份验证。

------
#### [ Linux/macOS ]

以下过程使用 OpenVPN easy-rsa 生成服务器和客户端证书和密钥，然后将服务器证书和密钥上传到 ACM。有关更多信息，请参阅 [Easy-RSA 3 快速入门自述文件](https://github.com/OpenVPN/easy-rsa/blob/v3.0.6/README.quickstart.md)。

**生成服务器和客户端证书和密钥并将其上传到 ACM**

1. 将 OpenVPN easy-rsa 存储库克隆到本地计算机并导航到 `easy-rsa/easyrsa3` 文件夹。

   ```
   $ git clone https://github.com/OpenVPN/easy-rsa.git
   ```

   ```
   $ cd easy-rsa/easyrsa3
   ```

1. 初始化一个新的 PKI 环境。

   ```
   $ ./easyrsa init-pki
   ```

1. 要构建新的证书颁发机构（CA），请运行此命令并按照提示进行操作。

   ```
   $ ./easyrsa build-ca nopass
   ```

1. 生成服务器证书和密钥。

   ```
   $ ./easyrsa --san=DNS:server build-server-full server nopass
   ```

1. 生成客户端证书和密钥。

   请务必保存客户端证书和客户端私有密钥，因为您配置客户端时需要这些信息。

   ```
   $ ./easyrsa build-client-full client1.domain.tld nopass
   ```

   您可以选择为需要客户端证书和密钥的每个客户端（最终用户）重复此步骤。

1. 将服务器证书和密钥和客户端证书和密钥复制到自定义文件夹，然后导航到此自定义文件夹。

   复制证书和密钥之前，请使用 `mkdir` 命令创建自定义文件夹。以下示例在您的主目录中创建自定义文件夹。

   ```
   $ mkdir ~/custom_folder/
   $ cp pki/ca.crt ~/custom_folder/
   $ cp pki/issued/server.crt ~/custom_folder/
   $ cp pki/private/server.key ~/custom_folder/
   $ cp pki/issued/client1.domain.tld.crt ~/custom_folder
   $ cp pki/private/client1.domain.tld.key ~/custom_folder/
   $ cd ~/custom_folder/
   ```

1. 将服务器证书和密钥以及客户端证书和密钥上传到 ACM。请确保在您打算在其中创建客户端 VPN 终端节点的同一区域中上传证书。以下命令使用 AWS CLI 上传证书。要改为使用 ACM 控制台上传证书，请参阅 *AWS Certificate Manager 用户指南*中的[导入证书](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-api-cli.html)。

   ```
   $ aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt
   ```

   ```
   $ aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt
   ```

   您不必将客户端证书上传到 ACM。如果服务器证书和客户端证书是由相同证书颁发机构 (CA) 颁发，则您可以在创建客户端 VPN 端点时在服务器和客户端中使用服务器证书 ARN。在上述步骤中，使用了相同 CA 来创建两个证书。但是，为了完整起见，其中包括上传客户端证书的步骤。

------
#### [ Windows ]

以下过程安装 Easy-RSA 3.x 软件，并使用它生成服务器和客户端证书和密钥。

**生成服务器和客户端证书和密钥并将它们上载到 ACM**

1. 打开 [EasyRSA 版本](https://github.com/OpenVPN/easy-rsa/releases)页面，然后下载适用于您的 Windows 版本的 ZIP 文件并对它进行解压缩。

1. 打开命令提示符，然后导航到 `EasyRSA-3.x` 文件夹解压缩到的位置。

1. 运行以下命令以打开 EasyRSA 3 shell。

   ```
   C:\Program Files\EasyRSA-3.x> .\EasyRSA-Start.bat
   ```

1. 初始化一个新的 PKI 环境。

   ```
   # ./easyrsa init-pki
   ```

1. 要构建新的证书颁发机构（CA），请运行此命令并按照提示进行操作。

   ```
   # ./easyrsa build-ca nopass
   ```

1. 生成服务器证书和密钥。

   ```
   # ./easyrsa --san=DNS:server build-server-full server nopass
   ```

1. 生成客户端证书和密钥。

   ```
   # ./easyrsa build-client-full client1.domain.tld nopass
   ```

   您可以选择为需要客户端证书和密钥的每个客户端（最终用户）重复此步骤。

1. 退出 EasyRSA 3 shell。

   ```
   # exit
   ```

1. 将服务器证书和密钥和客户端证书和密钥复制到自定义文件夹，然后导航到此自定义文件夹。

   复制证书和密钥之前，请使用 `mkdir` 命令创建自定义文件夹。以下示例在您的 C:\$1 驱动器中创建自定义文件夹。

   ```
   C:\Program Files\EasyRSA-3.x> mkdir C:\custom_folder
   C:\Program Files\EasyRSA-3.x> copy pki\ca.crt C:\custom_folder
   C:\Program Files\EasyRSA-3.x> copy pki\issued\server.crt C:\custom_folder
   C:\Program Files\EasyRSA-3.x> copy pki\private\server.key C:\custom_folder
   C:\Program Files\EasyRSA-3.x> copy pki\issued\client1.domain.tld.crt C:\custom_folder
   C:\Program Files\EasyRSA-3.x> copy pki\private\client1.domain.tld.key C:\custom_folder
   C:\Program Files\EasyRSA-3.x> cd C:\custom_folder
   ```

1. 将服务器证书和密钥以及客户端证书和密钥上传到 ACM。请确保在您打算在其中创建客户端 VPN 终端节点的同一区域中上传证书。以下命令 AWS CLI 使用上传证书。要改为使用 ACM 控制台上传证书，请参阅 *AWS Certificate Manager 用户指南*中的[导入证书](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-api-cli.html)。

   ```
   aws acm import-certificate \
       --certificate fileb://server.crt \ 
       --private-key fileb://server.key \
       --certificate-chain fileb://ca.crt
   ```

   ```
   aws acm import-certificate \
       --certificate fileb://client1.domain.tld.crt \
       --private-key fileb://client1.domain.tld.key \
       --certificate-chain fileb://ca.crt
   ```

   您不必将客户端证书上传到 ACM。如果服务器证书和客户端证书是由相同证书颁发机构 (CA) 颁发，则您可以在创建客户端 VPN 端点时在服务器和客户端中使用服务器证书 ARN。在上述步骤中，使用了相同 CA 来创建两个证书。但是，为了完整起见，其中包括上传客户端证书的步骤。

------

# 续订 AWS Client VPN 服务器证书
<a name="mutual-renew"></a>

您可以续订并重新导入已过期的 Client VPN 服务器证书。根据您使用的 OpenVPN easy-rsa 版本，过程会有所不同。有关更多详细信息，请参阅 [Easy-RSA 3 证书续订和吊销文档](https://github.com/OpenVPN/easy-rsa/blob/master/doc/EasyRSA-Renew-and-Revoke.md)。

**续订服务器证书**

1. 请执行以下操作**之一**：
   + Easy-RSA 版本 3.1.x

     1. 运行证书续订命令。

       ```
       $ ./easyrsa renew server nopass
       ```
   + Easy-RSA 版本 3.2.x

     1. 运行过期命令。

        ```
        $ ./easyrsa expire server
        ```

     1. 签署新证书。

        ```
        $ ./easyrsa --san=DNS:server sign-req server server
        ```

1. 创建一个自定义文件夹，将新文件复制到该文件夹中，然后导航到该文件夹。

   ```
   $ mkdir ~/custom_folder2
   $ cp pki/ca.crt ~/custom_folder2/
   $ cp pki/issued/server.crt ~/custom_folder2/
   $ cp pki/private/server.key ~/custom_folder2/
   $ cd ~/custom_folder2/
   ```

1. 将新文件导入到 ACM。确保将文件导入与 Client VPN 端点相同的区域中。

   ```
   $ aws acm import-certificate \
       --certificate fileb://server.crt \
       --private-key fileb://server.key \
       --certificate-chain fileb://ca.crt \
       --certificate-arn arn:aws:acm:region:123456789012:certificate/12345678-1234-1234-1234-12345678901
   ```

# Client VPN 中的单点登录（基于 SAML 2.0 的联合身份验证）
<a name="federated-authentication"></a>

AWS Client VPN 支持使用 Client VPN 端点的安全断言标记语言 2.0 (SAML 2.0) 进行身份联合。您可以使用支持 SAML 2.0 的身份提供商 (IdPs) 来创建集中式用户身份。然后，您可以将 Client VPN 端点配置为使用基于 SAML 的联合身份验证，并将其与 IdP 关联。用户随之使用其集中式凭证连接到 Client VPN 端点。

**Topics**
+ [启用 SAML](client-auth-enable-saml.md)
+ [身份验证工作流](#federated-authentication-workflow)
+ [基于 SAML 的联合身份验证的要求和注意事项](#saml-requirements)
+ [基于 SAML 的 IdP 配置资源](#saml-config-resources)

# 启用 SAML AWS Client VPN
<a name="client-auth-enable-saml"></a>

 可以通过完成以下步骤为 Client VPN 启用单点登录 SAML。或者，如果您为 Client VPN 端点启用了自助服务门户，请指示用户转到自助服务门户来获取配置文件和 AWS 提供的客户端。有关更多信息，请参阅 [AWS Client VPN 访问自助服务门户](cvpn-self-service-portal.md)。

**要使基于 SAML 的 IdP 能够用于 Client VPN 端点，您必须执行以下操作。**

1. 在您选择的 IdP 中创建基于 SAML 的应用程序以与现有应用程序一起使用 AWS Client VPN，或使用现有应用程序。

1. 配置 IdP 以与 AWS建立信任关系 有关资源，请参阅[基于 SAML 的 IdP 配置资源](federated-authentication.md#saml-config-resources)。

1. 在 IdP 中，生成和下载联合身份元数据文档，该文档将您的组织描述为 IdP。

   此签名 XML 文档用于在 AWS 和 IdP 之间建立信任关系。

1. 在与 Client VPN 终端节点相同的 AWS 账户中创建 IAM SAML 身份提供商。

   IAM SAML 身份提供商使用 IdP AWS 生成的元数据文档定义贵组织的 IdP 信任关系。有关更多信息，请参阅 *IAM 用户指南* 中的[创建 IAM SAML 身份提供商](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。如果稍后更新 IdP 中的应用程序配置，请生成新的元数据文档并更新 IAM SAML 身份提供程序。
**注意**  
您无需创建 IAM 角色即可使用 IAM SAML 身份提供程序。

1. 创建客户端 VPN 终端节点。

   将联合身份验证指定为身份验证类型，并指定您创建的 IAM SAML 身份提供程序。有关更多信息，请参阅[创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md)。

1. 导出[客户端配置文件](cvpn-working-endpoint-export.md)并将其分发给用户。指示用户下载 [AWS 提供的客户端](https://docs.aws.amazon.com/vpn/latest/clientvpn-user/connect-aws-client-vpn-connect.html)的最新版本，然后使用它加载配置文件并连接到 Client VPN 端点。

## 身份验证工作流
<a name="federated-authentication-workflow"></a>

下图针对使用基于 SAML 的联合身份验证的 Client VPN 端点，概述了其身份验证工作流。创建和配置 Client VPN 端点时，您需要指定 IAM SAML 身份提供商。

![\[身份验证工作流\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/federated-auth-workflow.png)


1. 用户在其设备上打开 AWS 提供的客户端，并启动与 Client VPN 端点的连接。

1. Client VPN 端点将根据 IAM SAML 身份提供商提供的信息，将 IdP URL 和身份验证请求发送回客户端。

1.  AWS 提供的客户端会在用户设备上打开一个新的浏览器窗口。浏览器向 IdP 发出请求并显示登录页面。

1. 用户在登录页面上输入其凭证，IdP 将签名 SAML 断言发送回客户端。

1.  AWS 提供的客户端将 SAML 声明发送到 Client VPN 端点。

1. Client VPN 端点验证断言，并允许或拒绝用户的访问。

## 基于 SAML 的联合身份验证的要求和注意事项
<a name="saml-requirements"></a>

以下是基于 SAML 的联合身份验证的要求和注意事项。
+ 有关在基于 SAML 的 IdP 中配置用户和组的配额和规则，请参阅[用户和组配额](limits.md#quotas-users-groups)。
+ SAML 断言和响应必须经过签名。
+ AWS Client VPN 仅支持 SAML 断言中的 “ NotOnOrAfter” NotBefore 和 “” 和 “” 条件。AudienceRestriction
+ 支持的最大 SAML 响应大小为 128 KB。
+ AWS Client VPN 不提供签名的身份验证请求。
+ 不支持 SAML 单点注销。用户可以通过与 AWS 提供的客户端断开连接来注销，也可以[终止连接](cvpn-working-connections-disassociate.md)。
+ Client VPN 端点仅支持单个 IdP。
+ IdP 启用了 Multi-Factor Authentication (MFA) 时支持功能。
+ 用户必须使用 AWS 提供的客户端连接到 Client VPN 端点。必须使用版本 1.2.0 或更高版本。有关更多信息，请参阅[使用 AWS 提供的客户端进行 Connect](https://docs.aws.amazon.com/vpn/latest/clientvpn-user/connect-aws-client-vpn-connect.html)。
+ IdP 身份验证支持以下浏览器：Apple Safari、Google Chrome、Microsoft Edge 和 Mozilla Firefox。
+  AWS 提供的客户端在用户设备上保留 TCP 端口 35001 用于 SAML 响应。
+ 如果使用不正确或恶意 URL 更新了 IAM SAML 身份提供商的元数据文档，则可能会导致用户的身份验证问题，或导致网络钓鱼攻击。因此，建议您使用 AWS CloudTrail 监控对 IAM SAML 身份提供商所做的更新。有关更多信息，请参阅 *IAM 用户指南*中的[使用 AWS CloudTrail记录 IAM 和 AWS STS 调用](https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html)。
+ AWS Client VPN 通过 HTTP 重定向绑定向 IdP 发送 AuthN 请求。因此，IdP 应该支持 HTTP 重定向绑定，并且它应该存在于 IdP 的元数据文档中。
+ 对于 SAML 断言，您必须为 `NameID` 属性使用电子邮件地址格式。
+ 用户名 (`NameID`) 的最大长度为 1024 字节。用户名较长的连接将被拒绝。
+ 更新 Client VPN 服务所用的证书（无论是通过 ACM 自动轮换、手动导入新证书还是更新 IAM Identity Center 元数据）时，Client VPN 服务将自动使用较新的证书更新 Client VPN 端点。这是一个自动化流程，最多可能需要 5 个小时。

## 基于 SAML 的 IdP 配置资源
<a name="saml-config-resources"></a>

下表列出了我们测试过的基 IdPs 于 SAML 的产品 AWS Client VPN，以及可以帮助您配置 IdP 的资源。


| IdP | 资源 | 
| --- | --- | 
| Okta | [使用 SAM AWS Client VPN L 对用户进行身份验证](https://aws.amazon.com/blogs/networking-and-content-delivery/authenticate-aws-client-vpn-users-with-saml/) | 
| Microsoft Entra ID（前身为 Azure Active Directory） | 有关更多信息，请参阅微软文档网站上的[教程：微软 Entra 单点登录 (SSO) 与 AWS ClientVPN 集成](https://learn.microsoft.com/en-gb/entra/identity/saas-apps/aws-clientvpn-tutorial)。 | 
| JumpCloud | [与集成 AWS Client VPN](https://jumpcloud.com/support/integrate-with-aws-client-vpn) | 
| AWS IAM Identity Center | [使用 IAM 身份中心和 AWS Client VPN 进行身份验证和授权](https://aws.amazon.com/blogs/networking-and-content-delivery/using-aws-sso-with-aws-client-vpn-for-authentication-and-authorization/)  | 

### 用于创建应用程序的服务提供商信息
<a name="saml-config-service-provider-info"></a>

要使用上表中未列出的 IdP 创建基于 SAML 的应用程序，请使用以下信息配置服务提供商信息。 AWS Client VPN 
+ 断言使用者服务 (ACS) URL：`http://127.0.0.1:35001`
+ 受众 URI：`urn:amazon:webservices:clientvpn`

来自 IdP 的 SAML 响应中必须包含至少一个属性。以下是属性示例。


| 属性 | 说明 | 
| --- | --- | 
| FirstName | 用户的名字。 | 
| LastName | 用户的姓氏。 | 
| memberOf | 列出用户所属的一个或多个组。 | 

**注意**  
`memberOf` 属性是使用基于 Active Directory 或 SAML IdP 组的授权规则所必需的。此属性还区分大小写，且必须完全按照指定的方式进行配置。有关更多信息，请参阅 [基于网络的授权](client-authorization.md#auth-rules) 和 [AWS Client VPN 授权规则](cvpn-working-rules.md)。

### 支持自助服务门户
<a name="saml-self-service-support"></a>

如果您为 Client VPN 端点启用了自助服务门户，用户将使用基于 SAML 的 IdP 凭证登录门户。

如果您的 IdP 支持多个断言消费者服务 (ACS) URLs，请将以下 ACS 网址添加到您的应用程序。

```
https://self-service.clientvpn.amazonaws.com/api/auth/sso/saml
```

如果您在某个 GovCloud 区域中使用 Client VPN 终端节点，请改用以下 ACS URL。如果您使用同一 IDP 应用程序对标准版和 GovCloud 区域进行身份验证，则可以同时添加两者 URLs。

```
https://gov.self-service.clientvpn.amazonaws.com/api/auth/sso/saml
```

如果您的 IdP 不支持多个 ACS URLs，请执行以下操作：

1. 在您的 IdP 中创建其他基于 SAML 的应用程序，然后指定以下 ACS URL。

   ```
   https://self-service.clientvpn.amazonaws.com/api/auth/sso/saml
   ```

1. 生成并下载联合身份元数据文档。

1. 在与 Client VPN 终端节点相同的 AWS 账户中创建 IAM SAML 身份提供商。有关更多信息，请参阅 *IAM 用户指南* 中的[创建 IAM SAML 身份提供商](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。
**注意**  
除了[为主应用程序创建的](#federated-authentication) IAM SAML 身份提供程序之外，还创建此 IAM SAML 身份提供程序。

1. [创建 Client VPN 端点](cvpn-working-endpoint-create.md)，然后指定您创建的两个 IAM SAML 身份提供程序。

# AWS Client VPN 中的客户端授权
<a name="client-authorization"></a>

Client VPN 支持两种类型的客户端授权：安全组和基于网络的授权（使用授权规则）。

## 安全组
<a name="security-groups"></a>

创建 Client VPN 端点时，您可以指定特定 VPC 中的安全组以应用到 Client VPN 端点。当您将子网与 Client VPN 端点关联时，我们会自动应用 VPC 的默认安全组。您可以在创建 Client VPN 端点之后更改安全组。有关更多信息，请参阅[将安全组应用于中的目标网络 AWS Client VPN](cvpn-working-target-apply.md)。安全组与 Client VPN 网络接口关联。

您可以通过向应用程序的安全组添加规则，允许来自应用于关联的安全组的流量，从而允许 Client VPN 用户在 VPC 中访问您的应用程序。

反过来，您也可以通过不指定应用到关联的安全组或删除引用 Client VPN 端点安全组的规则来限制 Client VPN 用户的访问。您需要的安全组规则还可能取决于要配置的 VPN 访问类型。有关更多信息，请参阅[Client VPN 场景和示例](how-it-works.md#scenario)。

有关安全组的更多信息，请参阅 *Amazon VPC 用户指南* 中的[您的 VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html)。

## 基于网络的授权
<a name="auth-rules"></a>

使用授权规则实施基于网络的授权。对于每个要启用访问权限的网络，您必须配置授权规则来限制具有访问权限的用户。对于指定的网络，您可以配置允许访问的 Active Directory 组或基于 SAML 的 IdP 组。只有属于指定组的用户才能访问指定的网络。如果您未使用 Active Directory 或基于 SAML 的联合身份验证，或者您要对所有用户开放访问权限，则可以指定向所有客户端授予访问权限的规则。有关更多信息，请参阅 [AWS Client VPN 授权规则](cvpn-working-rules.md)。

**Topics**
+ [安全组](#security-groups)
+ [基于网络的授权](#auth-rules)
+ [创建端点安全组规则](client-auth-rule-create.md)

# 创建终 AWS Client VPN 端节点安全组规则
<a name="client-auth-rule-create"></a>

将子网与 Client VPN 相关联时应用的 VPC 的默认安全组可能会限制来自您想要允许的默认安全组流量，同时允许您不想要的流量。使用以下步骤可创建 Client VPN 端点安全组规则，以允许或限制与资源或应用程序关联的端点安全组的流量。有关安全组规则的更多信息，请参阅《Amazon VPC 用户指南》**中的[您的 VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html)。

**添加允许来自 Client VPN 端点安全组的流量的规则**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中，选择**安全组**。

1. 选择与您的资源或应用程序关联的安全组，然后选择**操作**、**编辑入站规则**。

1. 选择 **Add rule**。

1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。或者，您也可以限制访问特定类型的流量，例如 **SSH**。

   对于**源**，请指定与 Client VPN 端点的目标网络（子网）关联的安全组的 ID。

1. 选择**保存规则**。

# 中的连接授权 AWS Client VPN
<a name="connection-authorization"></a>

您可以为 Client VPN 端点配置*客户端连接处理程序*。使用处理程序，您可以根据设备、用户和连接属性运行授权新连接的自定义逻辑。客户端连接处理程序在 Client VPN 服务对设备和用户进行身份验证后运行。

要为 Client VPN 端点配置客户端连接处理程序，请创建一个 AWS Lambda 函数，该函数获取设备、用户和连接属性作为输入，然后向 Client VPN 服务返回允许或拒绝新连接的决定。您在 Client VPN 端点中指定该 Lambda 函数。当设备连接到 Client VPN 端点时，Client VPN 服务将代表您调用该 Lambda 函数。只允许该 Lambda 函数授权的连接来连接到 Client VPN 端点。

**注意**  
目前，唯一受支持的客户端连接处理程序类型是 Lambda 函数。

## 要求和注意事项
<a name="client-connect-handler-reqs"></a>

以下是客户端连接处理程序的要求和注意事项：
+ Lambda 函数的名称必须以 `AWSClientVPN-` 前缀开头。
+ 支持合格的 Lambda 函数。
+ Lambda 函数必须与 Client VPN 终端节点位于同一个 AWS 区域和同一个 AWS 账户。
+ Lambda 函数在 30 秒后超时。该值不能更改。
+ Lambda 函数是同步调用的。在设备和用户身份验证之后、评估授权规则之前调用它。
+ 如果为新连接调用了 Lambda 函数，但 Client VPN 服务没有从该函数获得预期响应，则 Client VPN 服务将拒绝连接请求。例如，如果 Lambda 函数受到限制、超时或遇到其他意外错误，或者函数的响应格式不是有效的，则可能会发生这种情况。
+ 建议您为 Lambda 函数配置[预置并发](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)，以使其能够在不影响延迟的情况下进行扩展。
+ 如果您更新 Lambda 函数，与 Client VPN 端点的现有连接不受影响。您可以终止现有连接，然后指示客户端建立新连接。有关更多信息，请参阅 [终止 AWS Client VPN 客户端连接终止客户端连接](cvpn-working-connections-disassociate.md)。
+ 如果客户端使用 AWS 提供的客户端连接到 Client VPN 端点，则必须在 Windows 上使用 1.2.6 或更高版本，对于 macOS 必须使用 1.2.4 或更高版本。有关更多信息，请参阅[使用 AWS 提供的客户端进行连接](https://docs.aws.amazon.com/vpn/latest/clientvpn-user/connect-aws-client-vpn-connect.html)。

## Lambda 接口
<a name="connection-authorization-lambda"></a>

Lambda 函数从 Client VPN 服务获取设备属性、用户属性和连接属性作为输入。然后，它必须将是允许还是拒绝连接的决定返回给 Client VPN 服务。

**请求 schema**  
Lambda 函数获取包含以下字段的 JSON blob 作为输入。

```
{
    "connection-id": <connection ID>,
    "endpoint-id": <client VPN endpoint ID>,
    "common-name": <cert-common-name>,
    "username": <user identifier>,
    "platform": <OS platform>,
    "platform-version": <OS version>,
    "public-ip": <public IP address>,
    "client-openvpn-version": <client OpenVPN version>,
    "aws-client-version": <AWS client version>,
    "groups": <group identifier>,
    "schema-version": "v3"
}
```
+ `connection-id` – 到 Client VPN 端点的客户端连接的 ID。
+ `endpoint-id` – Client VPN 端点的 ID。
+ `common-name` – 设备标识符。在为设备创建的客户端证书中，公用名唯一标识设备。
+ `username` – 用户标识符（如果适用）。对于 Active Directory 身份验证，这是用户名。对于基于 SAML 的联合身份验证，这是 `NameID`。对于双向身份验证，此字段为空。
+ `platform` – 客户端操作系统平台。
+ `platform-version` – 操作系统的版本。当 OpenVPN 客户端配置中存在 `--push-peer-info` 指令、客户端连接到 Client VPN 端点且客户端运行 Windows 平台时，Client VPN 服务会提供值。
+ `public-ip` – 连接设备的公有 IP 地址。
+ `client-openvpn-version` – 客户端使用的 OpenVPN 版本。
+ `aws-client-version`— AWS 客户端版本。
+ `groups` – 组标识符（如果适用）。对于 Active Directory 身份验证，这将是 Active Directory 组列表。对于基于 SAML 的联合身份验证，这将是身份提供商 (IdP) 组列表。对于双向身份验证，此字段为空。
+ `schema-version` – schema 版本。默认为 `v3`。

**响应 schema**  
Lambda 函数必须返回以下字段。

```
{
    "allow": boolean,
    "error-msg-on-denied-connection": "",
    "posture-compliance-statuses": [],
    "schema-version": "v3"
}
```
+ `allow` – 必需。一个布尔值 (`true` \$1 `false`)，指示是允许还是拒绝新连接。
+ `error-msg-on-denied-connection` – 必需。最多包含 255 个字符的字符串，可用于在 Lambda 函数拒绝连接时向客户端提供步骤和指导。如果在 Lambda 函数运行期间出现故障（例如，由于节流），Client VPN 服务将向客户端返回以下默认消息。

  ```
  Error establishing connection. Please contact your administrator.
  ```
+ `posture-compliance-statuses` – 必需。如果您使用 Lambda 函数进行[状况评估](#connection-authorization-posture-assessment)，则这是连接设备的状态列表。您可以根据设备的状况评估类别定义状态名称，例如 `compliant`、`quarantined`、`unknown` 等。每个名称最长可达 255 个字符。您最多可以指定 10 个状态。
+ `schema-version` – 必需。schema 版本。默认为 `v3`。

您可以将同一个 Lambda 函数用于同一区域中的多个 Client VPN 端点。

有关创建 Lambda 函数的更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [AWS Lambda入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

## 使用客户端连接处理程序进行状况评测
<a name="connection-authorization-posture-assessment"></a>

您可以使用客户端连接处理程序将 Client VPN 端点与现有设备管理解决方案集成，以评估连接设备的状况合规性。要使 Lambda 函数用作设备授权处理程序，请对 Client VPN 端点使用[双向身份验证](mutual.md)。为将连接到 Client VPN 端点的每个客户端（设备）创建唯一的客户端证书和密钥。Lambda 函数可以使用客户端证书的唯一公用名（从 Client VPN 服务传递）来识别设备并从设备管理解决方案中获取其状况合规性状态。您可以将双向身份验证与基于用户的身份验证结合使用。

或者，您可以在 Lambda 函数本身中进行基本状况评估。例如，您可以评估 Client VPN 服务传递给 Lambda 函数的 `platform` 和 `platform-version` 字段。

**注意**  
虽然连接处理程序可用于强制执行 AWS Client VPN 应用程序的最低版本，但连接处理程序`aws-client-version`中的字段仅适用于 AWS Client VPN 应用程序，并且是通过用户设备上的环境变量填充的。

## 启用客户端连接处理程序
<a name="enable-client-connect-handler"></a>

要启用客户端连接处理程序，请创建或修改 Client VPN 端点，然后指定 Lambda 函数的 Amazon 资源名称（ARN）。有关更多信息，请参阅 [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md) 和 [修改 AWS Client VPN 端点](cvpn-working-endpoint-modify.md)。

## 服务相关角色
<a name="connection-authorization-slr"></a>

AWS Client VPN 在您的账户中自动创建一个名**AWSServiceRoleForClientVPNConnections**为的服务相关角色。当与 Client VPN 端点建立连接时，该角色有权调用 Lambda 函数。有关更多信息，请参阅 [将服务相关角色用于 AWS Client VPN](using-service-linked-roles.md)。

## 监控连接授权失败
<a name="connection-authorization-monitoring"></a>

您可以查看到 Client VPN 端点的连接的连接授权状态。有关更多信息，请参阅[查看 AWS Client VPN 客户端连接查看客户端连接](cvpn-working-connections-view.md)。

当客户端连接处理程序用于状况评估时，您还可以在连接日志中查看连接到 Client VPN 端点的设备的状况合规性状态。有关更多信息，请参阅[AWS Client VPN 端点的连接日志记录](connection-logging.md)。

如果设备未通过连接授权，则连接日志中的 `connection-attempt-failure-reason` 字段将返回以下失败原因之一：
+ `client-connect-failed` – Lambda 函数阻止建立连接。
+ `client-connect-handler-timed-out` – Lambda 函数超时。
+ `client-connect-handler-other-execution-error` – Lambda 函数遇到意外错误。
+ `client-connect-handler-throttled` – Lambda 函数受到限制。
+ `client-connect-handler-invalid-response` – Lambda 函数返回的响应无效。
+ `client-connect-handler-service-error` – 尝试连接期间出现服务端错误。

# AWS Client VPN 端点上的拆分隧道
<a name="split-tunnel-vpn"></a>

默认情况下，当您拥有 Client VPN 端点时，所有来自客户端的流量都通过 Client VPN 隧道进行路由。当您在 Client VPN 端点上启用拆分隧道时，我们会将[ Client VPN 端点路由表](cvpn-working-routes.md)上的路由推送到连接到 Client VPN 端点的设备。这可确保仅目的地为与 Client VPN 端点路由表中的路由匹配的网络的流量能够通过 Client VPN 隧道进行路由。

当您不希望所有用户流量都通过 Client VPN 端点路由时，可以使用拆分隧道 Client VPN 端点。

在以下示例中，在 Client VPN 端点上启用了拆分隧道。只有发往 VPC（`172.31.0.0/16`）的流量才会通过 Client VPN 隧道进行路由。发往本地资源的流量不会通过 Client VPN 隧道进行路由。

![\[拆分隧道 Client VPN 端点\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/images/client-vpn-split-tunnel.png)


## 拆分隧道的优势
<a name="split-tunnel-benefits"></a>

Client VPN 端点上的拆分隧道提供了以下好处：
+ 您可以通过仅允许 AWS 目标流量穿过 VPN 隧道来优化来自客户端的流量路由。
+ 您可以减少来自 AWS 的传出流量，从而降低数据传输成本。

## 路由注意事项
<a name="split-tunnel-routing"></a>
+ 当您启用拆分隧道模式时，Client VPN 端点的路由表中的所有路由都将在建立 VPN 连接时添加到客户端的路由表中。此操作不同于默认行为，它将使用条目 `0.0.0.0/0` 覆盖客户端路由表，以便通过 VPN 路由所有流量。
**注意**  
在使用拆分隧道模式时，将 0.0.0.0/0 路由添加到 Client VPN 端点的路由表，可能会导致连接中断，建议不要这样做
+ 启用拆分隧道模式后，对 Client VPN 端点路由表的任何修改都将导致所有客户端连接重置。

## 启用拆分隧道
<a name="split-tunnel-enable"></a>

您可以在新的或现有的 Client VPN 端点上启用拆分隧道。有关更多信息，请参阅以下主题：
+ [创建AWS Client VPN终端节点](cvpn-working-endpoint-create.md)
+ [修改 AWS Client VPN 端点](cvpn-working-endpoint-modify.md)

# AWS Client VPN 端点的连接日志记录
<a name="connection-logging"></a>

连接日志记录是 AWS Client VPN 的一项特征，使您能够捕获 Client VPN 端点的*连接日志*。

连接日志包含*连接日志条目*，这些条目捕获有关连接事件的信息，例如客户端（最终用户）连接、尝试连接或断开连接 Client VPN 端点的时间。您可以使用此信息运行取证、分析 Client VPN 终端节点的使用方式或调试连接问题。

连接日志记录在所有提供 AWS Client VPN 的区域中可用。连接日志将发布到您账户中的 CloudWatch Logs 日志组。

**注意**  
不记录失败的双向身份验证尝试。

## 连接日志条目
<a name="connection-log-entries"></a>

连接日志条目是一个由键值对组成的采用 JSON 格式的 Blob。以下是一个示例连接日志条目。

```
{
    "connection-log-type": "connection-attempt",
    "connection-attempt-status": "successful",
    "connection-reset-status": "NA",
    "connection-attempt-failure-reason": "NA",
    "connection-id": "cvpn-connection-abc123abc123abc12",
    "client-vpn-endpoint-id": "cvpn-endpoint-aaa111bbb222ccc33",
    "transport-protocol": "udp",
    "connection-start-time": "2020-03-26 20:37:15",
    "connection-last-update-time": "2020-03-26 20:37:15",
    "client-ip": "10.0.1.2",
    "common-name": "client1",
    "device-type": "mac",
    "device-ip": "98.247.202.82",
    "port": "50096",
    "ingress-bytes": "0",
    "egress-bytes": "0",
    "ingress-packets": "0",
    "egress-packets": "0",
    "connection-end-time": "NA",
    "username": "joe"
    }
```

连接日志条目包含以下键：
+ `connection-log-type` – 连接日志条目的类型（`connection-attempt` 或 `connection-reset`）。
+ `connection-attempt-status` – 连接请求的状态（`successful`、`failed`、`waiting-for-assertion` 或 `NA`）。
+ `connection-reset-status` – 连接重置事件的状态（`NA` 或 `assertion-received`）。
+ `connection-attempt-failure-reason` – 连接失败的原因（如果适用）。
+ `connection-id` – 连接的 ID。
+ `client-vpn-endpoint-id` – 与之建立连接的 Client VPN 端点的 ID。
+ `transport-protocol` – 用于连接的传输协议。
+ `connection-start-time` – 连接的开始时间。
+ `connection-last-update-time` – 连接的上次更新时间。此值在日志中定期更新。
+ `client-ip` – 客户端的 IP 地址，从客户端 IPv4 CIDR 范围为 Client VPN 端点分配。
+ `common-name` – 用于基于证书的身份验证的证书的公用名。
+ `device-type` – 最终用户用于连接的设备类型。
+ `device-ip` – 设备的公有 IP 地址。
+ `port` – 连接的端口号。
+ `ingress-bytes` – 连接的入口（入站）字节数。此值在日志中定期更新。
+ `egress-bytes` – 连接的出口（出站）字节数。此值在日志中定期更新。
+ `ingress-packets` – 连接的入口（入站）数据包的数量。此值在日志中定期更新。
+ `egress-packets` – 连接的出口（出站）数据包的数量。此值在日志中定期更新。
+ `connection-end-time` – 连接的结束时间。如果连接仍在进行中或连接尝试失败，则值为 `NA` 。
+ `posture-compliance-statuses` – [客户端连接处理程序](connection-authorization.md)返回的状况合规性状态（如果适用）。
+ `username` — 当对端点使用基于用户的身份验证（AD 或 SAML）时，将记录用户名。
+ `connection-duration-seconds` — 连接的持续时间（以秒为单位）。等于“connection-start-time”（连接开始时间）与“connection-end-time”（连接结束时间）之间的差异。

有关启用连接日志记录的更多信息，请参阅 [AWS Client VPN 连接日志](cvpn-working-with-connection-logs.md)。

# Client VPN 扩展注意事项
<a name="scaling-considerations"></a>

创建 Client VPN 端点时，请考虑您计划支持的最大并发 VPN 连接数。您应考虑当前支持的客户端数量，并考虑您的 Client VPN 端点是否可以在需要时通过扩展来满足额外的需求。

以下因素会影响 Client VPN 端点上可支持的最大并发 VPN 连接数：

**客户端 CIDR 范围大小**  
[创建 Client VPN 端点](cvpn-working-endpoint-create.md)时，必须指定客户端 CIDR 范围，该范围是介于 /12 和 /22 网络掩码之间的 IPv4 CIDR 块。将从客户端 CIDR 范围中为每个到 Client VPN 端点的 VPN 连接分配一个唯一的 IP 地址。客户端 CIDR 范围中的一部分地址还用于支持 Client VPN 端点的可用性模型，无法分配给客户端。创建 Client VPN 端点后，您无法更改客户端 CIDR 范围。  
通常，建议您指定一个客户端 CIDR 范围，其中包含的 IP 地址数量是您计划在 Client VPN 端点上支持的 IP 地址数量（以及并发连接数量）的两倍。

**关联子网的数量**  
当您[将子网](cvpn-working-target.md)与 Client VPN 端点关联时，您允许用户建立与 Client VPN 端点的 VPN 会话。您可以将多个子网与一个 Client VPN 端点关联以实现高可用性，并实现附加连接容量。  
以下是基于 Client VPN 端点的子网关联数的支持并发 VPN 连接的数量。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/scaling-considerations.html)

您无法将同一可用区内的多个子网与一个客户端 VPN 终端节点关联。因此，子网关联的数量还取决于 AWS 区域中可用的可用区数量。

例如，如果您希望支持 8,000 个到 Client VPN 端点的 VPN 连接，请指定最小客户端 CIDR 范围大小 `/18`（16,384 个 IP 地址），并将至少 2 个子网与 Client VPN 端点关联。

如果您不确定 Client VPN 端点的预期 VPN 连接数量，建议您指定 `/16` 或更大的 CIDR 块大小。

有关使用客户端 CIDR 范围和目标网络的规则和限制的更多信息，请参阅[使用规则和最佳实践 AWS Client VPN](what-is-best-practices.md)。

有关 Client VPN 端点配额的更多信息，请参阅[AWS Client VPN 限额](limits.md)。