次のスクリプトを使用して、テキストファイルからWindowsファイアウォールへのIPをブロックしています。
私はWindows2008R2を使用しています
@echo off
if "%1"=="list" (
netsh advfirewall firewall show rule Blockit | findstr RemoteIP
exit/b
)
:: Deleting existing block on ips
netsh advfirewall firewall delete rule name="Blockit"
:: Block new ips (while reading them from blockit.txt)
for /f %%i in (blockit.txt) do (
netsh advfirewall firewall add rule name="Blockit" protocol=any dir=in action=block remoteip=%%i
netsh advfirewall firewall add rule name="Blockit" protocol=any dir=out action=block remoteip=%%i
)
:: call this batch again with list to show the blocked IPs
call %0 list
問題は、このスクリプトがブロックされたIPごとに1つの個別のルールを作成していることです。
同じルールで複数のIPが禁止されているルールを少なくする方法はありますか?私が覚えている限り、各ルールには最大200の禁止されたIPが許可されています。したがって、IP番号201が見つかると、新しいルールが作成されます。このように、ブロックするIPが1000の場合、1000ルールではなく5ルールxルールあたり200IPが作成されます。
うまくいけば、誰かが私を助けることができます。ありがとうございました
200未満のIPの単純なケースでは、最初にファイルを反復処理し、すべてのIPアドレスを単一の文字列に取得する必要があります。次に、ループの外側でnetshコマンドを2回呼び出すことができます(受信トラフィックに対して1回、送信トラフィックに対して1回)。
200以上のIPに対応できるようにするために、カウンターをforループに追加しました。 200 IPを超えると、netshコマンドが呼び出され、IPカウンターがリセットされてから、ファイルのループが続行されます。最終的には、「Blockit n」の形式の一連のルールが作成されます。ここで、nは数値です。
よくわからないセクションの1つは、上部にあるリストと削除のディレクティブです。これらを正しく機能させるために、スクリプトは関連する「Blockit」ルールがいくつ存在するかを知る必要があります。私が思いつくことができる最高のものは、これらをリストし、結果をforループのfindstrに渡すことです。私はそれがうまく機能しているかどうかはわかりません。私はそれに取り組んでいきますが、それがほぼそこにあるので今これを投稿すると思いました-そしてうまくいけばあなたは最後のビットを理解することができるかもしれません:)
上部にenabledelayedexpansionディレクティブが追加されていることに注意してください。これにより、!VAR!を使用できます。初期化中に展開されないスタイル変数。実行時のみ。それ以外の場合、最終的なIPADDR変数には、テキストファイルの最後のIPのみが含まれます。
@echo off
setlocal enabledelayedexpansion
if "%1"=="list" (
SET /A RULECOUNT=0
for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do (
SET /A RULECOUNT+=1
netsh advfirewall firewall show rule Blockit!RULECOUNT! | findstr RemoteIP
)
SET "RULECOUNT="
exit/b
)
REM Deleting existing block on ips
SET /A RULECOUNT=0
for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do (
SET /A RULECOUNT+=1
netsh advfirewall firewall delete rule name="Blockit!RULECOUNT!"
)
SET "RULECOUNT="
REM Block new ips (while reading them from blockit.txt)
SET /A IPCOUNT=0
SET /A BLOCKCOUNT=1
for /f %%i in (blockit.txt) do (
SET /A IPCOUNT+=1
if !IPCOUNT! == 201 (
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR!
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR!
SET /A BLOCKCOUNT+=1
SET /A IPCOUNT=1
set IPADDR=%%i
) else (
if not "!IPADDR!" == "" (
set IPADDR=!IPADDR!,%%i
) else (
set IPADDR=%%i
)
)
)
REM add the final block of IPs of length less than 200
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR!
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR!
SET "IPCOUNT="
SET "BLOCKCOUNT="
SET "IPADDR="
REM call this batch again with list to show the blocked IPs
call %0 list
余談ですが、もしそれが私なら、おそらくこの種のこと(または実際に半近代的なMicrosoftプラットフォームでのスクリプト)についてPowershellを学ぶことを検討するでしょう。一度コツをつかむと、バッチファイルよりもはるかに直感的であることがわかりますfar。
(PS-これを読んでいるバッチファイルの専門家のために、より良い代替案を提案してください-私自身は専門家ではありません!)
http://cyber-defense.sans.org/blog/2011/10/25/windows-firewall-script-block-addresses-network-ranges の「警告と法的免責事項」セクションをご覧ください。 =次に、Import-Firewall-Blocklist.ps1スクリプトがどのように機能するかを確認します。