如何找出 IP 地址存在于哪个 Windows 防火墙规则范围内

如何找出 IP 地址存在于哪个 Windows 防火墙规则范围内

我编写了自己的 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 地址作为第一个参数来使用它。

如果有人知道的话,我仍然很想知道是否有办法从本质上做到这一点。

相关内容