public bool Block(BlockedEntry blockEntry, IPBlockPolicy policy, out string ruleName) { var firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); ruleName = $"{policy.GetRuleName()} [{blockEntry.Protocol}-{String.Join(",", blockEntry.Ports)}]"; var rules = GetRules(firewallPolicy, ruleName); var rule = rules.FirstOrDefault(r => CleanIps(r.RemoteAddresses).Count < 1000); if (rule != null) { var ips = CleanIps(rule.RemoteAddresses); if (!ips.Contains(blockEntry.Ip)) { ips.Add(blockEntry.Ip); rule.RemoteAddresses = String.Join(",", ips); ruleName = rule.Name; Console.WriteLine($"Blocked IP: {blockEntry.Ip}"); } else { Console.WriteLine($"IP AlreadyBlocked: {blockEntry.Ip}"); } } else { rule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule")); rule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK; rule.Description = $"IPBlocker blocked IP's"; rule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN; rule.Enabled = true; rule.RemoteAddresses = blockEntry.Ip; rule.InterfaceTypes = "All"; rule.Protocol = (int)blockEntry.Protocol; //NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP / NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP rule.LocalPorts = String.Join(",", blockEntry.Ports); rule.Name = GetNextRuleName(rules.Select(r => r.Name).ToList(), ruleName); firewallPolicy.Rules.Add(rule); rules.Add(rule); ruleName = rule.Name; Console.WriteLine($"Blocked IP: {blockEntry.Ip}"); } return(true); }
public void Add(BlockedEntry blockEntry, IPBlockPolicy policy, string source) { var record = new BlockedIpRecord { Source = source, RuleName = blockEntry.RuleName, DateBlocked = DateTime.Now, DateToUnblockIp = policy.GetUnblockDate(), Ip = blockEntry.Ip, IpLocation = blockEntry.IpLocation, IsBlocked = blockEntry.IsBLocked, Ports = String.Join(",", blockEntry.Ports), Protocol = blockEntry.Protocol.ToString().ToLower() }; _context.BlockedIpRecords.Add(record); _context.SaveChanges(); }