我编写了自己的 IPS/IDS。对于它阻止的每个 IP 地址,它都会将其放入引用国家代码的 Windows 防火墙规则中。因此,我在 ~185 个防火墙规则范围内拥有 ~300k 个 IP 地址,最终阻止了我需要正确操作我的一个站点的 Cloudflare IP 地址之一。
显然,我的 IDS 需要更多功能,这样这种事情就不会发生...但是,在我写另一篇文章来查找 IP 之前,我想在这里发布这个问题...
有人知道如何找到 IP 地址存在于哪个防火墙规则范围内吗?通过 UI 中的搜索/过滤?或者可能是 powershell 或其他巧妙的命令?
答案1
我编写了一个小程序来实现这一点。这是我能做到的最好的事情,而且不会浪费太多时间:
static void Main(string[] args)
{
string ip;
#if DEBUG
args = new[] { "192.168.169.1" };
#endif
if (args.Length == 0)
{
Console.WriteLine("Please enter an IP address.");
Console.WriteLine("Usage: FindIpInFWRule any IPv4 or IPv6 address.");
Console.WriteLine("Example: FindIpInFWRule 127.0.0.1");
return;
}
else
{
ip = args[0];
}
var firewallPrefix = "_IDS_Blocklist_";
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
var firewallRules = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name.StartsWith(firewallPrefix)).ToList();
//Loop through the firewall rules
foreach (var fwRule in firewallRules)
{
Console.WriteLine(fwRule.Name);
var ipExists = fwRule.RemoteAddresses.Contains(ip);
if (ipExists)
{
Console.WriteLine(ip + " (contains) exists in " + fwRule.Name);
Environment.Exit(0);
}
}
}
我的所有规则都有一个前缀,将其与众多其他规则区分开。但是,如果您想搜索所有防火墙规则,只需删除 linq where 子句,如下所示:
var firewallRules = firewallPolicy.Rules.OfType<INetFwRule>().ToList();
只需将此代码放入 Visual Studio 控制台项目中(添加对 NetFwTypeLib 的 COM 引用) 并通过转到命令控制台并输入程序名称,然后输入 ip 地址作为第一个参数来使用它。
如果有人知道的话,我仍然很想知道是否有办法从本质上做到这一点。