

# 您的 VPC 的自定义网络 ACL
<a name="custom-network-acl"></a>

您可以创建自定义网络 ACL 并将其与子网相关联，以允许或拒绝子网级别的特定入站或出站流量。有关更多信息，请参阅 [为您的 VPC 创建网络 ACL](create-network-acl.md)。

每个网络 ACL 都包含一个默认入站规则和一个默认出站规则，其规则编号是星号（\$1）。这些规则确保在数据包与任何其他规则不匹配时拒绝该数据包。

您可以通过添加或删除规则，来修改网络 ACL。您无法删除规则编号是星号的规则。

对于您添加的每个规则，都必须存在允许响应流量的入站或出站规则。有关如何选择适当的临时端口的更多信息，请参见 [临时端口](#nacl-ephemeral-ports)。

**示例入站规则**  
下表显示网络 ACL 的示例入站规则。仅当 VPC 具有关联的 IPv6 CIDR 块时，才添加 IPv6 的规则。IPv4 和 IPv6 流量是单独评估的。因此，所有 IPv4 流量的规则都不适用于 IPv6 流量。您可以在相应 IPv4 规则旁边添加 IPv6 规则，也可以在最后一个 IPv4 规则之后添加 IPv6 规则。

随着数据包流向子网，我们会根据与子网关联的网络 ACL 的入站规则评估数据包（从编号最低的规则开始）。例如，假设存在发往 HTTPS 端口 (443) 的 IPv4 流量。数据包与规则 100 或 105 不匹配。它与规则 110 匹配，后者允许流量进入子网。如果数据包已发往端口 139 (NetBIOS)，则它与任何编号规则均不匹配，因此 IPv4 流量的 \$1 规则最终会拒绝此数据包。


| 规则 \$1 | 类型 | 协议 | 端口范围 | 源 | 允许/拒绝 | 注释 | 
| --- | --- | --- | --- | --- | --- | --- | 
| 100 | HTTP | TCP | 80 | 0.0.0.0/0 | 允许 |  允许来自任意 IPv4 地址的入站 HTTP 流量。  | 
| 105 | HTTP | TCP | 80 | ::/0 | 允许 |  允许来自任意 IPv6 地址的入站 HTTP 流量。  | 
| 110 | HTTPS | TCP | 443 | 0.0.0.0/0 | 允许 |  允许来自任意 IPv4 地址的入站 HTTPS 流量。  | 
| 115 | HTTPS | TCP | 443 | ::/0 | 允许 | 允许来自任意 IPv6 地址的入站 HTTPS 流量。 | 
| 120 | SSH | TCP | 22 | *192.0.2.0/24* | 允许 |  允许来自您的家庭网络的公有 IPv4 地址范围的入站 SSH 流量（通过互联网网关）。  | 
| 140 | 自定义 TCP | TCP | *32768-65535* | 0.0.0.0/0 | 允许 |  允许来自互联网的入站返回 IPv4 流量（对于源自子网的请求）。  | 
| 145 | 自定义 TCP | TCP | *32768-65535* | ::/0 | 允许 |  允许来自互联网的入站返回 IPv6 流量（对于源自子网的请求）。  | 
| \$1 | 所有流量 | All | 全部 | 0.0.0.0/0 | 拒绝 |  拒绝所有未经前置规则（不可修改）处理的入站 IPv4 流量。  | 
| \$1 | 所有流量 | All | All | ::/0 | 拒绝 |  拒绝所有未经前置规则（不可修改）处理的入站 IPv6 流量。  | 

**示例出站规则**  
下表显示自定义网络 ACL 的示例出站规则。仅当 VPC 具有关联的 IPv6 CIDR 块时，才添加 IPv6 的规则。IPv4 和 IPv6 流量是单独评估的。因此，所有 IPv4 流量的规则都不适用于 IPv6 流量。您可以在相应 IPv4 规则旁边添加 IPv6 规则，也可以在最后一个 IPv4 规则之后添加 IPv6 规则。


| 规则 \$1 | 类型 | 协议 | 端口范围 | 目的地 | 允许/拒绝 | 注释 | 
| --- | --- | --- | --- | --- | --- | --- | 
| 100 | HTTP | TCP | 80 | 0.0.0.0/0 | 允许 | 允许出站 IPv4 HTTP 流量从子网流向 Internet。 | 
| 105 | HTTP | TCP | 80 | ::/0 | 允许 | 允许出站 IPv6 HTTP 流量从子网流向 Internet。 | 
| 110 | HTTPS | TCP | 443 | 0.0.0.0/0 | 允许 | 允许出站 IPv4 HTTPS 流量从子网流向 Internet。 | 
| 115 | HTTPS | TCP | 443 | ::/0 | 允许 | 允许出站 IPv6 HTTPS 流量从子网流向 Internet。 | 
| 120 | 自定义 TCP | TCP | *1024-65535* | *192.0.2.0/24* | 允许 |  允许从您的家庭网络发出对 SSH 流量的出站响应。  | 
| 140 | 自定义 TCP | TCP | *32768-65535* | 0.0.0.0/0 | 允许 | 允许对互联网客户端的出站 IPv4 响应（例如，提供网页）。 | 
| 145 | 自定义 TCP | TCP | *32768-65535* | ::/0 | 允许 | 允许对互联网客户端的出站 IPv6 响应（例如，提供网页）。  | 
| \$1 | 所有流量 | All | 全部 | 0.0.0.0/0 | DENY | 拒绝所有未经前置规则处理的出站 IPv4 流量。 | 
| \$1 | 所有流量 | All | All | ::/0 | DENY | 拒绝所有未经前置规则处理的出站 IPv6 流量。 | 

## 临时端口
<a name="nacl-ephemeral-ports"></a>

上一个部分中的网络 ACL 实例使用了临时端口范围 32768-65535。但是，您可能需要根据自己使用的或作为通信目标的客户端的类型为网络 ACL 使用不同的范围。

发起请求的客户端会选择临时端口范围。根据客户端的操作系统不同，范围也随之更改。
+ 许多 Linux 内核（包括 Amazon Linux 内核）使用端口 32768-61000。
+ 源自 Elastic Load Balancing 的请求使用端口 1024-65535。
+ Windows 操作系统通过 Windows Server 2003 使用端口 1025-5000。
+ Windows Server 2008 及更高版本使用端口 49152-65535。
+ NAT 网关使用端口 1024-65535。
+ Amazon Lambda 函数使用端口 1024-65535。

例如，如果一个来自 Internet 上的 Windows 10 客户端的请求到达您的 VPC 中的 Web 服务器，则您的网络 ACL 必须有相应的出站规则，才能支持目标为端口 49152-65535 的流量。

如果您的 VPC 中的一个实例是发起请求的客户端，则您的网络 ACL 必须有入站规则来支持发往特定于实例的操作系统的临时端口的流量。

在实际中，为使不同客户端类型可以启动流量进入您 VPC 中的公有实例，您可以开放临时端口 1024-65535。但是，您也可以在 ACL 中添加规则以拒绝任何在此范围内的来自恶意端口的数据流。请务必将拒绝规则放在表的较前端，先于开放一系列临时端口的允许规则。

## 自定义网络 ACL 和其他 Amazon 服务
<a name="nacl-other-services"></a>

如果您创建自定义网络 ACL，请注意它可能会如何影响您使用其他 Amazon 服务创建的资源。

借助 Elastic Load Balancing，如果您的后端实例的子网有一个网络 ACL，并且您在其中针对源为 `0.0.0.0/0` 或子网的 CIDR 的所有流量添加了*拒绝*规则，则您的负载均衡器将无法对这些实例执行运行状况检查。有关负载均衡器和后端实例的推荐网络 ACL 规则的更多信息，请参阅以下内容：
+ [Network ACLs for your Application Load Balancer](https://docs.amazonaws.cn/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html)
+ [Network ACLs for your Network Load Balancer](https://docs.amazonaws.cn/elasticloadbalancing/latest/network/target-group-register-targets.html#network-acls)
+ [Network ACLs for your Classic Load Balancer](https://docs.amazonaws.cn/elasticloadbalancing/latest/classic/elb-vpc-network-acls.html)

## 排查可达性问题
<a name="network-acl-rules-troubleshoot"></a>

Reachability Analyzer 是一款静态配置分析工具。使用 Reachability Analyzer 可分析和调试 VPC 中两个资源之间的网络可达性。如果可以访问这些资源，则 Reachability Analyzer 会生成有关这些资源间虚拟路径的逐跳详细信息，否则会确定障碍组件。例如，其可以识别缺失或配置错误的网络 ACL 规则。

有关更多信息，请参阅 [Reachability Analyzer 角色指南](https://docs.amazonaws.cn/vpc/latest/reachability/)。