我正在使用以下脚本来阻止来自文本文件的 IP 进入 Windows 防火墙。
我正在使用 Windows 2008 R2
@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 时,它应该创建一个新规则。这样,如果我们有 1000 个 IP 需要阻止,它将只创建 5 条规则 x 每条规则 200 个 IP,而不是 1000 条规则。
希望有人能帮助我。谢谢
答案1
对于 IP 数量少于 200 个的简单情况,您首先需要遍历文件并将所有 IP 地址放入单个字符串中。然后您可以在循环外调用两次 netsh 命令(一次用于入站流量,一次用于出站流量)。
为了让它能够处理超过 200 个 IP,我在 for 循环中添加了一个计数器。一旦超过 200 个 IP,它将调用 netsh 命令并重置 IP 计数器,然后继续循环遍历文件。最终结果应该是您最终得到一系列规则,格式为“Blockitn",其中 n 是一个数字。
我不确定的一个部分是顶部的列表和删除指令。为了使这些指令正常工作,脚本需要知道存在多少相关的“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
顺便说一句,如果是我,我可能会学习 Powershell 来处理这类事情(或者实际上是在半现代的 Microsoft 平台上编写任何脚本)。一旦你掌握了它,你会发现它远远的比批处理文件更直观。
(PS-对于任何阅读本文的批处理文件专家,请随意建议更好的替代方案-我本人并不是专家!)
答案2
请参阅“警告和法律免责声明”部分http://cyber-defense.sans.org/blog/2011/10/25/windows-firewall-script-block-addresses-network-ranges然后看看他们的 Import-Firewall-Blocklist.ps1 脚本是如何工作的。