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はブロックしているポートです。
iptables -A
は、チェーンのendに追加されます(-A
の長い形式は--append
であることに注意してください)。おそらく、上部にiptables -A INPUT -p tcp --dport XX -j ACCEPT
に似たルールがあります。これは、ルールが上から下に実行されるときに最初に一致するため、干渉しています。
これを回避するには、2つの明らかな方法があります。
サービスの受け入れルールの前に呼び出される別のブロッキングチェーンを使用します。これは私が使用するアプローチです。ブロックチェーンへのジャンプが適切に条件付けられている場合、これらのルールはすべてではないためです。必要がないかどうかをテストしました。追加するブロックチェーンを決定する必要があります。もう1つの利点は、必要に応じて、ポート25の各ブロックを手動で見つけて削除するよりもiptables -F smtp-blocks
を実行する方がはるかに簡単なことです(セットを使用しているという事実は、これをある程度軽減する可能性があります。私はあまり詳しくありません。ルールセットとそれらを使用して何ができるか。)
置換iptables -A
iptables -I
を使用。 -I
を使用すると、先頭(または、指定されている場合は指定されたインデックスの前)に挿入され、サービス受け入れルールの前にブロックルールが実行されるようになります。
私の推測では、ipsetはテーブルにIPを追加することで機能し、次にIPがサーバーに到達したときにIPはブロックされますが、攻撃しようとしているサーバーにIPがすでに接続されている場合、接続は切断されません。これは正解?もしそうなら、進行中の接続を中断する方法はありますか?
ルールによります。 TCPプロトコルルールでSYNパケット(--syn
)でのみ一致するように指定されている場合、接続が開始されているときにのみ一致します。ただし、デフォルトではすべてのパケットで一致します。 UDPには接続開始の概念はありませんが、同様の目的で接続追跡を使用できる場合があります。とはいえ、明示的に何も指定しない場合適切に配置されている場合、新しく追加されたルールは次の着信パケットと一致し、問題のルール。ルールに-j DROP
と記載されている場合、リモートパーティの観点からは、ネットワークケーブルを引っ張った場合とほぼ同じです。