Cloudflare Rate Limiting は、特定の URL またはドメイン全体に対する過剰なリクエストレートを自動で識別し、緩和します。
リクエストレートは、個々の Cloudflare データセンターでローカルに計算されます。Rate Limiting のよくある用途は次のとおりです。
- DDoS 攻撃 ↗ からの保護
- ブルートフォース攻撃 ↗ からの保護
- フォーラム検索、API 呼び出し、オリジンでデータベース負荷の高い操作を伴うリソースへのアクセス制限
個々の IPv4 アドレスまたは IPv6 /64 IP 範囲がルールのしきい値を超えると、オリジンサーバーへの以降のリクエストは HTTP 429 レスポンスステータスコードでブロックされます。レスポンスには、クライアントがリクエストの再開をいつできるかを示す Retry-After ヘッダーが含まれます。
キャッシュされたリソースと既知の検索エンジンクローラーは、レート制限ルール(以前のバージョンのみ)の対象外です。そのため、サイトの SEO ランキング には影響しません。
許可されるレート制限ルールの数は、ドメインのプランによって異なります。
| プラン | ルール | レスポンスヘッダーに一致するルール | アクション | アクションの継続時間 | リクエスト期間 |
|---|---|---|---|---|---|
| Free | 1 | 1 | Block | 1 分または 1 時間 | 10 秒または 1 分 |
| Pro | 10 | 1 | Block、Non-Interactive Challenge、Managed Challenge、Interactive Challenge、または Log | 1 分または 1 時間 | 10 秒または 1 分 |
| Business | 15 | 10 | Block、Non-Interactive Challenge、Managed Challenge、Interactive Challenge、または Log | 1 分、1 時間、または 24 時間 | 10 秒、1 分、または 10 分 |
| Enterprise | 100 | 10 | Block、Non-Interactive Challenge、Managed Challenge、Interactive Challenge、または Log | 10 秒から 86,400 秒(24 時間)の間で入力した任意の期間 | 10 秒から 3,600 秒(1 時間)の間で入力した任意の値 |
Cloudflare Rate Limiting は、ドメインの Cloudflare プランに応じて、複数のレベルの設定制御をサポートします。プランごとにできることは、次の表のとおりです。
| 順番 | 作業 | 利用できるプラン |
|---|---|---|
| 1 | 基本的なレート制限ルールを設定する | すべてのプラン |
| 2 | Advanced Criteria を設定する | Business および Enterprise プラン |
| 3 | Advanced Response を設定する | Business および Enterprise プラン |
| 4 | Bypass オプションを設定する | Enterprise プラン |
レート制限ルールは、次の 3 つの要素で構成されます。
受信リクエストは、リクエストパス、リクエストスキーム、リクエストメソッド、および(任意で)オリジンのレスポンスコードに基づいて一致します。
例:
http://example.com/examplehttp://example.com/example/*
リクエストパスは大文字と小文字を区別しません。パターンは、クエリ文字列(?)やアンカー(#)の後ろの内容には一致できません。アスタリスク(*)は、空の並びを含む任意の文字の並びに一致します。例:
*.example.com/*は、example.comの任意のサブドメイン上の任意のパスに一致します。*example.com/example.htmlは、example.comまたはexample.comの任意のサブドメイン上のexample.htmlに一致します。*は、サイト上の任意のページに一致します。
example.com/path へのリクエストは、example.com/path/ と同じではありません。このルールの唯一の例外はホームページです。example.com は example.com/ に一致します。
HTTP または HTTPS。指定しない場合は両方に一致し、ルールには __ALL__ と表示されます。
POST または GET。指定しない場合はすべてのメソッドに一致し、ルールには __ALL__ と表示されます。
たとえば、オリジンサーバーが HTTP 401 または 403 ステータスコードを返すときにだけ、レート制限ルールに一致させます。レスポンスコード条件に一致してトリガーされたルールは、オリジンのレスポンスコードに関係なく、そのクライアントからの以降のリクエストをブロックします。
ルールは、同じクライアントから来るすべてのリクエストの件数と期間で一致できます。
最小 2 件のリクエストを指定します。1 件のリクエストでブロックする場合は、パスを利用不可にします。たとえば、オリジンサーバーが HTTP 403 ステータスコードを返すように設定します。
クライアントのリクエストが、指定した期間のしきい値を超えると、ルールがトリガーされます。
ルールの緩和は、緩和アクションとバン期間で構成されます。
レート制限のアクションは、提供状況 で述べたドメインプランに基づきます。
- Block: しきい値を超えると、Cloudflare は
HTTP 429エラーを返します。 - Non-Interactive Challenge: 訪問者は Cloudflare の非対話型チャレンジに合格する必要があります。合格すると、Cloudflare はリクエストを許可します。
- Managed Challenge: 訪問者は、リクエストの特性に基づいて Cloudflare が動的に選ぶチャレンジに合格する必要があります。合格すると、Cloudflare はリクエストを許可します。
- Interactive Challenge: 訪問者は Interactive Challenge に合格する必要があります。合格すると、Cloudflare はリクエストを許可します。
- Log: リクエストは Cloudflare Logs に記録されます。本番適用前のルールテストに役立ちます。
チャレンジアクションの詳細は Challenges を参照してください。
しきい値より短いタイムアウトを設定すると、API はタイムアウトをしきい値と同じ長さに自動で引き上げます。
レート制限に達した訪問者には、カスタムの エラーページ を指定していない場合、デフォルトの HTML ページが表示されます。加えて、Business および Enterprise のお客様は、ルール自体でレスポンスを指定できます。詳細は Advanced Response を設定する を参照してください。
Cloudflare Rate Limiting の一般的なしきい値を決めるには、24 時間のキャッシュされていないサイトリクエスト数を、同じ 24 時間のユニークビジター数で割ります。次に、推定した平均訪問分数で割ります。最後に 4(またはそれ以上)を掛けて、サイトの 1 分あたりの推定しきい値とします。4 より大きい値でも問題ありません。ほとんどの攻撃は、通常のトラフィックレートより桁違いに大きいためです。
特定 URL 向けの URL レート制限を決めるには、その URL の 24 時間のキャッシュされていないリクエスト数とユニークビジター数を使います。ユーザーからの報告と自身の監視に基づいて、しきい値を調整します。
次のセクションでは、よくある 2 種類のレート制限ルールを扱います。
Rate Limiting には、ワンクリックの Protect your login ツールがあります。5 分以内に 5 件を超える POST リクエストを送ったクライアントを 15 分間ブロックするルールを作成します。ほとんどのブルートフォース試行をブロックするのに十分です。
- Cloudflare ダッシュボード ↗ にログインし、アカウントとドメインを選びます。
- Security > WAF > Rate limiting rules を開きます。
- Rate Limiting で Protect your login を選びます。
- 表示される Protect your login ダイアログで、Rule Name と Enter your login URL を入力します。
- Save を選びます。
- Rate Limiting のルール一覧に Rule Name が表示されます。
-
Cloudflare ダッシュボード ↗ にログインし、アカウントとドメインを選びます。
-
Security > WAF > Rate limiting rules を開きます。
-
Create rate limiting rule を選びます。新しいルールの詳細を指定するダイアログが開きます。
-
Rule Name に、ルールの分かりやすい名前を入力します。
-
If Traffic Matching the URL で、ドロップダウンから HTTP スキームを選び、URL を入力します。
-
from the same IP address exceeds に、サンプリング期間内のリクエスト数を表す 1 より大きい整数を入力します。
-
requests per で、サンプリング期間(リクエストを数える期間)を選びます。Enterprise プランのドメインは、10 秒から 3,600 秒(1 時間)の間の任意の期間を手入力できます。
-
Then で、プランに応じて利用できるアクションのいずれかを選びます。詳細は ルールの緩和 を参照してください。
-
Block または Log を選んだ場合は、matching traffic from that visitor for で、しきい値がトリガーされたあとにそのオプションを適用する期間を選びます。Enterprise プランのドメインは、10 秒から 86,400 秒(24 時間)の間の任意の値を入力できます。
-
新しいルールを有効にするには、Save and Deploy を選びます。
新しいルールが、レート制限ルールの一覧に表示されます。
一般に、しきい値を下げるときは次を行います。
- 既存のルールはそのままにし、より低いしきい値の新しいルールを追加します。
- 新しいルールを置いたら、古いルールのアクション継続時間が過ぎてから、古いルールを削除します。
しきい値を上げるとき(正当なクライアントがブロックされている場合)は、既存ルール内でしきい値を上げます。
Advanced Criteria オプションでは、レート制限ルールに一致させる HTTP メソッド、ヘッダーレスポンス、オリジンのレスポンスコードを設定します。
新しいルールまたは既存ルールの高度な条件を設定する手順は次のとおりです。
-
Advanced Criteria を展開します。
-
Method(s) から値を選びます。デフォルト値は ANY で、すべての HTTP メソッドに一致します。
-
HTTP Response Header(s) で絞り込みます。オリジン Web サーバーが返すヘッダーを含めるには、Add header response field を選びます。
CF-Cache-Statusヘッダーはデフォルトで表示されます。Cloudflare がキャッシュ済みリソースをレート制限せずに配信するためです。キャッシュ済みリソースもレート制限するには、X を選んでこのヘッダーを削除するか、Also apply rate limit to cached assets を有効にします。HTTP Response Header(s) にヘッダーが複数ある場合は、AND のブール論理が適用されます。ヘッダーを除外するには、Not Equals オプションを使います。各ヘッダーは大文字と小文字を区別しません。
-
Origin Response code(s) に、一致させる各 HTTP レスポンスコードの数値を入力します。2 つ以上の HTTP コードはカンマで区切ります(例:
401, 403)。 -
(任意)プランに応じて、追加のレート制限機能を設定します。
-
Save and Deploy を選びます。
Advanced Response オプションでは、ルールのしきい値を超えたときに Cloudflare が返す情報の形式を設定します。静的なプレーンテキストまたは JSON コンテンツを返したいときに Advanced Response を使います。
プレーンテキストまたは JSON レスポンスを設定する手順は次のとおりです。
-
Advanced Response を展開します。
-
Response type で、デフォルト以外の形式を選びます。Custom JSON または Custom TEXT です。
-
返したいプレーンテキストまたは JSON レスポンスを入力します。レスポンスサイズの上限は 32 KB です。
-
(任意)プランに応じて、追加のレート制限機能を設定します。
-
Save and Deploy を選びます。
カスタム HTML ページを表示したい場合は、ダッシュボードで HTTP 429 エラー(Too many requests)向けのカスタムページを設定します。Response type で Default Cloudflare Rate Limiting Page を選ぶと(このフィールドのデフォルト値)、Cloudflare がそのページを表示します。
レート制限されたクライアントを特定の URL へリダイレクトするには、次の方法を使えます。
-
最終的に表示したいページの URL へリダイレクトする HTML ページを、サーバー上に作成します。ページ内容に meta
refresh↗ タグを含めます。次の例のようにします。<!doctype html> <html> <head> <meta charset="utf-8" /> <title>Custom RL page</title> <meta http-equiv="refresh" content="0; url='https://yourzonename/block'" /> </head> <body></body> </html>作成したページの公開 URL を控えておきます。
-
Cloudflare ダッシュボードで Settings ページを開きます。
Configurations を開く ↗ -
Error Pages を開きます。
-
Rate limiting block の横で、三点リーダー > Edit を選びます。
-
Custom page を選びます。
-
Custom page address に、サーバー上に作成したページの URL(meta
refreshタグを含むページ)を入力します。 -
Save を選びます。
プレーンテキストまたは JSON コンテンツを返したいが、レスポンスが 32 KB を超える場合も、同じ方法を使います。この場合、リダイレクト先 URL は、表示したいプレーンテキストまたは JSON リソースの URL になります。
Bypass は、レート制限に一致しても、特定の URL セットにはアクションを適用しない許可リストまたは例外を作ります。
Bypass を設定する手順は次のとおりです。
-
Bypass を展開します。
-
Bypass rule for these URLs に、レート制限ルールの対象外にする URL を入力します。各 URL は 1 行ずつ入力します。URL に指定した HTTP または HTTPS は、ルール保存時に自動で削除され、代わりに HTTP と HTTPS の両方に適用されます。
-
(任意)プランに応じて、追加のレート制限機能を設定します。
-
Save and Deploy を選びます。
ゾーンのレート制限分析は、Analytics & logs > Security で確認します。Rate Limiting の分析は、シミュレーションされたリクエストに一致するトラフィックを実線で、実際にブロックされたリクエストを点線で表します。レート制限ルールが生成するログは、Enterprise のお客様だけが Cloudflare Logs で確認できます。
Cloudflare は、ブロックしたリクエストに対して HTTP 429 エラーを返します。ロケーションごとのブロック済みリクエストの詳細は、Enterprise のお客様向けに、Analytics > Traffic の分析ダッシュボードの Status codes で提供されます。
レート制限ルールは、いちばん新しく作成したルールから、いちばん古いルールの順に評価されます。
たとえば、リクエストが次の 2 つのルールに一致する場合です。
- ルール #1:
test.example.comに一致(2024-03-01 に作成) - ルール #2:
*.example.com*に一致(2024-03-12 に作成)
ルール #2 の方が後に作成されたため、先にトリガーされます。
加えて、一致があり WAF が Log アクションを適用した場合は、Log は終了しないアクションであるため、ほかのレート制限ルールの評価を続けます。ほかのアクションを適用した場合は、以降のルールは評価されません。
Rate Limiting は、ユーザーが定義したレートを超えるトラフィックの急増を制限するためのものです。オリジンサーバーへ正確な件数のリクエストだけを到達させるよう設計されてはいません。リクエストの検出と内部カウンターの更新の間に遅延が入ることがあります。この遅延は数秒になることがあり、ブロックやチャレンジなどのアクションが適用される前に、超過分のリクエストがオリジンへ届くことがあります。