私たちのサービスの1つは、英国全土の200人の従業員専用のエクストラネットです。中国、ロシア、ウクライナ、ナイジェリアからのログイン試行が非常に多くなっています。ブロックしたいIP範囲の大きなリストがあります。何千ものエントリがあります。
(この議論の目的のために、私は国全体をブロックすることの是非についての議論を開くことに興味はありません。それは私が持っている要件であり、私はそれを実現する必要があります。)
24時間ごとにリストを更新し、Windowsファイアウォールにブロックルールを入力するPowershellスクリプトを作成しました。しかし、私はそれをアクティブにすることについて緊張しています。
私の質問は、この方法で何千ものブロックルールを処理する場合、Windowsファイアウォールはどの程度効率的ですか?たとえば、スクリプトに10,000のブロックルール(または100,000)が含まれている場合、それは効果的に機能するか、または停止して停止しますか?
Webサーバーをできる限り保護したいのですが、Webサーバーが要求を迅速に処理していることを確認する必要があります。
[〜#〜]更新[〜#〜]
チャンスをとって、PowerShellスクリプトを実行することにしました。少し違うテクニックを使ってみました。 (数百万のIPをカバーする)6700のルールを作成する代わりに、1つのルールを作成し、すべての不良IP範囲をすべてのリモートアドレスセクションのマザーにプッシュしました。
結果:完全に機能します。中国、ロシア、台湾、ウクライナ、ナイジェリアのほとんどをブロックします。ここでは、ハッキングの試みのほとんどが行われています。また、パフォーマンスに目立った違いはありません。同じ量のリクエストを変更せずに処理しているようです。 Windowsファイアウォールの1つ。何千ものIPブロックを非常に効率的に処理できるようです。
更新2-フィードバック
このスクリプトは数日前に作成されたので、状況についてフィードバックをいただければ幸いです。スクリプトをスケジュールされたジョブとして毎日実行するように設定し、ファイアウォールを新しいIP範囲で更新し、CSVファイルから読み取ります。これはすべて完璧に機能し、ファイアウォールは非常に速く機能します。 ただし注意点があります。スクリプト自体には約60秒かかります。実行に4〜5分かかります。この間、CPUは最大になり、Webリクエストは非常に遅くなります。
したがって、スクリプトを実行するのは、夕方、または大きな負荷が予想されないメンテナンスウィンドウの間に実行することをお勧めします。
私にとっての解決策は、負荷分散された各サーバーで異なる時間にスクリプトを実行することです。これにより、実行中にパフォーマンスが低下することはありません。
スクリプトは次のとおりです。
$csv = Import-Csv -Path 'C:\Scripts\IP Block List.csv'
$data = @()
$csv | ForEach-Object { $data += $_.From + "-" + $_.To }
Set-NetFirewallRule -Name "BlockAllIPsInList" -RemoteAddress $data
そしてここにサンプルCSVファイルがあります:
From,To
1.2.3.4,1.2.3.255
したがって、この例では、1.2.3.4から1.2.3.255までのすべてをブロックします。
少し作業するだけで、スクリプトを変更してCIDR形式でも機能するようにすることができます。お役に立てれば。
ゲームサーバーでこれを行いました。最終的にpfsenseのプラグイン用に変更しましたが、Windowsファイアウォールの数千のIPブロックによるパフォーマンスの低下に気づきませんでした。 IPに基づくブロックは、ファイアウォールが実行できる最も基本的なタスクの1つです。管理オーバーヘッド(そのためのスクリプトが既にあります)の他に、問題が発生する理由はわかりません。 FWIW、私はこのためにAmazonからroute53を使用することを検討しましたが、それはその時に私たちの目的を果たしませんでした。これらの国では、偽のIPを解決するのが遅くなるでしょう。
私たちのシナリオが異なる場合でも、共有したいと思います。Linuxでいくつかのサービスを実行している小さなVPS(1 CPU、256MB RAM)があり、ファイアウォールには、国全体にわたるアドレスのブロック全体を拒否する何千ものルールがあります。減速は見ていません。
大量のパケットをアプリケーションに送信して処理させるよりも、単純に大量のパケットをドロップするほうが、サーバーに要求が少なく、エラーメッセージを送り返すだけだと思います。それらを落とすことは、はるかに少ない力で済みます。