web-dev-qa-db-ja.com

IPテーブルルールでDoS攻撃を阻止しますか?

簡単なIPテーブルルールで小さな(D)DoS攻撃を防ぐことができるかどうか疑問に思っていましたか?

ちなみに、1つまたは2つのIPアドレスからの400以上のリクエストがWebサーバーに殺到しているということです。 Webサーバーにアクセスし始めたことに気付いた後、IPアドレスを削除できますが、通常、IPテーブルがそのIPに対抗し、完全に削除し始めるため、そのWebサーバーに影響を与えないように数分かかります。 。

次のコマンドでIPを削除します。

iptables -I INPUT -s "IP HERE" -j DROP

そして明らかにそれを保存します:

/etc/init.d/iptables save

私は通常、次のコマンドで攻撃しているIPアドレスを見つけます。

netstat -plan|grep :80|awk '{print $5}'|cut -d: -f 1|sort|uniq -c|sort -n

そのようにすることの問題は、私がそこにいなければならないことであり、それは私が事後に行動することを必要とします。 150接続に達した直後にIPアドレスを削除するために使用できるIPテーブルルールはありますか?そうすれば、Webサーバーに負荷がかかることを心配する必要がありません。また、そのときにWebサーバーをブロックする必要もありません。

ちなみに、CentOSではApacheを使用しています。

お時間をいただきありがとうございます。

6
Josh Foskett

柔軟性を提供するものについては、最近の(そして制限された)モジュールを調べてください。 Recentは、特定の時間枠でIPによって行われた接続の数を追跡し、特定のルールをトリガーするために使用できます。最近のモジュールは(比較的)CPUに負荷がかかりますが、動的ページをロードする場合と比較すると、かなり許容範囲です。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -m recent --update --seconds 3600 --name BANNED --rsource -j DROP
-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j ATTK_CHECK

-A ATTACKED -m limit --limit 5/min -j LOG --log-prefix "IPTABLES (Rule ATTACKED): " --log-level 7
-A ATTACKED -m recent --set --name BANNED --rsource -j DROP
-A ATTK_CHECK -m recent --set --name ATTK –-rsource
-A ATTK_CHECK -m recent --update --seconds 600 --hitcount 150 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -m recent --update --seconds 60 --hitcount 50 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -j ACCEPT

基本的に、上記は次のようになります。

  • すでに確立されている接続を受け入れます(つまり、接続は私たちのルールに合格しています)
  • 禁止されたIPからポート80および443(SSL)のすべての接続をドロップします-それらが接続を試行し続ける場合は、時間を延長します-それらのブロックを解除する前に(接続試行なしで)1時間待ちます。
  • ルールに照らして新しい接続を確認します。
    • 攻撃10分で150以上の接続を検討する
    • 1分間の攻撃で50を超える接続を検討する
    • 攻撃をログに記録します(ただし、1分あたり5エントリを超えないようにしてください-ログに殺到したくない)。接続をブロックします

詳細な説明と、私が使用する上記の段階的バージョンについては、 この記事 を参照してください

IpTablesはネットワークの輻輳にまったく役立ちませんし、分散攻撃に対してはまったく効果がないことに注意してください。その利点はセキュリティとサーバーの負荷の軽減にあります。

13
cyberx86

あなたはこのように虐待者をブロックするためにiptablesを使用してできますが、iptablesは非常にCPUを集中的に使用するので注意する必要があります。すべてのパケットはすべてのルールに対してチェックされるため、ルールを追加すると、サーバーのサイクルがすぐになくなる可能性があります。誰かをブロックしたいときはいつでも新しいルールを追加するクライアントがありました。ある日、彼らは通常のトラフィックよりもわずかに高くなり、システムがダウンしました。テーブルは、見られるルールの数を減らすことができますが、iptablesにたくさんのルールを投げることはできません。

別の代替策は、ブラックホールルーティングです。

ip route add blackhole $IP_HERE
ip route flush cache

ルーティングテーブルはハッシュ化されます( hashtable を使用)。一方、iptablesルールは順次参照する必要があるため、効率が大幅に低下します。このようにすると、何十万ものルートを問題なく作成でき、何千ものiptablesルールがすべてのリクエストに対して実行するのに問題が生じます。

2番目の質問に関しては、hashlimitモジュールを使用して、乱用者用の自動ブラックリストを作成できます。詳細については、私の投稿 DDoS攻撃の防止について を参照してください。ただし、短い形式は次のとおりです。

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min \
    --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
4