如何检查防火墙规则是不是存在

Posted

技术标签:

【中文标题】如何检查防火墙规则是不是存在【英文标题】:How to check if Firewall rule existed如何检查防火墙规则是否存在 【发布时间】:2016-09-10 14:21:03 【问题描述】:

我有一个按钮,一旦单击,它将向防火墙添加新规则。但问题是它可以被多次点击并且会添加很多规则。

如何检查防火墙中是否存在规则? (或者是否可以检查规则?)

这是我添加规则的代码:

ProcessStartInfo run = new ProcessStartInfo();
run.FileName = "cmd.exe";
run.Verb = "runas";
run.Arguments = "/C netsh advfirewall firewall add rule name=\"Block IP Rule\" dir=in interface=any action=block remoteip=x.x.x.x";
run.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(run);

【问题讨论】:

尝试删除现有规则并重新添加 :) ,想想简单 【参考方案1】:
    public static void RemoveFirewallRules(string RuleName = "BreakermindCom")

    try
    
        Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
        INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
        var currentProfiles = fwPolicy2.CurrentProfileTypes;               

        // Lista rules
        List<INetFwRule> RuleList = new List<INetFwRule>();

        foreach (INetFwRule rule in fwPolicy2.Rules)
        
            // Add rule to list
            //RuleList.Add(rule);
            // Console.WriteLine(rule.Name);
            if (rule.Name.IndexOf(RuleName) != -1)
            
                // Now add the rule
                INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));                     
                firewallPolicy.Rules.Remove(rule.Name);
                Console.WriteLine(rule.Name + " has been deleted from Firewall Policy");
            
        
    
    catch (Exception r)
    
        Console.WriteLine("Error delete rule from firewall");
    

作品...:

【讨论】:

***.com/questions/15409790/… 谢谢,虽然我尝试了 Oli 最简单的想法,而且在我的情况下效果更好。 github.com/fxstar/Chash/blob/master/… 这里是mysql数据库禁止和允许ip地址的例子【参考方案2】:

WindowsFirewallHelper 类。作为 VS 的 NuGet 包提供。 我寻找了几天的解决方案并找到了这个。为了一个非常重要的项目改变了我的生活。

这是执行您想要的操作的代码:

  private void initFWrule(object sender, EventArgs e)
        
            Console.WriteLine("CHECKING FIREWALL RULE EXISTENCE");
            var myRule = FirewallManager.Instance.Rules.SingleOrDefault(r => r.Name == "BlockUTG_Port-26881");
             //substitute your rule name in place of BlockUTG_Port-26881 above
            try
            
                if (myRule != null)
                
                    Console.WriteLine("Rules DOES Exist");
                

                else
                
                    Console.WriteLine("Rules DOES NOT Exist");
                    //run your code here to create rule
 
                
            

            catch (Exception ex)
            
                MessageBox.Show(ex.Message);
            

【讨论】:

【参考方案3】:

在将防火墙规则初始化为选择性/特定时,您可以使用 linq。

对于多个同名防火墙规则:

    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); 
    List<INetFwRule> firewallRules = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name.Contains(fwRuleName)).ToList();

    foreach (INetFwRule rule in firewallRules)
    
        firewallPolicy.Rules.Remove(rule.Name);
    

对于单个防火墙规则:

    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
    INetFwRule firewallRule = firewallPolicy.Rules.OfType<INetFwRule>().Where(x => x.Name == fwRuleName).FirstOrDefault();
    firewallPolicy.Rules.Remove(firewallRule.Name);

但是,如果您已经知道防火墙规则名称,您也可以这样做(未经测试,但没有 Where 子句):

    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
    firewallPolicy.Rules.Remove(fwRuleName);

重点是展示 linq 语法以及能够使用它搜索特定名称、模式等的灵活性。

【讨论】:

以上是关于如何检查防火墙规则是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何监视对 Azure 存储帐户防火墙规则所做的更改并发出警报

Linux IPTables:如何添加防火墙规则

pfSense配置基于时间的防火墙规则

openwrt内网穿透导致缓慢

如何在 terraform 中创建允许/拒绝防火墙规则条件?

firewalld防火墙基础配置