web-dev-qa-db-ja.com

iptablesを使用して、特定のHTTPリソースを要求したIPをブロックする

私は現在、/ wpad.datへのリクエストで溢れています-攻撃のように見える方法で。

ここで、私がやりたいのは、/ wpad.datを要求するすべてのIPに対してiptablesをトリガーし、それをブラックリストに追加することです。それを行う方法はありますか?つまり、IPは1つのフラッド要求を送信でき、その後は送信できません。

これを効率的に行うためのきちんとした方法はありますか?

1
Sandman

IPアドレスをブロックする方法は他にもあると考えるかもしれません。たとえば、Fail2banは、特定のパターンのログファイルをスキャンし、IPを一時的にブロックするように設計されています。

コメントで述べたように、ブラックリストに何千ものIPを追加している可能性があります。 iptablesは機能しますが、ルールを追加するたびに、各リクエストの処理時間が長くなる可能性があります。代わりにipsetを使用できます。これは、多くのIPが追加されている場合にはるかに高速であるように見えます。一致を高速化するためにハッシュアプ​​ローチを採用しています。 iptablesipsetの詳細と比較については、 ipsetを使用したIPアドレスの一括ブロック を参照してください。


iptablesを使用する場合は、Webサーバーの設定方法によって異なります。 Apacheまたはnginxを使用しているとすると、wpad.datが要求されたときに実行されるある種のcgiスクリプトをトリガーするように設定できます。

たとえば、Webサイトですでにphpが使用されている場合は、内部書き換えを使用してphpスクリプト(または通常使用する言語によってはRuby/python/Java)をトリガーできます。

スクリプトが実行されたら、コマンドラインで次のようなものを実行するようにスクリプトを取得します。

iptables -I INPUT -s {IP-HERE} -j DROP

スクリプトはrootとして実行する必要があり、Webユーザーにroot権限を与えることはおそらくお勧めできません。そのため、スクリプトをシェルスクリプトとしてパッケージ化し、chownをrootとしてパッケージ化し、setuidを使用できます。

大きな警告:そのリソースにアクセスすると、誤って自分自身をブロックする可能性があるため、--dportをポート80などに設定することをお勧めします。 。これにより、少なくともsshプロトコルのブロックが回避されるため、自分自身をブロックできた場合は、サーバーにsshして、自分自身のブロックを解除できます。

有効期限:多くのIPアドレスを永続的にブロックすることはめったに良い考えではないため、ブロックされたIPアドレスを追跡することをお勧めします(おそらくログに追加します)ファイル)、およびこれらのIPアドレスを定期的に削除するcronジョブを作成します。次のようなものを実行する必要があります。

iptables -D INPUT -s 192.168.1.100 -j DROP
2
ronalchn

Iptablesを使用すると、自動的にブロックすることは簡単ではありませんが、代わりに、次のルールを追加することで、接続を抑制してすべてのリソースを占有しないようにすることができます。

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT

1
Nathan C