私はiptablesのレート制限モジュールを使用してDoS攻撃を防止しています(フルスケールのDDoSを阻止できないことはわかっていますが、少なくとも小規模な攻撃には役立ちます)。
私のルールには次のようなものがあります。
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m limit --limit 20/minute --limit-burst 20 -j ACCEPT
昨夜誰かが私のポート80をノンストップで叩いていたまではうまく機能します。ルールに従って接続が切断されていました(ログに表示されています)。ただし、他の正当なユーザーもサーバーを使用できなくなります。
なぜそんなことが起こったのか分かりません。サーバーをフラッディングしているユーザー以外のユーザーには影響しないと思いました。
Iptablesが圧倒されたからですか?
フィードバックをいただければ幸いです。
ありがとうございました!
ルールは特定のオリジンを指定していないようです。 1分間に20の新しい接続を受け入れると、新しい接続の受け入れを停止します。
Iptablesが接続の送信元を記憶し、同じアドレスからの接続が速すぎるユーザーをブロックするには、recent
モジュールを使用する必要があります。これには2つのルールが必要です。1つはiptablesがアドレスを「学習」するためのもので、もう1つはiptablesが指定された時間内にそのアドレスがサーバーにヒットした回数を確認するためのものです。
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m recent --set
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m recent --update --seconds 60 --hitcount 20 -j DROP
この記事 詳細を説明します。
そのルールを適用する送信元IPアドレスを指定していないため、正当なユーザーのトラフィックも遮断されます。送信元アドレスを持つようにルールを変更した場合は、その特定のアドレスをRateLimitします。現在のルールでは、そのRateLimitはすべてのアドレスに対して有効です。
特定のルールで指定されているものを除くすべてのIPを制限するようにRateLimitを設定しています。私の構成は次のとおりです。
-I INPUT -m tcp -p tcp --dport 80 -d xx.xxx.xx.xx -j ACCEPT
-A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 400/min --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name ratelimit -j ACCEPT
次に、次のようなルールがたくさんあります。
これにより、接続制限とバーストが構成されたポート80での通信が可能になり、送信元IP(-hashlimit-mode srcip)によって制限されます。 IPは、RateLimit has(-hashlimit-name ratelimit)に存在するかどうかがチェックされます。
おそらく、そのようなものがあなたが探しているものよりも多いのでしょうか?