适用于: ✔️ Front Door 标准版/高级版
速率限制帮助您检测并阻止流向您的应用的异常高流量。 通过在 Azure Front Door 中使用 Azure Web 应用程序防火墙(WAF),你可以缓解某些类型的拒绝服务攻击。 速率限制还能防止客户端因误配置而在短时间内发送大量请求。
默认情况下,速率限制规则会分别为每个套接字IP地址计入请求。 在 Azure Front Door Premium 中,你还可以按国家/地区、自治系统号(ASN)或 JA4 客户端指纹分组计数,或者将所有匹配请求合并计算。 这些额外的分组还处于预览阶段。
速率限制的计算方式
套接字 IP 地址是启动与 Azure Front Door 的 TCP 连接的客户端的地址。 通常,套接字 IP 地址是用户的 IP 地址,但它也可能是代理服务器或其他位于用户与 Azure Front Door 之间的设备的 IP 地址。
除非你选择了不同的分组,否则速率限制是按套接字IP地址计算的。 如果有多个客户端从不同的套接字 IP 地址访问 Azure Front Door,则它们各自应用自己的速率限制。 按套接字IP地址计数通常可用,这也是当没有指定分组时,所有速率限制规则的表现方式。 Azure Front Door 在 WAF 检查请求之前就终止了 TLS,因此通过 HTTP 和 HTTPS 发送的请求计算方式相同。
配置速率限制策略
通过 自定义WAF规则来配置速率限制。 在配置速率限制规则时,请指定 阈值。 阈值是指每个组(如每个套接字IP地址)在一分钟或五分钟内允许的网络请求数量。 还必须指定至少一个 匹配条件,该条件告知 Azure Front Door 何时激活速率限制。 可以配置适用于应用程序中不同路径的多个速率限制。
如果需要对所有请求应用速率限制规则,请考虑使用匹配条件,如以下示例所示:
前面的匹配条件标识出所有请求中标头长度大于Host的0。 由于 Azure Front Door 的所有有效 HTTP 请求都包含标头 Host ,因此此匹配条件具有匹配所有 HTTP 请求的效果。
组速率限制请求流量(预览)
Important
按国家/地区、AS 编号、JA4 指纹或不分组对速率限制规则进行分组目前为预览版。 通常支持基于套接字 IP 地址的速率限制,这是默认分组方式。 有关适用于测试版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款。
每IP速率限制适用于从少量IP地址发送大量请求的客户端。 它对分布式攻击效果较差,后者中僵尸网络将流量分散到数千个 IP 地址,使每个 IP 的流量都低于阈值。 分组改为按这些客户端共享的某个属性对请求进行计数,因此来自多个 IP 地址的流量可以计入同一个阈值。
速率限制规则的分组依据设置决定了请求的计数方式:
| 分组依据 | API值 | 请求的计数方式 | 地位 |
|---|---|---|---|
| 套接字地址(默认) | SocketAddr |
每个套接字的IP地址都有自己的计数器。 | 正式发布 |
| 国家/地区 | GeoLocation |
同一国家/地区的客户共用一个柜台。 | Preview |
| AS编号 | Asn |
同一网络上的客户端,如互联网服务提供商或托管服务提供商,共享一个计数器。 | Preview |
| JA4指纹 | Ja4 |
以相同方式协商TLS的客户端共享计数器,无论它们的IP地址如何。 | Preview |
| None | None |
所有符合规则的请求共用一个计数器。 | Preview |
配置分组时请记住以下几点:
- 每个速率限制规则都按一个变量将请求分组。 为了以多种方式统计同一流量,可以为每个分组创建单独规则。
- 未指定分组的规则会按每个套接字 IP 地址对请求计数,这样你现有的速率限制规则就不会受到影响。
- 预览分组仅在 Azure Front Door Premium 上可用。
- 国家/地区和AS号码分组使用套接字的IP地址来确定每个客户端的国家/地区和网络。
- 在 Azure 门户中,在速率限制规则的 按以下方式对速率限制流量进行分组 设置中,选择分组方式。 在 ARM 模板、Bicep 和 REST API 中,设置自定义规则的
groupBy属性。 In Azure PowerShell, useNew-AzFrontDoorWafCustomRuleGroupByVariableObject.
选择一个分组
- JA4指纹识别: 使用它来应对那些在多个IP地址间轮换但重复使用同一客户端软件的分布式攻击。 在 HTTP 洪泛攻击中,绝大多数攻击流量通常来自少数指纹特征。 更多信息请参见《Azure Front Door 的客户端指纹匹配是什么?》
- AS编号: 用它来限制来自用户通常不来自的网络的流量,比如托管和云服务提供商,而无需维护它们的IP范围列表。 欲了解更多信息,请参见《Azure Front Door 的 AS 号码匹配是什么?》
- 国家/地区: 用它来限制任何单一国家/地区可发送的流量,例如在流量洪峰集中于某一位置时。
- 无: 在狭窄匹配条件下使用,如登录页面或可疑用户代理列表,以为该资源的总请求速率设置上限。
示例:每个JA4指纹的速率限制
以下规则允许每个JA4指纹在五分钟内最多可请求500次。 由于计数是跟随指纹而非IP地址,使用同一客户端软件轮换数千个IP地址的攻击仍会受到限制。 该匹配条件适用于所有请求。 根据您自己的流量来设置阈值,如 “根据您自己的流量设置阈值”中所述。
{
"name": "RateLimitByJa4",
"priority": 10,
"enabledState": "Enabled",
"ruleType": "RateLimitRule",
"rateLimitDurationInMinutes": 5,
"rateLimitThreshold": 500,
"groupBy": [
{
"variableName": "Ja4"
}
],
"matchConditions": [
{
"matchVariable": "RequestUri",
"operator": "Contains",
"matchValue": [
"/"
]
}
],
"action": "Block"
}
示例:将登录页面的总请求速率设定上限
以下规则将所有登录路径请求合并计数。 当一分钟内请求总数超过2000个时,它会在该时间窗口的剩余时间内对该路径的请求呈现 JavaScript 质询。 正规浏览器能通过挑战,而大多数脚本客户端则不然。
{
"name": "RateLimitSignInTotal",
"priority": 20,
"enabledState": "Enabled",
"ruleType": "RateLimitRule",
"rateLimitDurationInMinutes": 1,
"rateLimitThreshold": 2000,
"groupBy": [
{
"variableName": "None"
}
],
"matchConditions": [
{
"matchVariable": "RequestUri",
"operator": "Contains",
"matchValue": [
"/signin"
]
}
],
"action": "JSChallenge"
}
从你自己的流量中设置阈值
分组规则需要一个阈值,高于任何组在正常流量中达到的最高速率。 至少一周内测量该速率,以便日高峰和周高峰得以体现。 以下Log Analytics查询显示了每个JA4指纹在五分钟内的峰值和第99百分位请求数:
AzureDiagnostics
| where Category =~ "FrontDoorAccessLog"
| where TimeGenerated > ago(7d)
| summarize Requests = count() by bin(TimeGenerated, 5m), clientJA4FingerPrint_s
| summarize P99 = percentile(Requests, 99), Peak = max(Requests) by clientJA4FingerPrint_s
| order by Peak desc
要对国家/地区分组进行规模化,请用 clientCountry_s 替换 clientJA4FingerPrint_s。 将分箱大小与规则的时间窗口匹配。
速率限制和 Azure Front Door 服务器
来自同一客户端的请求通常到达同一 Azure Front Door 服务器。 在这种情况下,只要达到每个客户端 IP 地址的速率限制,就会立即阻止请求。
同一客户端的请求可能会到达尚未更新速率限制计数器的另一个 Azure Front Door 服务器。 例如,客户端可能会为每个请求打开新的 TCP 连接,并且每个 TCP 连接可以路由到不同的 Azure Front Door 服务器。 如果阈值足够低,则对新 Azure Front Door 服务器的第一个请求可以通过速率限制检查。 因此,对于低阈值(例如,每分钟不到 200 个请求),你可能会看到一些超出阈值的请求通过。
确定速率限制的阈值和时间窗口时要记住的一些注意事项:
具有最小可接受请求计数阈值的较大窗口大小是防止 DDoS 攻击的最有效配置。 此配置更有效,因为当攻击者达到速率限制的阈值时,他们会在整个限制窗口内被阻止。 因此,如果攻击者在一分钟窗口的前 30 秒内被阻止,则只有剩余 30 秒的速率限制。 如果攻击者在 5 分钟窗口的第一分钟被阻止,他们在接下来的 4 分钟内会被限速。
设置更大的时间窗口(例如,五分钟而不是一分钟)和更高的阈值(例如,200 而不是 100)通常在接近速率限制阈值时,更为准确,比起使用较短的时间窗口和较低的阈值。
Azure Front Door WAF 速率限制在固定时间段内运行。 一旦某个组超过速率限制阈值,该组中所有符合规则的流量将在固定窗口剩余时间内被阻断。 默认分组时,该组是一个单个套接字 IP 地址。
分组速率限制的考虑
- 泄露会影响组中的每一位客户。 通过国家/地区、AS编号或JA4指纹分组时,共享该国家/地区、网络或客户端软件的合法用户也会连带受到限制。 设为 None 时,所有符合规则的流量都受到限制。 根据正常流量确定大小阈值,首先使用“记录”操作部署新规则,并考虑使用 JavaScript 质询而不是阻止。
- 许多合法用户共享共同的指纹。 主流浏览器为大量用户提供相同的JA4指纹。 如果攻击流量使用与用户相同的指纹,JA4规则会限制两者。
- 保持每个IP的规则。 使用分组规则和按套接字 IP 地址计数的速率限制规则,而不是替代该规则。 客户端可以更改其TLS指纹,而IP地址仍然是攻击者更改成本最高的属性。
- 代理和内容分发网络改变了你统计的内容。 如果客户端通过其他代理或内容分发网络访问 Azure Front Door,套接字 IP 地址、由其衍生的国家/地区和 AS 号码,以及 JA4 指纹,描述的都是该代理,而非终端用户。