我正在使用以下脚本阻止 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。因此,当找到 201 号 IP 时,它应该创建一个新规则。这样,如果我们要阻止 1000 个 ip,它将只创建 5 个规则 x 每个规则 200 个 ip,而不是 1000 个规则。
希望有人可以帮助我。谢谢
查看http://cyber-defense.sans.org/blog/2011/10/25/windows-firewall-script-block-addresses-network-ranges上的“警告和法律免责声明”部分,然后查看他们的Import-Firewall-Blocklist.ps1 脚本有效。
对于 < 200 个 IP 的简单情况,您首先需要遍历文件并将所有 IP 地址放入一个字符串中。然后您可以在循环外调用 netsh 命令两次(一次用于入站流量,一次用于出站)。
为了让它能够处理超过 200 个 IP,我在 for 循环中添加了一个计数器。一旦超过 200 个 IP,它将调用 netsh 命令并重置 IP 计数器,然后继续循环遍历文件。最终结果应该是您最终得到一系列格式为“Blockit n ”的规则,其中 n 是一个数字。
我不确定的一个部分是顶部的列表和删除指令。为了使这些正常工作,脚本需要知道存在多少相关的“Blockit”规则。我能想到的最好的办法是列出这些并通过 for 循环中的 findstr 传递结果。我不确定它是否工作正常。我会继续努力,但我想我现在会发布这个,因为它快到了——希望你能弄清楚最后一点:)
请注意在顶部附近添加了 enabledelayedexpansion 指令 - 这让我们可以使用 !VAR! 初始化期间不会扩展的样式变量;仅在执行时。否则最终的 IPADDR 变量将只包含文本文件中的最后一个 IP。
顺便说一句,如果是我,我可能会为这类事情学习 Powershell(或者实际上是半现代 Microsoft 平台上的任何脚本)。一旦你掌握了它,你会发现它比批处理文件直观得多。
(PS - 对于阅读本文的任何批处理文件专家,请随时提出更好的替代方案 - 我自己不是专家!)