web-dev-qa-db-ja.com

iptablesはブロックしていません

Crontabによって毎分実行されるスクリプトがあります。

このスクリプトは、システムログをスキャンし、サーバーのdovecot、exim、またはsshへのログインに失敗したすべてのIPを取得し、それらをipsetに追加して、そのIPを永久にブロックします。

問題はこれです:スクリプトは毎分実行され、本来の機能を果たしています。つまり、攻撃者のIPを取得してipsetに追加しますが、システムを攻撃しようとしている同じIPのログエントリがまだあります。 1時間。

言い換えると。今、誰かがシステムを攻撃しようとしたとします。 1分以内に、スクリプトが実行され、パスワードが3回以上失敗したすべてのIPが取得され、ipsetに追加されます。それでも、何時間もブルートフォース攻撃を試みているIPのログがあり、接続は中断されません。

私の推測では、ipsetはテーブルにIPを追加することで機能し、次にIPがサーバーに到達したときにIPはブロックされますが、攻撃しようとしているサーバーにIPがすでに接続されている場合、接続は切断されません。これは正解?もしそうなら、進行中の接続を中断する方法はありますか?

注:念のために言っておきますが、blockingという名前のipsetをiptablesに追加するために使用したコマンドは次のとおりです。

iptables -A INPUT -p tcp --dport XX -m set --set blocking src -j DROP

ここで、XXはブロックしているポートです。

2
SpaceDog

iptables -Aは、チェーンのendに追加されます(-Aの長い形式は--appendであることに注意してください)。おそらく、上部にiptables -A INPUT -p tcp --dport XX -j ACCEPTに似たルールがあります。これは、ルールが上から下に実行されるときに最初に一致するため、干渉しています。

これを回避するには、2つの明らかな方法があります。

  • サービスの受け入れルールの前に呼び出される別のブロッキングチェーンを使用します。これは私が使用するアプローチです。ブロックチェーンへのジャンプが適切に条件付けられている場合、これらのルールはすべてではないためです。必要がないかどうかをテストしました。追加するブロックチェーンを決定する必要があります。もう1つの利点は、必要に応じて、ポート25の各ブロックを手動で見つけて削除するよりもiptables -F smtp-blocksを実行する方がはるかに簡単なことです(セットを使用しているという事実は、これをある程度軽減する可能性があります。私はあまり詳しくありません。ルールセットとそれらを使用して何ができるか。)

  • 置換iptables -Aiptables -Iを使用-Iを使用すると、先頭(または、指定されている場合は指定されたインデックスの前)に挿入され、サービス受け入れルールの前にブロックルールが実行されるようになります。

私の推測では、ipsetはテーブルにIPを追加することで機能し、次にIPがサーバーに到達したときにIPはブロックされますが、攻撃しようとしているサーバーにIPがすでに接続されている場合、接続は切断されません。これは正解?もしそうなら、進行中の接続を中断する方法はありますか?

ルールによります。 TCPプロトコルルールでSYNパケット(--syn)でのみ一致するように指定されている場合、接続が開始されているときにのみ一致します。ただし、デフォルトではすべてのパケットで一致します。 UDPには接続開始の概念はありませんが、同様の目的で接続追跡を使用できる場合があります。とはいえ、明示的に何も指定しない場合適切に配置されている場合、新しく追加されたルールは次の着信パケットと一致し、問題のルール。ルールに-j DROPと記載されている場合、リモートパーティの観点からは、ネットワークケーブルを引っ張った場合とほぼ同じです。

3
a CVn