1つのIPで1日あたり最大1 GBのトラフィックを使用することを許可します。その制限を超えると、そのIPからのすべてのリクエストは翌日までドロップされます。ただし、一定量の要求の後に接続がドロップされる、より単純なソリューションで十分です。
これを行うことができるある種のモジュールはすでにありますか?それとも、iptablesなどを使用してこれを実現できるでしょうか。
ありがとう
Apache 2.0の純粋なApacheソリューションbw_modとApache 1.3のmod_bandwidthが必要な場合。サーバーの帯域幅を調整して、帯域幅の使用を制限できます。
Mod_limitipconnもあり、1人のユーザーがサーバーに大量の接続を行うことを防ぎます。 mod_cbandも別のオプションですが、使用したことはありません。
Apacheインストールを台無しにしたくない場合は、Apacheの前にSquidプロキシを配置できます。また、スロットルをより詳細に制御できます。
ただし、ほとんどの場合、問題は、IPごとの帯域幅を制限したい場合や、ユーザーがあまりに多くのデータをプルしてブロックした場合に、まともなエラーメッセージを表示したい場合のいくつかの大きなオブジェクトです。その場合、PHPスクリプトを記述して、データベースの一時テーブルにアクセス情報を格納する方が簡単かもしれません。
これは、この種の問題に対する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
説明:
iptables
ソースIPが/ proc/net/ipt_recent/ATACKファイルに600秒間隔で5回以上リストされているかどうか、および新しいリクエストかどうかを確認します。ある場合は、拒否します。そうしないと
iptables
リクエストの宛先がポート80かどうかを確認します。その場合は、IPとタイムスタンプを/ proc/net/ipt_recent/ATACKに出力し、パケットを転送します。
私のニーズには問題なく機能しています。
Fail2banのようなツールを見たことはありますか?あなたにとって少し重いかもしれませんが、それはあなたが与えられたIPが許可するリクエストの数を制限することを可能にします。これはログを確認することで機能し、許可される時間あたりの違反数のルールを設定します。これにより、1日あたりのリクエスト数になる可能性があります。彼らがそれを超えると、ipchainsを使用してブロックするようなことができます。
これを使用して、メールサーバーに対するDDoS攻撃を非常にうまくブロックしました。ただし、かなりの量のプロセッサ能力を消費する可能性があります。
mod_dosevasive
またはmod_security
mod_dosevasive
は、指定された時間内に指定された数またはページがサイトにリクエストされた後にIPを禁止するように構成できます。