web-dev-qa-db-ja.com

Apache:IPあたりのリクエスト/トラフィックの数を制限しますか?

1つのIPで1日あたり最大1 GBのトラフィックを使用することを許可します。その制限を超えると、そのIPからのすべてのリクエストは翌日までドロップされます。ただし、一定量の要求の後に接続がドロップされる、より単純なソリューションで十分です。

これを行うことができるある種のモジュールはすでにありますか?それとも、iptablesなどを使用してこれを実現できるでしょうか。

ありがとう

12
Ian Kern

Apache 2.0の純粋なApacheソリューションbw_modとApache 1.3のmod_bandwidthが必要な場合。サーバーの帯域幅を調整して、帯域幅の使用を制限できます。

Mod_limitipconnもあり、1人のユーザーがサーバーに大量の接続を行うことを防ぎます。 mod_cbandも別のオプションですが、使用したことはありません。

Apacheインストールを台無しにしたくない場合は、Apacheの前にSquidプロキシを配置できます。また、スロットルをより詳細に制御できます。

ただし、ほとんどの場合、問題は、IPごとの帯域幅を制限したい場合や、ユーザーがあまりに多くのデータをプルしてブロックした場合に、まともなエラーメッセージを表示したい場合のいくつかの大きなオブジェクトです。その場合、PHPスクリプトを記述して、データベースの一時テーブルにアクセス情報を格納する方が簡単かもしれません。

5
pehrs

これは、この種の問題に対するiptablesソリューションです。調整--seconds--hitcount必要に応じて、iptablesテーブルも使用します。

iptables -A FORWARD -m state --state NEW -m recent --rcheck --seconds 600 --hitcount 5 --name ATACK --rsource -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -d 192.168.0.113/32 -o eth1 -p tcp -m tcp --dport 80 -m recent --set --name ATACK --rsource -j ACCEPT

説明:

  1. iptablesソースIPが/ proc/net/ipt_recent/ATACKファイルに600秒間隔で5回以上リストされているかどうか、および新しいリクエストかどうかを確認します。ある場合は、拒否します。そうしないと

  2. iptablesリクエストの宛先がポート80かどうかを確認します。その場合は、IPとタイムスタンプを/ proc/net/ipt_recent/ATACKに出力し、パケットを転送します。

私のニーズには問題なく機能しています。

5
Gustavo Feijo

Fail2banのようなツールを見たことはありますか?あなたにとって少し重いかもしれませんが、それはあなたが与えられたIPが許可するリクエストの数を制限することを可能にします。これはログを確認することで機能し、許可される時間あたりの違反数のルールを設定します。これにより、1日あたりのリクエスト数になる可能性があります。彼らがそれを超えると、ipchainsを使用してブロックするようなことができます。

これを使用して、メールサーバーに対するDDoS攻撃を非常にうまくブロックしました。ただし、かなりの量のプロセッサ能力を消費する可能性があります。

3
Peter Bagnall

mod_dosevasiveまたはmod_security

mod_dosevasiveは、指定された時間内に指定された数またはページがサイトにリクエストされた後にIPを禁止するように構成できます。

1
prophet.six