OpenResty Edge のレート制限は、カスタムキー(クライアント IP アドレス、URI、URI パラメータ、または Cookie)ごとにリクエストレートを制限し、2 つのしきい値を使用します:超過したリクエストを遅延させるソフトな「Shape at」レートと、それらを直接拒否するハードな「Reject at」レートです。クライアントがリクエストを送信するのが速すぎる場合(例えばサービス拒否攻撃の場合など)、これによりゲートウェイサーバーとオリジンサーバーの両方を保護し、サーバーが過負荷にならないようにします。以下では、レート制限のページルールを段階的に追加し、wrk でテストし、同じ制限を SSL ハンドシェイクに拡張します。

クライアントのリクエストがオリジンサーバーに到達する前にフィルタリングする OpenResty Edge のリバースプロキシ

アプリケーションへのリクエストレート制限ページルールの追加

OpenResty Edge の管理者用 Web コンソールにアクセスしましょう。これはコンソールのサンプルデプロイメントです。各ユーザーは独自のデプロイメントを持っています。

HTTP/HTTPS アプリケーションを一覧表示する OpenResty Edge の Web コンソール

以前の例で使用した test-edge.com アプリケーションを引き続き使用できます。そのアプリケーションに入ります。

アプリケーション一覧内の test-edge.com サンプルアプリケーション

すでにページルールが 1 つ定義されています。

Page Rules セクションを強調表示した OpenResty Edge のアプリケーション概要

このページルールは、事前に定義されたアップストリームにリクエストを転送するリバースプロキシを設定しており、現時点ではリクエストレートの制限はありません。

my_backend アップストリームにプロキシする既存のページルール(レート制限なし)

では、既存のページルールを編集してレート制限を追加しましょう。新しいアクションを追加し、「Limit request rate」を検索します。

ページルールエディタで Limit request rate アクションを検索する

まず、レート制限のキーを指定する必要があります。

Key フィールドがクライアント IP アドレスに設定された Limit request rate アクション

クライアントの IP アドレス、URI、URI パラメータ、Cookie など、さまざまなキータイプが選択可能です。ここでは、デフォルトのキータイプであるクライアント IP アドレスを選択します。これは、個々のクライアント IP アドレスごとに制限を適用することを意味します。

レート制限のキータイプを一覧表示する Key ドロップダウン:クライアント IP アドレス、URI、URI パラメータ、リクエスト Cookie、X-Forwarded-For、リクエストヘッダー

「Shape at」レートはソフトリミットです。クライアントがこのレートよりも速くリクエストを送信しようとすると、ゲートウェイサーバーはこれらの過剰なリクエストを遅延させてこのレートに合わせます。したがって、クライアントがリクエストを送信する速度が速いほど、ゲートウェイが追加する遅延も長くなります。ここでは、毎秒 50 リクエストのレートを指定します。

Shape at ソフトリミットレートが毎秒 50 リクエストに設定されている

キーをクライアント IP アドレスに設定したため、制限は個々のクライアント IP アドレスごとに適用されます。

「Reject at」レートはハードリミットです。クライアントがこのハードリミットを超える速度でリクエストを送信する場合、待機せずに即座にブロックするなど、より積極的なアクションを取ることができます。ここでは、毎秒 100 リクエストのレートを指定します。

Reject at ハードリミットレートが毎秒 100 リクエストに設定されている

さまざまなブロックアクションを選択できます——現在の接続を即座に閉じる、エラーページを返す、またはボットを防ぐためのキャプチャページを返すなどです。デフォルトの「Error Page」(エラーページ)アクションを選択します。これは HTTP を介してエラーページを返します。

Close Connection、Error Page、Enable HCaptcha、Enable Edge Captcha を表示する Reject アクションのドロップダウン

ここではデフォルトの HTTP ステータスコード 503 を使用します。これはサービス利用不可を示します。

Reject アクションのステータスコードがデフォルトの 503 Service Unavailable に設定されている

このページルールへの変更を保存します。次に、いつものように、変更をプッシュするためにリリースします。

リリース待ちの変更がある、設定済みの Limit request rate ページルール

リリースすると、新しいページルールがすべてのゲートウェイサーバーに同期されます。

すべてのゲートウェイサーバーで同期ステータスが 12/12 となったリリース完了

これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。設定変更には、サーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。

OpenResty Edge のリリースがリロードなしですべてのゲートウェイクラスターに同期される図

wrk によるレート制限のテスト

次に、新しいレート制限の効果を検証します。

ターミナル上で、wrk というオープンソースツールを使用して、非常に高速に大量のリクエストを送信できます。

wrk -c 50 -d 1s http://test-edge.com/

ここでは、まず同時接続数 50 を使用します。-c オプションに注目してください。

同時接続数 50 で test-edge.com にリクエストを送信する wrk コマンド

このコマンドを実行すると、実際のリクエストレートは約毎秒 50 リクエストになります。これが設定した「Shape at」レートに相当します。

同時接続数 50 での wrk の結果。約毎秒 47.90 リクエストで、Shape at レートと一致

次に、同時接続数を上げて、wrk がより速くリクエストを送信するようにします。

wrk -c 128 -d 1s http://test-edge.com/

同時接続数 128 に注目してください。

同時接続数を 128 に上げて test-edge.com に対して実行する wrk コマンド

実行します!多くの拒否されたリクエストにエラー応答があることに注意してください。

同時接続数 128 での wrk の結果。超過したリクエストが拒否され、3498 件の非 2xx または 3xx 応答を示す

今回のリクエストレートが高いのは、サーバーが過剰なリクエストを非常に速く拒否しているためです。

同時接続数 128 での wrk の結果。拒否されたリクエストが非常に速く返るため、約毎秒 3539 リクエストを示す

SSL/TLS ハンドシェイクのレート制限

リクエストレートの制限に加えて、OpenResty Edge は HTTPS リクエストの SSL または TLS ハンドシェイクのレートも制限できます。

SSL ハンドシェイクレート制限セクションがある OpenResty Edge の SSL ページ

このページでは、SSL ハンドシェイクのレート制限を設定できます。スイッチをオンにすると、設定パラメータが表示されます。これらのパラメータは、リクエストレート制限機能と同じです——キーを選択し、「Shape at」と「Reject at」のレートを設定します。

クライアント IP キー、Shape at 100、Reject at 200 リクエスト/秒で有効化された SSL ハンドシェイクレート制限

レート制限が処理するのは、アプリケーション層のリクエスト洪水です。超過リクエストをシェイピングまたは拒否します。OpenResty Edge の他のセキュリティレイヤーとも連携して機能します:組み込み WAF が悪意あるリクエストをフィルタリングします(性能は OpenResty Edge WAF と ModSecurity の性能ベンチマーク比較をご参照ください)。ネットワーク層の大規模攻撃は、カーネル内の XDP による DDoS 緩和で遮断します。

OpenResty Edge レート制限に関するよくある質問

OpenResty Edge のレート制限は、どのリクエストを制限するかをどのように決定しますか?

選択したキーに基づいて制限します。デフォルトのキーはクライアント IP アドレスであるため、制限は個々のクライアント IP アドレスごとに適用されますが、URI、URI パラメータ、リクエスト Cookie、X-Forwarded-For 内のアドレス、またはリクエストヘッダーをキーにすることもできます。

「Shape at」レートと「Reject at」レートの違いは何ですか?

「Shape at」はソフトリミットです:ゲートウェイはレートを超えるリクエストを遅延させてレートに合わせるため、クライアントが速く送信するほど遅延が長くなります。「Reject at」はハードリミットです:クライアントがこれを超えると、ゲートウェイは待機する代わりに、より積極的なブロックアクションを取ります。

レート制限を超えたリクエストはどうなりますか?

ハードリミットのブロックアクションを選択できます:接続を即座に閉じる、エラーページを返す、またはボットを防ぐためのキャプチャページを返す。デフォルトの「Error Page」アクションは HTTP ステータスコード 503(サービス利用不可)を返します。

OpenResty Edge は SSL/TLS ハンドシェイクもレート制限できますか?

はい。リクエストレートに加えて、OpenResty Edge は HTTPS リクエストの SSL または TLS ハンドシェイクのレートも、リクエストレート制限と同じキー、「Shape at」、「Reject at」パラメータを使用して制限できます。

レート制限の変更にはサーバーのリロードや再起動が必要ですか?

いいえ。これらの設定変更には、サーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。リリースを行うと、すべてのゲートウェイクラスターとサーバーに同期されます。

OpenResty Edge について

OpenResty Edge は、マイクロサービスと分散トラフィックアーキテクチャ向けに設計された多機能ゲートウェイソフトウェアです。トラフィック管理、プライベート CDN 構築、API ゲートウェイ、セキュリティ保護などの機能を統合し、現代のアプリケーションの構築、管理、保護を容易にします。OpenResty Edge は業界をリードする性能と拡張性を持ち、高同時接続・高負荷シナリオの厳しい要求を満たすことができます。K8s などのコンテナアプリケーショントラフィックのスケジューリングをサポートし、大量のドメイン名を管理できるため、大規模ウェブサイトや複雑なアプリケーションのニーズを容易に満たすことができます。

このチュートリアルがお役に立ちましたら、ブログサイトや YouTube チャンネル のチャンネル登録をお願いいたします。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省の出身で、現在は米国ベイエリアに在住しています。中国における初期のオープンソース技術と文化の提唱者・リーダーの一人であり、Cloudflare、Yahoo!、Alibaba などの国際的なハイテクノロジー企業に勤務した経験があります。「エッジコンピューティング」「動的トレーシング」「マシンプログラミング」の先駆者でもあり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を有します。世界で 4,000 万以上のドメインに採用されているオープンソースプロジェクトのリーダーとして、OpenResty® を基盤に、米国シリコンバレーの中心部に OpenResty Inc. を創設しました。同社の主力製品である OpenResty XRay動的トレーシング 技術を活用した非侵入型のプロファイリングおよびトラブルシューティングツール)と OpenResty Edge(マイクロサービスおよび分散トラフィック向けの統合ゲートウェイソフトウェア)は、世界各地の上場企業および大企業に広く採用されています。OpenResty 以外にも、Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、多数のオープンソースプロジェクトに累計 100 万行超のコードを寄与し、60 件を超えるオープンソースソフトウェアライブラリを手がけています。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!