Apacheでレート制限を実装するにはどうすればよいですか?(1秒あたりのリクエスト数)


84

apacheで堅牢なレート制限(リクエスト|バイト/ IP /ユニット時間)を実装するために利用できる手法やモジュールは何ですか?


Red Hat6にはApache2.2しかないため、WebサーバーでLinuxのtcを使用しています。
2014年

回答:


55

最高の

そして残りは


10
IPアドレスで1日あたりの接続数を制限するものが見つかりませんでした。私は一晩中探していました、それは残念です。
グレッグ

1
リバースプロキシの背後で実行している場合に、mod_evasiveでIPの代わりにヘッダーを確認する方法があるかどうか誰かが知っていますか?
Stavros Korokithakis 2010年

6
4年後、mod_evasiveはまだ「最高」ですか?
ザックトンプソン

6
あなたの主張をバックアップします。なぜ_evasiveと_cbandが最高なのですか?
リード

4
mod_evasive多くのオンライン推奨事項を取得していますが、2017年半ばの時点で、ブログからすべての参照を奇妙に削除した作者のJonathan Zdziarskiによって放棄されたようですが、ソースコードはまだアップロードとして利用できます。他のプロジェクトは、過去6年間(またはの場合は15年間mod_limitipconn)更新されていません。
Anthony Geoghegan 2017

19

このブログ投稿で述べられているように、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"

3
modsec2がすでに実行されているので、これは私にとって完璧でした。次のように、modsecバージョンに一致するようにルールにIDを追加する必要がありました。<LocationMatch "^ / somepath"> SecAction initcol:ip =%{REMOTE_ADDR}、pass、nolog、id:10000001 SecAction "phase:5、deprecatevar: ip.somepathcounter = 1/1、pass、nolog、id:10000002 "SecRule IP:SOMEPATHCOUNTER" @gt 60 "" phase:2、pause:300、deny、status:509、setenv:RATELIMITED、skip:1、nolog、 id:10000003 "SecAction" phase:2、pass、setvar:ip.somepathcounter = + 1、nolog、id:10000004 "ヘッダーは常に再試行を設定します-" 10 "の後env = RATELIMITED </ LocationMatch>
Nathan Stretch

2
また、「@ gt 60」を編集することで許可される初期バースト要求の数と、ip.somepathcounter = 1/1ビットを編集することで制限を「再充電」する速度を変更できることにも注意してください。1/1では、1秒あたり1つの追加リクエストが許可されます。1/2など、一つの追加の要求毎に2秒を可能にする
ネイサンストレッチ

3
Apache 2.4はErrorDocumentの509について文句を言います、オプションはそれを429に変更しています(これは-もちろん-Apache 2.2ではサポートされていません)。また、mod_security 2.7以降、すべてのSecActionおよびSecRule-sにはIDが必要です。
Mrten 2015

1
参考までにmod_security、Apacheプロジェクトではありません。
クリストファーシュルツ

12

Webアプリケーションファイアウォールを含む多くの方法がありますが、Apachemodを使用する場合に実装するのが最も簡単な方法です。

私がお勧めしたいそのようなmodの1つはmod_qosです。これは、certin DOS、Bruteforce、およびSlowlorisタイプの攻撃に対して非常に効果的な無料のモジュールです。これにより、サーバーの負荷が大幅に軽減されます。

とてもパワフルです。

mod_qosモジュールの現在のリリースでは、以下を管理するための制御メカニズムが実装されています。

  • ロケーション/リソース(URL)または仮想ホストへの同時リクエストの最大数。

  • URLへの1秒あたりの最大許容リクエスト数や、1秒あたりのダウンロードキロバイトの最大/最小などの帯域幅の制限。

  • 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.

http://opensource.adnovum.ch/mod_qos/


これは古いapache2.2でのみ機能し、apache2.4 +では機能しませんね。
infiniteloop

@infiniteloop mod_quos sourceforgeページには、apache2.4で正常に動作すると書かれています。しかし、ここでは動作しない機能がいくつに関する具体的な議論があります:stackoverflow.com/a/15726540/1402498
JamesHoux

6

Apache 2.4には、mod_ratelimitと呼ばれる新しいストックモジュールがあります。モデム速度をエミュレートするには、mod_dialupを使用できます。なぜすべてにmod_ratelimitを使用できなかったのかわかりませんが。


mod_dialupは非同期SUSPENDED状態を使用し、待機中にスレッドを浪費しないことに注意してください。一方、mod_ratelimitは、現時点では、厳密に接続ごとのスレッドです。cf. thread.gmane.org/gmane.comp.apache.cvs/20490
ArtemGr 2013

6

残念ながら、mod_evasiveプリフォーク以外の構成で使用すると、期待どおりに機能しません(最近のapacheセットアップは主にMPMです)



1

レート制限を行う理由によって異なります。

サーバーの過負荷から保護する場合は、実際にはNGINXをサーバーの前に配置し、そこでレート制限を構成するのが理にかなっています。NGINXは、1万接続あたり数MBのように、はるかに少ないリソースを使用するため、これは理にかなっています。そのため、サーバーがフラッディングした場合、NGINXはレート制限を行い(わずかな量のリソースを使用)、許可されたトラフィックのみをApacheに渡します。

単純さだけが必要な場合は、mod_evasiveのようなものを使用してください。

いつものように、DDoSまたはDoS攻撃から保護する場合は、レート制限もあるCloudflareのようなサービスを使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.