Apache でレート制限を実装するにはどうすればよいですか?(1 秒あたりのリクエスト数)
質問
Apache で堅牢なレート制限 (リクエスト|バイト/IP/単位時間) を実装するために利用できる技術やモジュールは何ですか?
解決
他のヒント
に記載されているように、 このブログ 投稿は使えそうです mod_security 1 秒あたりのレート制限を実装します。
構成は次のようなものです。
SecRuleEngine On
<LocationMatch "^/somepath">
SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>
ErrorDocument 509 "Rate Limit Exceeded"
Web アプリケーション ファイアウォールなどの方法は多数ありますが、Apache MOD を使用する場合が最も簡単に実装できます。
私がお勧めしたいMODの1つは、 mod_qos. 。これは、特定の DOS、ブルートフォース、および Slowloris タイプの攻撃に対して非常に効果的な無料モジュールです。これにより、サーバーの負荷がかなり軽減されます。
とても強力です.
現在のリリースでは、 mod_qos モジュールは、以下を管理するための制御メカニズムを実装します。
ロケーション/リソース(URL)または仮想ホストへの同時リクエストの最大数。
URLに対する最大許可されたリクエスト数などの帯域幅の制限、またはダウンロードされたKBYTESあたりの最大/最小値。
1秒あたりのリクエストイベントの数を制限します(特別リクエスト条件)。
- 定義された期間内のリクエスト イベントの数を制限します。
- また、制限が少ない場合もある場合もあれば、Webサーバーにアクセスする可能性のある非常に重要な人(VIP)を検出することもできます。
不正な操作を拒否する汎用要求ラインとヘッダーフィルター。
リクエスト本文データの制限とフィルタリング (mod_parp が必要)。
個々のクライアント (IP) のリクエスト イベントの数を制限します。
TCP接続レベルの制限、たとえば、単一のIPソースアドレスまたは動的なキープアリブ制御からの許可された接続の最大数。
- サーバーが無料のTCP接続を実行した場合、既知のIPアドレスを好みます。
これは、それを使用できるサンプル構成です。ニーズに合わせて何百もの構成が可能です。コントロールの詳細については、サイトをご覧ください。
Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate 120
# limits the connections for this virtual host:
QS_SrvMaxConn 800
# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose 600
# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP 50
# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP 172.18.3.32
QS_SrvMaxConnExcludeIP 192.168.10.
Apache 2.4 には、と呼ばれる新しいストック モジュールがあります。 mod_ratelimit. 。モデム速度をエミュレートするには、次を使用できます。 mod_ダイヤルアップ. 。ただし、なぜすべてに mod_ratelimit を使用できないのかはわかりません。
悲しいことに、 mod_evasive
非プリフォーク構成で使用すると期待どおりに動作しません (最近の Apache セットアップは主に MPM です)
レート制限を行う理由によって異なります。
サーバーの過負荷を防ぐためであれば、NGINX をその前に置き、設定するのが実際には理にかなっています。 レート制限 そこには。NGINX が使用するリソースははるかに少なく、1 万接続あたり数 MB 程度であるため、これは当然のことです。そのため、サーバーがフラッディングした場合、NGINX は (わずかな量のリソースを使用して) レート制限を行い、許可されたトラフィックのみを Apache に渡します。
シンプルさだけを求めている場合は、mod_evasive などを使用してください。
いつものように、DDoS または DoS 攻撃から保護する場合は、レート制限もある Cloudflare のようなサービスを使用してください。