

**引入全新的主机体验 AWS WAF**

现在，您可以使用更新的体验访问控制台中任意位置的 AWS WAF 功能。有关更多详细信息，请参阅[使用控制台](https://docs.aws.amazon.com/waf/latest/developerguide/working-with-console.html)。

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

# 地理匹配规则语句
<a name="waf-rule-statement-type-geo-match"></a>

本节介绍了什么是地理匹配语句及其工作方式。

使用地理或地理匹配语句根据来源国家和地区管理 web 请求。地理匹配语句会为 web 请求添加标签，标明来源国和原产地。无论语句条件是否与请求匹配，都会添加这些标签。地理匹配语句还会根据请求的来源国进行匹配。

## 如何使用地理匹配语句
<a name="waf-rule-statement-geo-how-to-use"></a>

您可以使用地理匹配语句进行国家或地区匹配，如下所示：
+ **国家/地区**：您可以单独使用地理匹配规则来管理仅基于其来源国家/地区的请求。规则语句与国家/地区代码相匹配。您也可以使用与来源国标签相匹配的标签匹配规则来遵循地理匹配规则。
**注意**  
要筛选来自香港的流量，请在地理匹配声明中使用 ISO 3166-1 alpha-2 国家/地区 `HK` 代码。
+ **区域**：使用地理匹配规则和标签匹配规则，根据请求的来源区域管理请求。您不能单独使用地理匹配规则来匹配区域代码。

有关使用标签匹配规则的信息，请参阅 [标签匹配规则语句](waf-rule-statement-type-label-match.md) 和 [在 Web 请求中添加标签 AWS WAF](waf-labels.md)。

## 地理匹配语句的工作原理
<a name="waf-rule-statement-geo-how-it-works"></a>

使用地理匹配语句，按如下方式 AWS WAF 管理每个 Web 请求：

1. **确定请求的国家和地区代码** — 根据请求的 IP 地址 AWS WAF 确定请求的国家和地区。默认情况下， AWS WAF 使用 Web 请求来源的 IP 地址。您可以指示使用备 AWS WAF 用请求标头中的 IP 地址`X-Forwarded-For`，例如在规则语句设置中启用转发 IP 配置。

   AWS WAF 使用 MaxMind GeoIP 数据库确定请求的位置。 MaxMind 尽管准确性因国家和知识产权类型等因素而异，但它们在国家一级的数据的准确性非常高。有关的更多信息 MaxMind，请参阅 [MaxMind IP 地理定位](https://support.maxmind.com/hc/en-us/sections/4407519834267-IP-Geolocation)。如果您认为任何 GeoIP 数据不正确，可以通过 “更正地理数据” 向 Maxmind 提交更[MaxMind 正](https://support.maxmind.com/hc/en-us/articles/4408252036123-GeoIP-Correction)请求。IP2 

   AWS WAF 使用国际标准化组织 (ISO) 3166 标准中的 alpha-2 国家和地区代码。您可以在以下位置找到代码：
   + 您可以访问 ISO 网站，在 [ISO 在线浏览平台 (OBP)](https://www.iso.org/obp/ui#home) 上搜索国家/地区代码。
   + 在维基百科上，国家/地区代码按照 [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) 列出。

     URL `https://en.wikipedia.org/wiki/ISO_3166-2:<ISO country code>` 中列出了某个国家/地区的地区代码。例如，美国的地区代码参见 [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US)，乌克兰的地区代码参加 [ISO 3166-2:UA](https://en.wikipedia.org/wiki/ISO_3166-2:UA)。

1. **确定要添加到请求中的国家/地区标签和地区标签**：这些标签表示地理匹配语句使用源 IP 还是转发的 IP 配置。
   + **源 ID** 

     国家标签为 `awswaf:clientip:geo:country:<ISO country code>`。例如，`awswaf:clientip:geo:country:US` 表示美国。

     区域标签为 `awswaf:clientip:geo:region:<ISO country code>-<ISO region code>`。例如，`awswaf:clientip:geo:region:US-OR` 表示美国俄勒冈。
   + **转发的 IP** 

     国家标签为 `awswaf:forwardedip:geo:country:<ISO country code>`。例如，`awswaf:forwardedip:geo:country:US` 表示美国。

     区域标签为 `awswaf:forwardedip:geo:region:<ISO country code>-<ISO region code>`。例如，`awswaf:forwardedip:geo:region:US-OR` 表示美国俄勒冈。

   如果请求的指定 IP 地址没有相应的国家或地区代码，则 AWS WAF 在标签中使用 `XX` 代替该值。例如，以下标签适用于国家/地区代码不可用的客户端 IP：`awswaf:clientip:geo:country:XX` 和以下标签适用于国家/地区为美国但其地区代码不可用的转发 IP：`awswaf:forwardedip:geo:region:US-XX`。

1. **根据规则条件评估请求的国家/地区代码** 

无论是否找到匹配，地理匹配语句都会在其检查的所有请求中添加国家和地区标签，无论是否找到匹配。

**注意**  
AWS WAF 在规则的 Web 请求评估结束时添加所有标签。因此，与地理匹配语句中的标签匹配时，必须在包含地理匹配语句的规则之外的另一条规则中定义。

如果您只想检查区域值，则可以编写带有 Count 操作和单个国家/地区代码匹配的地理匹配规则，后接区域标签的标签匹配规则。即使采用这种方法，您也需要提供国家/地区代码以供地理匹配规则进行评估。您可以通过指定不太可能成为您网站流量来源的国家/地区，来减少日志记录和计数指标。

## CloudFront 分布和 CloudFront 地理限制功能
<a name="cloudfront-distributions-geo-restriction"></a>

对于 CloudFront 分发，如果您使用 CloudFront 地理限制功能，请注意该功能不会将被屏蔽的请求转发到 AWS WAF。它确实会将允许的请求转发到 AWS WAF。如果您想根据地理位置以及可以在中指定的其他条件来阻止请求 AWS WAF，请使用 AWS WAF 地理匹配语句，不要使用 CloudFront 地理限制功能。

## 规则语句特征
<a name="geo-match-statement-characteristics"></a>

**嵌套**：您可以嵌套此语句类型。

**WCUs **— 1 个 WCU。

**设置**：此语句使用以下设置：
+ **国家/地区代码**：用于比较地理匹配的一系列国家/地区代码。这些必须是 ISO 3166 国际标准的 alpha-2 国家/地区 ISO 代码中的双字符国家/地区代码，例如 `["US","CN"]`。
+ **（可选）转发 IP 配置**-默认情况下， AWS WAF 使用 Web 请求来源中的 IP 地址来确定来源国。或者，您可以将规则配置为在 HTTP 标头中使用转发的 IP，如下所`X-Forwarded-For`示。 AWS WAF 使用标头中的第一个 IP 地址。使用此配置，您还可以指定一种回退行为，以应用于标头中包含格式错误的 IP 地址的 web 请求。回退行为将请求的匹配结果设置为匹配或不匹配。有关更多信息，请参阅 [使用转发 IP 地址](waf-rule-statement-forwarded-ip-address.md)。

## 在何处查找规则语句
<a name="geo-match-statement-where-to-find"></a>
+ 控制台上的**规则生成器**：在**请求选项**中，选择**来源国家/地区**。
+ **API**：[GeoMatchStatement](https://docs.aws.amazon.com/waf/latest/APIReference/API_GeoMatchStatement.html)

## 示例
<a name="waf-rule-statement-geo-examples"></a>

您可以使用地理匹配语句来管理来自特定国家/地区或区域的请求。例如，如果您想阻止来自某些国家/地区的请求，但仍允许来自这些国家/地区的一组特定 IP 地址的请求，则可以创建一个规则，将操作设置为 Block，并使用以下嵌套语句（以伪代码显示）：
+ AND statement
  + 地理匹配语句，列出您要组织的国家/地区
  + NOT statement 
    + IP 集语句，用于指定要允许通过的 IP 地址

或者，如果您想阻止某些国家/地区的某些区域，但仍允许来自这些国家/地区其他区域的请求，则可以先定义地理匹配规则，并将操作设置为 Count。然后，定义与添加的地理匹配标签匹配的标签匹配规则，并根据需要处理请求。

以下伪代码描述了这种方法的示例：

1. 地理匹配语句列出了一些国家/地区，这些国家/地区有您想要阻止的区域，但操作设置为“计数”。无论匹配状态如何，这都会对每个 web 请求进行标记，还可以为您提供感兴趣的国家/地区的计数指标。

1. 带有阻止操作的 `AND` 语句
   + 标签匹配语句，用于指定要阻止的国家/地区的标签
   + `NOT` statement 
     + 标签匹配语句，用于指定您想要允许通过的国家/地区的区域的标签

以下 JSON 列表显示了前面伪代码中描述的两个规则的实施。这些规则禁止来自美国的所有流量，但来自俄勒冈州和华盛顿州的流量除外。地理匹配语句会为其检查的所有请求添加国家/地区和区域标签。标签匹配规则在地理匹配规则之后运行，因此它可以与地理匹配规则刚刚添加的国家/地区和区域标签进行匹配。地理匹配语句使用转发 IP 地址，因此标签匹配还会指定转发 IP 标签。

```
{
   "Name": "geoMatchForLabels",
   "Priority": 10,
   "Statement": {
     "GeoMatchStatement": {
       "CountryCodes": [
         "US"
       ],
       "ForwardedIPConfig": {
           "HeaderName": "X-Forwarded-For",
           "FallbackBehavior": "MATCH"
       }
     }
   },
   "Action": {
     "Count": {}
   },
   "VisibilityConfig": {
     "SampledRequestsEnabled": true,
     "CloudWatchMetricsEnabled": true,
     "MetricName": "geoMatchForLabels"
   }
},
{
   "Name": "blockUSButNotOROrWA",
   "Priority": 11,
   "Statement": {
     "AndStatement": {
       "Statements": [
         {
           "LabelMatchStatement": {
             "Scope": "LABEL",
             "Key": "awswaf:forwardedip:geo:country:US"
           }
         },
         {
           "NotStatement": {
             "Statement": {
                "OrStatement": {
                  "Statements": [
                    {
                       "LabelMatchStatement": {
                         "Scope": "LABEL",
                         "Key": "awswaf:forwardedip:geo:region:US-OR"
                       }
                    },
                    {
                       "LabelMatchStatement": {
                         "Scope": "LABEL",
                         "Key": "awswaf:forwardedip:geo:region:US-WA"
                       }
                    }
                 ]
               }
             }
           }
         }
       ]
     }
   },
   "Action": {
     "Block": {}
   },
   "VisibilityConfig": {
     "SampledRequestsEnabled": true,
     "CloudWatchMetricsEnabled": true,
     "MetricName": "blockUSButNotOROrWA"
   }
}
```

再举一个例子，您可以将地理匹配与基于速率的规则相结合，为特定国家/地区或区域的用户确定资源的优先级。您可以为每个用于区分用户的地理匹配语句或标签匹配语句创建不同的基于速率的语句。为首选国家/地区中的用户设置较高的速率限制，并为其他用户设置较低的速率限制。

以下 JSON 列表显示了地理匹配规则，后面是基于速率的规则，这些规则限制来自美国的流量。这些规定允许来自俄勒冈州的流量高于来自全国其他任何地方的流量。

```
{
  "Name": "geoMatchForLabels",
  "Priority": 190,
  "Statement": {
    "GeoMatchStatement": {
      "CountryCodes": [
        "US"
      ]
    }
  },
  "Action": {
    "Count": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "geoMatchForLabels"
  }
},
{
  "Name": "rateLimitOregon",
  "Priority": 195,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 3000,
      "AggregateKeyType": "IP",
      "ScopeDownStatement": {
        "LabelMatchStatement": {
          "Scope": "LABEL",
          "Key": "awswaf:clientip:geo:region:US-OR"
        }
      }
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "rateLimitOregon"
  }
},
{
  "Name": "rateLimitUSNotOR",
  "Priority": 200,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 100,
      "AggregateKeyType": "IP",
      "ScopeDownStatement": {
        "AndStatement": {
          "Statements": [
            {
              "LabelMatchStatement": {
                "Scope": "LABEL",
                "Key": "awswaf:clientip:geo:country:US"
              }
            },
            {
              "NotStatement": {
                "Statement": {
                  "LabelMatchStatement": {
                    "Scope": "LABEL",
                    "Key": "awswaf:clientip:geo:region:US-OR"
                  }
                }
              }
            }
          ]
        }
      }
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "rateLimitUSNotOR"
  }
}
```