A:添加防火墙API
This commit is contained in:
1 parent
890dc936fc
commit
4c68765570
11 files changed
+2494
-3
No files matched your search
@@ -22,6 +22,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils.ETW.Test", "Utils.ETW
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinDivertNet", "WinDivertNet\WinDivertNet.csproj", "{16805469-CDF3-4ED6-9E6C-70DDFB0DF8B3}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils.Firewall", "Utils.Firewall\Utils.Firewall.csproj", "{596D1AAE-3763-4AB4-8BCD-262B2A54B781}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -72,5 +74,9 @@ Global
|
||||
{16805469-CDF3-4ED6-9E6C-70DDFB0DF8B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{16805469-CDF3-4ED6-9E6C-70DDFB0DF8B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{16805469-CDF3-4ED6-9E6C-70DDFB0DF8B3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{596D1AAE-3763-4AB4-8BCD-262B2A54B781}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{596D1AAE-3763-4AB4-8BCD-262B2A54B781}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{596D1AAE-3763-4AB4-8BCD-262B2A54B781}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{596D1AAE-3763-4AB4-8BCD-262B2A54B781}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -22,6 +22,7 @@ using Serilog.Events;
|
||||
using Shell;
|
||||
using Shell.Views;
|
||||
using Utils.ETW.Etw;
|
||||
using Utils.Firewall;
|
||||
|
||||
namespace NetVizor;
|
||||
|
||||
@@ -45,10 +46,21 @@ public partial class App : System.Windows.Application
|
||||
// NetView
|
||||
// var netView = new NetView();
|
||||
// netView.Show();
|
||||
|
||||
var window = new NetView();
|
||||
window.Show();
|
||||
|
||||
Mouth();
|
||||
|
||||
// var window = new NetView();
|
||||
// window.Show();
|
||||
|
||||
}
|
||||
|
||||
private async void Mouth()
|
||||
{
|
||||
var firewallService = new FirewallService();
|
||||
// 防火墙状态
|
||||
// var statusAsync = await firewallService.GetStatusAsync();
|
||||
var rulesAsync =await firewallService.GetRulesAsync();
|
||||
Console.WriteLine(JsonHelper.ToJson(rulesAsync));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<ProjectReference Include="..\Data\Data.csproj" />
|
||||
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
|
||||
<ProjectReference Include="..\Utils.ETW\Utils.ETW.csproj" />
|
||||
<ProjectReference Include="..\Utils.Firewall\Utils.Firewall.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
namespace Utils.Firewall;
|
||||
|
||||
public class Class1
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
namespace Utils.Firewall;
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙配置文件类型
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FirewallProfile
|
||||
{
|
||||
Domain = 1,
|
||||
Private = 2,
|
||||
Public = 4,
|
||||
All = Domain | Private | Public
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙规则方向
|
||||
/// </summary>
|
||||
public enum RuleDirection
|
||||
{
|
||||
Inbound = 1,
|
||||
Outbound = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙规则动作
|
||||
/// </summary>
|
||||
public enum RuleAction
|
||||
{
|
||||
Allow = 1,
|
||||
Block = 0
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 协议类型
|
||||
/// </summary>
|
||||
public enum ProtocolType
|
||||
{
|
||||
Any = 256,
|
||||
ICMPV4 = 1,
|
||||
IGMP = 2,
|
||||
TCP = 6,
|
||||
UDP = 17,
|
||||
IPv6 = 41,
|
||||
IPv6Route = 43,
|
||||
IPv6Frag = 44,
|
||||
GRE = 47,
|
||||
ICMPv6 = 58,
|
||||
IPv6NoNxt = 59,
|
||||
IPv6Opts = 60,
|
||||
VRRP = 112,
|
||||
PGM = 113,
|
||||
L2TP = 115
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙状态信息
|
||||
/// </summary>
|
||||
public class FirewallStatus
|
||||
{
|
||||
public bool IsEnabled { get; set; }
|
||||
public Dictionary<FirewallProfile, ProfileStatus> ProfileStatuses { get; set; } = new();
|
||||
public int TotalRules { get; set; }
|
||||
public int EnabledRules { get; set; }
|
||||
public int InboundRules { get; set; }
|
||||
public int OutboundRules { get; set; }
|
||||
public DateTime LastModified { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置文件状态
|
||||
/// </summary>
|
||||
public class ProfileStatus
|
||||
{
|
||||
public FirewallProfile Profile { get; set; }
|
||||
public bool IsEnabled { get; set; }
|
||||
public bool BlockAllInboundTraffic { get; set; }
|
||||
public bool NotifyOnListen { get; set; }
|
||||
public bool UnicastResponsesDisabled { get; set; }
|
||||
public RuleAction DefaultInboundAction { get; set; }
|
||||
public RuleAction DefaultOutboundAction { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙规则详细信息
|
||||
/// </summary>
|
||||
public class FirewallRule
|
||||
{
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string ApplicationName { get; set; } = string.Empty;
|
||||
public string ServiceName { get; set; } = string.Empty;
|
||||
public ProtocolType Protocol { get; set; }
|
||||
public string LocalPorts { get; set; } = string.Empty;
|
||||
public string RemotePorts { get; set; } = string.Empty;
|
||||
public string LocalAddresses { get; set; } = string.Empty;
|
||||
public string RemoteAddresses { get; set; } = string.Empty;
|
||||
public string IcmpTypesAndCodes { get; set; } = string.Empty;
|
||||
public RuleDirection Direction { get; set; }
|
||||
public bool Enabled { get; set; }
|
||||
public FirewallProfile Profiles { get; set; }
|
||||
public bool EdgeTraversal { get; set; }
|
||||
public RuleAction Action { get; set; }
|
||||
public string Grouping { get; set; } = string.Empty;
|
||||
public string InterfaceTypes { get; set; } = string.Empty;
|
||||
public List<string> Interfaces { get; set; } = new();
|
||||
public DateTime? CreationDate { get; set; }
|
||||
public DateTime? ModificationDate { get; set; }
|
||||
|
||||
// 高级属性
|
||||
public bool EdgeTraversalAllowed { get; set; }
|
||||
public bool LooseSourceMapping { get; set; }
|
||||
public bool LocalOnlyMapping { get; set; }
|
||||
public string RemoteMachineAuthorizationList { get; set; } = string.Empty;
|
||||
public string RemoteUserAuthorizationList { get; set; } = string.Empty;
|
||||
public string EmbeddedContext { get; set; } = string.Empty;
|
||||
public int Flags { get; set; }
|
||||
public bool SecureFlags { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建防火墙规则的请求
|
||||
/// </summary>
|
||||
public class CreateRuleRequest
|
||||
{
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string ApplicationName { get; set; } = string.Empty;
|
||||
public string ServiceName { get; set; } = string.Empty;
|
||||
public ProtocolType Protocol { get; set; } = ProtocolType.Any;
|
||||
public string LocalPorts { get; set; } = string.Empty;
|
||||
public string RemotePorts { get; set; } = string.Empty;
|
||||
public string LocalAddresses { get; set; } = "*";
|
||||
public string RemoteAddresses { get; set; } = "*";
|
||||
public string IcmpTypesAndCodes { get; set; } = string.Empty;
|
||||
public RuleDirection Direction { get; set; }
|
||||
public bool Enabled { get; set; } = true;
|
||||
public FirewallProfile Profiles { get; set; } = FirewallProfile.All;
|
||||
public RuleAction Action { get; set; } = RuleAction.Allow;
|
||||
public string Grouping { get; set; } = string.Empty;
|
||||
public string InterfaceTypes { get; set; } = "All";
|
||||
public List<string> Interfaces { get; set; } = new();
|
||||
|
||||
// 高级选项
|
||||
public bool EdgeTraversal { get; set; } = false;
|
||||
public bool EdgeTraversalAllowed { get; set; } = false;
|
||||
public string RemoteMachineAuthorizationList { get; set; } = string.Empty;
|
||||
public string RemoteUserAuthorizationList { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新防火墙规则的请求
|
||||
/// </summary>
|
||||
public class UpdateRuleRequest
|
||||
{
|
||||
public string CurrentName { get; set; } = string.Empty;
|
||||
public string? NewName { get; set; }
|
||||
public string? Description { get; set; }
|
||||
public bool? Enabled { get; set; }
|
||||
public string? ApplicationName { get; set; }
|
||||
public string? ServiceName { get; set; }
|
||||
public ProtocolType? Protocol { get; set; }
|
||||
public string? LocalPorts { get; set; }
|
||||
public string? RemotePorts { get; set; }
|
||||
public string? LocalAddresses { get; set; }
|
||||
public string? RemoteAddresses { get; set; }
|
||||
public FirewallProfile? Profiles { get; set; }
|
||||
public RuleAction? Action { get; set; }
|
||||
public string? Grouping { get; set; }
|
||||
public bool? EdgeTraversal { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙规则查询过滤器
|
||||
/// </summary>
|
||||
public class RuleFilter
|
||||
{
|
||||
public string? NamePattern { get; set; }
|
||||
public RuleDirection? Direction { get; set; }
|
||||
public bool? Enabled { get; set; }
|
||||
public FirewallProfile? Profile { get; set; }
|
||||
public ProtocolType? Protocol { get; set; }
|
||||
public RuleAction? Action { get; set; }
|
||||
public string? ApplicationName { get; set; }
|
||||
public string? Grouping { get; set; }
|
||||
public string? Port { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙统计信息
|
||||
/// </summary>
|
||||
public class FirewallStatistics
|
||||
{
|
||||
public int TotalRules { get; set; }
|
||||
public int EnabledRules { get; set; }
|
||||
public int DisabledRules { get; set; }
|
||||
public Dictionary<RuleDirection, int> RulesByDirection { get; set; } = new();
|
||||
public Dictionary<ProtocolType, int> RulesByProtocol { get; set; } = new();
|
||||
public Dictionary<FirewallProfile, int> RulesByProfile { get; set; } = new();
|
||||
public Dictionary<RuleAction, int> RulesByAction { get; set; } = new();
|
||||
public List<string> TopApplications { get; set; } = new();
|
||||
public List<string> TopPorts { get; set; } = new();
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
namespace Utils.Firewall;
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙规则模板
|
||||
/// </summary>
|
||||
/// <summary>
|
||||
/// 防火墙规则模板静态类
|
||||
/// 提供常用的防火墙规则模板,简化规则创建过程
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 这个类包含了一系列预定义的规则模板,涵盖了常见的网络服务和应用场景:
|
||||
/// - Web服务器规则(HTTP/HTTPS)
|
||||
/// - 远程桌面规则
|
||||
/// - 数据库服务器规则
|
||||
/// - 网络诊断规则(Ping)
|
||||
///
|
||||
/// 使用模板的好处:
|
||||
/// 1. 减少手动配置错误
|
||||
/// 2. 确保规则的一致性和安全性
|
||||
/// 3. 提高开发效率
|
||||
/// 4. 便于维护和更新
|
||||
/// </remarks>
|
||||
public static class FirewallRuleTemplates
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建Web服务器防火墙规则模板
|
||||
/// </summary>
|
||||
/// <param name="name">规则名称,建议使用描述性名称如"WebServer-HTTP"</param>
|
||||
/// <param name="port">Web服务端口号,默认为80(HTTP)。HTTPS通常使用443</param>
|
||||
/// <returns>配置完成的Web服务器规则创建请求</returns>
|
||||
/// <remarks>
|
||||
/// 此模板创建的规则特点:
|
||||
/// - 协议:TCP(Web服务基于TCP协议)
|
||||
/// - 方向:入站(允许外部访问Web服务)
|
||||
/// - 动作:允许(permit traffic)
|
||||
/// - 配置文件:所有(Domain、Private、Public)
|
||||
/// - 状态:启用
|
||||
///
|
||||
/// 常用端口:
|
||||
/// - HTTP: 80
|
||||
/// - HTTPS: 443
|
||||
/// - HTTP备用: 8080, 8443
|
||||
/// </remarks>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// // 创建HTTP服务规则
|
||||
/// var httpRule = FirewallRuleTemplates.CreateWebServerRule("MyWebSite-HTTP", 80);
|
||||
/// await firewallService.CreateRuleAsync(httpRule);
|
||||
///
|
||||
/// // 创建HTTPS服务规则
|
||||
/// var httpsRule = FirewallRuleTemplates.CreateWebServerRule("MyWebSite-HTTPS", 443);
|
||||
/// await firewallService.CreateRuleAsync(httpsRule);
|
||||
/// </code>
|
||||
/// </example>
|
||||
public static CreateRuleRequest CreateWebServerRule(string name, int port = 80)
|
||||
{
|
||||
return new CreateRuleRequest
|
||||
{
|
||||
Name = name,
|
||||
Description = $"Allow inbound traffic on port {port} for web server",
|
||||
Protocol = ProtocolType.TCP, // Web服务使用TCP协议
|
||||
LocalPorts = port.ToString(), // 指定监听端口
|
||||
Direction = RuleDirection.Inbound, // 允许外部连接到本地服务
|
||||
Action = RuleAction.Allow, // 允许连接
|
||||
Profiles = FirewallProfile.All, // 在所有网络配置文件中生效
|
||||
Enabled = true // 规则创建后立即启用
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建远程桌面连接防火墙规则模板
|
||||
/// </summary>
|
||||
/// <param name="name">规则名称,建议使用"RemoteDesktop"或"RDP"</param>
|
||||
/// <returns>配置完成的远程桌面规则创建请求</returns>
|
||||
/// <remarks>
|
||||
/// 此模板创建的规则特点:
|
||||
/// - 协议:TCP
|
||||
/// - 端口:3389(RDP标准端口)
|
||||
/// - 方向:入站
|
||||
/// - 动作:允许
|
||||
/// - 配置文件:Domain和Private(出于安全考虑,不包括Public)
|
||||
/// - 状态:启用
|
||||
///
|
||||
/// 安全注意事项:
|
||||
/// 1. 远程桌面规则不应在公共网络配置文件中启用
|
||||
/// 2. 建议配合强密码和网络级身份验证使用
|
||||
/// 3. 在生产环境中考虑更改默认端口号
|
||||
/// 4. 建议限制允许连接的IP地址范围
|
||||
/// </remarks>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// var rdpRule = FirewallRuleTemplates.CreateRemoteDesktopRule("Allow-RDP");
|
||||
/// await firewallService.CreateRuleAsync(rdpRule);
|
||||
/// </code>
|
||||
/// </example>
|
||||
public static CreateRuleRequest CreateRemoteDesktopRule(string name)
|
||||
{
|
||||
return new CreateRuleRequest
|
||||
{
|
||||
Name = name,
|
||||
Description = "Allow Remote Desktop Protocol",
|
||||
Protocol = ProtocolType.TCP, // RDP使用TCP协议
|
||||
LocalPorts = "3389", // RDP默认端口
|
||||
Direction = RuleDirection.Inbound, // 允许外部RDP连接
|
||||
Action = RuleAction.Allow, // 允许连接
|
||||
Profiles = FirewallProfile.Domain | FirewallProfile.Private, // 仅在受信任网络中启用
|
||||
Enabled = true // 立即启用
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建SQL Server数据库服务防火墙规则模板
|
||||
/// </summary>
|
||||
/// <param name="name">规则名称,建议包含实例名称如"SQLServer-Production"</param>
|
||||
/// <param name="port">SQL Server端口号,默认为1433(默认实例)</param>
|
||||
/// <returns>配置完成的SQL Server规则创建请求</returns>
|
||||
/// <remarks>
|
||||
/// 此模板创建的规则特点:
|
||||
/// - 协议:TCP
|
||||
/// - 端口:可配置(默认1433)
|
||||
/// - 方向:入站
|
||||
/// - 动作:允许
|
||||
/// - 配置文件:仅Domain(企业环境)
|
||||
/// - 状态:启用
|
||||
///
|
||||
/// SQL Server端口说明:
|
||||
/// - 默认实例:1433
|
||||
/// - 命名实例:动态端口或自定义固定端口
|
||||
/// - SQL Browser服务:1434(UDP)
|
||||
///
|
||||
/// 安全建议:
|
||||
/// 1. 仅在域环境中启用,避免在公共网络暴露数据库
|
||||
/// 2. 使用强密码和SQL Server身份验证
|
||||
/// 3. 考虑使用VPN或专用网络连接
|
||||
/// 4. 定期更新和打补丁
|
||||
/// </remarks>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// // 默认实例
|
||||
/// var sqlRule = FirewallRuleTemplates.CreateSQLServerRule("SQLServer-Default");
|
||||
///
|
||||
/// // 命名实例使用自定义端口
|
||||
/// var sqlNamedRule = FirewallRuleTemplates.CreateSQLServerRule("SQLServer-Instance1", 1435);
|
||||
///
|
||||
/// await firewallService.CreateRuleAsync(sqlRule);
|
||||
/// await firewallService.CreateRuleAsync(sqlNamedRule);
|
||||
/// </code>
|
||||
/// </example>
|
||||
public static CreateRuleRequest CreateSQLServerRule(string name, int port = 1433)
|
||||
{
|
||||
return new CreateRuleRequest
|
||||
{
|
||||
Name = name,
|
||||
Description = $"Allow SQL Server traffic on port {port}",
|
||||
Protocol = ProtocolType.TCP, // SQL Server使用TCP协议
|
||||
LocalPorts = port.ToString(), // SQL Server监听端口
|
||||
Direction = RuleDirection.Inbound, // 允许客户端连接到数据库
|
||||
Action = RuleAction.Allow, // 允许连接
|
||||
Profiles = FirewallProfile.Domain, // 仅在域环境中启用(安全考虑)
|
||||
Enabled = true // 立即启用
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建ICMP Ping防火墙规则模板
|
||||
/// </summary>
|
||||
/// <param name="name">规则名称,建议使用"ICMP-Echo"或"Allow-Ping"</param>
|
||||
/// <param name="allowPing">是否允许Ping,true为允许,false为阻止</param>
|
||||
/// <returns>配置完成的ICMP规则创建请求</returns>
|
||||
/// <remarks>
|
||||
/// 此模板创建的规则特点:
|
||||
/// - 协议:ICMPv4
|
||||
/// - ICMP类型:8(Echo Request)
|
||||
/// - 方向:入站
|
||||
/// - 动作:根据allowPing参数决定(允许/阻止)
|
||||
/// - 配置文件:所有
|
||||
/// - 状态:启用
|
||||
///
|
||||
/// ICMP类型说明:
|
||||
/// - Type 8: Echo Request (ping请求)
|
||||
/// - Type 0: Echo Reply (ping回复)
|
||||
/// - "*": 表示所有代码
|
||||
///
|
||||
/// 使用场景:
|
||||
/// 1. 网络诊断和故障排除
|
||||
/// 2. 监控系统的连通性检查
|
||||
/// 3. 网络拓扑发现
|
||||
///
|
||||
/// 安全考虑:
|
||||
/// - 在生产环境中可能需要禁用ping以避免网络扫描
|
||||
/// - 某些安全策略要求阻止ICMP流量
|
||||
/// </remarks>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// // 允许ping
|
||||
/// var allowPingRule = FirewallRuleTemplates.CreatePingRule("Allow-ICMP-Ping", true);
|
||||
///
|
||||
/// // 阻止ping
|
||||
/// var blockPingRule = FirewallRuleTemplates.CreatePingRule("Block-ICMP-Ping", false);
|
||||
///
|
||||
/// await firewallService.CreateRuleAsync(allowPingRule);
|
||||
/// </code>
|
||||
/// </example>
|
||||
public static CreateRuleRequest CreatePingRule(string name, bool allowPing = true)
|
||||
{
|
||||
return new CreateRuleRequest
|
||||
{
|
||||
Name = name,
|
||||
Description = allowPing ? "Allow ICMP Echo Request" : "Block ICMP Echo Request",
|
||||
Protocol = ProtocolType.ICMPV4, // IPv4的ICMP协议
|
||||
IcmpTypesAndCodes = "8:*", // Type 8: Echo Request, Code: Any
|
||||
Direction = RuleDirection.Inbound, // 处理入站ping请求
|
||||
Action = allowPing ? RuleAction.Allow : RuleAction.Block, // 根据参数决定动作
|
||||
Profiles = FirewallProfile.All, // 在所有网络配置文件中生效
|
||||
Enabled = true // 立即启用规则
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
namespace Utils.Firewall;
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙服务实现
|
||||
/// </summary>
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙服务的具体实现类
|
||||
/// 提供对Windows防火墙的完整管理功能,实现了 <see cref="IFirewallService"/> 接口
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 这个类是防火墙服务的主要实现,它:
|
||||
/// 1. 将同步的防火墙API调用包装为异步方法
|
||||
/// 2. 提供线程安全的防火墙操作
|
||||
/// 3. 处理底层API的异常并转换为友好的返回值
|
||||
/// 4. 支持依赖注入,便于测试和替换实现
|
||||
/// </remarks>
|
||||
public class FirewallService : IFirewallService
|
||||
{
|
||||
/// <summary>
|
||||
/// 底层防火墙API接口实例
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 通过接口依赖,可以方便地切换不同的防火墙实现
|
||||
/// 目前默认使用Windows防火墙API
|
||||
/// </remarks>
|
||||
private readonly IFirewallApi _api;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化防火墙服务实例
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 构造函数中创建Windows防火墙API实例
|
||||
/// 在实际项目中,建议通过依赖注入容器来管理API实例
|
||||
/// </remarks>
|
||||
public FirewallService()
|
||||
{
|
||||
// 创建Windows防火墙API实例
|
||||
// TODO: 考虑通过构造函数参数注入,以提高可测试性
|
||||
_api = new WindowsFirewallApi();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取防火墙状态信息
|
||||
/// </summary>
|
||||
/// <returns>防火墙状态对象,包含各配置文件的启用状态</returns>
|
||||
/// <remarks>
|
||||
/// 使用Task.Run将同步调用转换为异步调用,避免阻塞UI线程
|
||||
/// 在高并发场景下,建议使用更高级的异步模式
|
||||
/// </remarks>
|
||||
public Task<FirewallStatus> GetStatusAsync()
|
||||
{
|
||||
return Task.Run(() => _api.GetFirewallStatus());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取防火墙规则列表
|
||||
/// </summary>
|
||||
/// <param name="filter">规则过滤器,为null时返回所有规则</param>
|
||||
/// <returns>符合条件的防火墙规则列表</returns>
|
||||
/// <remarks>
|
||||
/// 根据是否提供过滤器来决定调用不同的API方法
|
||||
/// 获取所有规则可能耗时较长,建议在必要时使用过滤器
|
||||
/// </remarks>
|
||||
public Task<List<FirewallRule>> GetRulesAsync(RuleFilter? filter = null)
|
||||
{
|
||||
return Task.Run(() => filter == null ? _api.GetAllRules() : _api.GetRulesByFilter(filter));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步根据名称获取特定防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要查找的规则名称</param>
|
||||
/// <returns>匹配的规则对象,未找到时返回null</returns>
|
||||
/// <remarks>
|
||||
/// 规则名称查找是精确匹配且区分大小写
|
||||
/// 建议在调用前验证规则名称的有效性
|
||||
/// </remarks>
|
||||
public Task<FirewallRule?> GetRuleAsync(string ruleName)
|
||||
{
|
||||
return Task.Run(() => _api.GetRuleByName(ruleName));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步创建新的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="request">规则创建请求,包含所有必要的规则信息</param>
|
||||
/// <returns>创建成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 创建规则是一个原子操作,要么完全成功,要么完全失败
|
||||
/// 如果规则名称冲突,底层API会抛出异常
|
||||
/// </remarks>
|
||||
public Task<bool> CreateRuleAsync(CreateRuleRequest request)
|
||||
{
|
||||
return Task.Run(() => _api.CreateRule(request));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步更新现有防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="request">规则更新请求,必须包含要更新的规则名称</param>
|
||||
/// <returns>更新成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 更新操作会完全替换现有规则的所有属性
|
||||
/// 建议在更新前先获取现有规则信息作为备份
|
||||
/// </remarks>
|
||||
public Task<bool> UpdateRuleAsync(UpdateRuleRequest request)
|
||||
{
|
||||
return Task.Run(() => _api.UpdateRule(request));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步删除指定名称的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要删除的规则名称</param>
|
||||
/// <returns>删除成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 删除操作是不可逆的,请谨慎操作
|
||||
/// 如果规则不存在,某些实现可能返回true(认为目标已达成)
|
||||
/// </remarks>
|
||||
public Task<bool> DeleteRuleAsync(string ruleName)
|
||||
{
|
||||
return Task.Run(() => _api.DeleteRule(ruleName));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步启用指定配置文件的防火墙
|
||||
/// </summary>
|
||||
/// <param name="profile">要启用的防火墙配置文件</param>
|
||||
/// <returns>启用成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 启用防火墙会立即生效,影响所有网络连接
|
||||
/// 在某些环境中可能需要管理员权限
|
||||
/// </remarks>
|
||||
public Task<bool> EnableFirewallAsync(FirewallProfile profile = FirewallProfile.All)
|
||||
{
|
||||
return Task.Run(() => _api.EnableFirewall(profile));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步禁用指定配置文件的防火墙
|
||||
/// </summary>
|
||||
/// <param name="profile">要禁用的防火墙配置文件</param>
|
||||
/// <returns>禁用成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 禁用防火墙会立即生效,可能降低系统安全性
|
||||
/// 建议只在必要的故障排除场景中使用
|
||||
/// </remarks>
|
||||
public Task<bool> DisableFirewallAsync(FirewallProfile profile = FirewallProfile.All)
|
||||
{
|
||||
return Task.Run(() => _api.DisableFirewall(profile));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取防火墙运行统计信息
|
||||
/// </summary>
|
||||
/// <returns>包含各种统计数据的对象</returns>
|
||||
/// <remarks>
|
||||
/// 统计信息的准确性取决于底层防火墙的实现
|
||||
/// 某些统计数据可能只在防火墙启用时才会更新
|
||||
/// </remarks>
|
||||
public Task<FirewallStatistics> GetStatisticsAsync()
|
||||
{
|
||||
return Task.Run(() => _api.GetStatistics());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步阻止指定应用程序的所有网络访问
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序的完整文件路径</param>
|
||||
/// <returns>阻止成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 此方法会创建一个出站阻止规则来禁止应用程序联网
|
||||
/// 应用程序路径必须是有效的可执行文件路径
|
||||
/// </remarks>
|
||||
public Task<bool> BlockApplicationAsync(string applicationPath)
|
||||
{
|
||||
return Task.Run(() => _api.BlockApplication(applicationPath));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步解除对指定应用程序的网络访问阻止
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序的完整文件路径</param>
|
||||
/// <returns>解除阻止成功返回true,失败返回false</returns>
|
||||
/// <remarks>
|
||||
/// 此方法会删除之前为该应用程序创建的阻止规则
|
||||
/// 如果应用程序没有相关的阻止规则,操作通常会成功返回
|
||||
/// </remarks>
|
||||
public Task<bool> UnblockApplicationAsync(string applicationPath)
|
||||
{
|
||||
return Task.Run(() => _api.UnblockApplication(applicationPath));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,544 @@
|
||||
namespace Utils.Firewall;
|
||||
|
||||
/// <summary>
|
||||
/// Windows防火墙管理API接口
|
||||
/// 定义了完整的Windows防火墙管理功能,包括状态管理、规则操作、配置文件管理、日志监控等
|
||||
/// 实现此接口的类应提供对Windows防火墙的全面控制能力
|
||||
/// </summary>
|
||||
public interface IFirewallApi
|
||||
{
|
||||
#region 防火墙状态管理
|
||||
|
||||
/// <summary>
|
||||
/// 获取防火墙的完整状态信息
|
||||
/// 包括所有配置文件的状态、规则统计、启用状态等详细信息
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 包含防火墙完整状态的FirewallStatus对象,包括:
|
||||
/// - 整体启用状态
|
||||
/// - 各配置文件的详细状态
|
||||
/// - 规则数量统计(总数、已启用、入站、出站)
|
||||
/// </returns>
|
||||
FirewallStatus GetFirewallStatus();
|
||||
|
||||
/// <summary>
|
||||
/// 启用指定配置文件的防火墙
|
||||
/// 此操作通常需要管理员权限
|
||||
/// </summary>
|
||||
/// <param name="profile">
|
||||
/// 要启用的防火墙配置文件,可以是:
|
||||
/// - FirewallProfile.Domain(域网络)
|
||||
/// - FirewallProfile.Private(私有网络)
|
||||
/// - FirewallProfile.Public(公共网络)
|
||||
/// - FirewallProfile.All(所有配置文件,默认值)
|
||||
/// </param>
|
||||
/// <returns>操作成功返回true,失败返回false(可能由于权限不足或系统错误)</returns>
|
||||
bool EnableFirewall(FirewallProfile profile = FirewallProfile.All);
|
||||
|
||||
/// <summary>
|
||||
/// 禁用指定配置文件的防火墙
|
||||
/// 此操作通常需要管理员权限,禁用防火墙会降低系统安全性
|
||||
/// </summary>
|
||||
/// <param name="profile">
|
||||
/// 要禁用的防火墙配置文件,可以是:
|
||||
/// - FirewallProfile.Domain(域网络)
|
||||
/// - FirewallProfile.Private(私有网络)
|
||||
/// - FirewallProfile.Public(公共网络)
|
||||
/// - FirewallProfile.All(所有配置文件,默认值)
|
||||
/// </param>
|
||||
/// <returns>操作成功返回true,失败返回false(可能由于权限不足或系统错误)</returns>
|
||||
bool DisableFirewall(FirewallProfile profile = FirewallProfile.All);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定配置文件的详细状态信息
|
||||
/// 包括启用状态、默认动作、通知设置等配置细节
|
||||
/// </summary>
|
||||
/// <param name="profile">
|
||||
/// 要查询的配置文件:
|
||||
/// - FirewallProfile.Domain(域网络配置文件)
|
||||
/// - FirewallProfile.Private(私有网络配置文件)
|
||||
/// - FirewallProfile.Public(公共网络配置文件)
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 包含配置文件详细状态的ProfileStatus对象,包括:
|
||||
/// - 启用状态
|
||||
/// - 是否阻止所有入站流量
|
||||
/// - 通知设置
|
||||
/// - 单播响应设置
|
||||
/// - 默认入站和出站动作
|
||||
/// </returns>
|
||||
ProfileStatus GetProfileStatus(FirewallProfile profile);
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的状态和配置
|
||||
/// 允许批量修改配置文件的各项设置
|
||||
/// </summary>
|
||||
/// <param name="profile">要修改的配置文件</param>
|
||||
/// <param name="status">
|
||||
/// 包含要设置的状态信息的ProfileStatus对象,可设置:
|
||||
/// - 是否启用防火墙
|
||||
/// - 是否阻止所有入站流量
|
||||
/// - 通知开关
|
||||
/// - 单播响应设置
|
||||
/// - 默认入站和出站动作
|
||||
/// </param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
bool SetProfileStatus(FirewallProfile profile, ProfileStatus status);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 规则查询
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统中的所有防火墙规则
|
||||
/// 包括系统预定义规则和用户自定义规则
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 包含所有防火墙规则的列表,每个规则包含完整的配置信息
|
||||
/// 如果无法访问防火墙(如权限不足),可能返回空列表
|
||||
/// </returns>
|
||||
List<FirewallRule> GetAllRules();
|
||||
|
||||
/// <summary>
|
||||
/// 根据指定的过滤条件获取防火墙规则
|
||||
/// 支持多种条件的组合过滤,提供灵活的规则查询能力
|
||||
/// </summary>
|
||||
/// <param name="filter">
|
||||
/// 过滤条件对象,可包含以下条件:
|
||||
/// - NamePattern: 规则名称模式匹配
|
||||
/// - Direction: 流量方向(入站/出站)
|
||||
/// - Enabled: 启用状态
|
||||
/// - Profile: 适用的配置文件
|
||||
/// - Protocol: 协议类型
|
||||
/// - Action: 规则动作(允许/阻止)
|
||||
/// - ApplicationName: 应用程序名称
|
||||
/// - Grouping: 规则组名
|
||||
/// - Port: 端口号
|
||||
/// </param>
|
||||
/// <returns>符合过滤条件的防火墙规则列表</returns>
|
||||
List<FirewallRule> GetRulesByFilter(RuleFilter filter);
|
||||
|
||||
/// <summary>
|
||||
/// 根据规则名称获取特定的防火墙规则
|
||||
/// 规则名称在系统中应该是唯一的
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要查找的规则名称,区分大小写</param>
|
||||
/// <returns>
|
||||
/// 找到的防火墙规则对象,如果规则不存在则返回null
|
||||
/// </returns>
|
||||
FirewallRule? GetRuleByName(string ruleName);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定应用程序的所有相关防火墙规则
|
||||
/// 用于查看某个应用程序的网络访问权限设置
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">
|
||||
/// 应用程序的完整路径,例如:
|
||||
/// "C:\Program Files\MyApp\MyApp.exe"
|
||||
/// 路径应使用反斜杠分隔符,区分大小写
|
||||
/// </param>
|
||||
/// <returns>与指定应用程序相关的所有防火墙规则列表</returns>
|
||||
List<FirewallRule> GetRulesByApplication(string applicationPath);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定端口和协议的所有相关防火墙规则
|
||||
/// 用于查看某个端口的访问控制设置
|
||||
/// </summary>
|
||||
/// <param name="port">端口号,范围1-65535</param>
|
||||
/// <param name="protocol">
|
||||
/// 协议类型,可选值:
|
||||
/// - ProtocolType.TCP
|
||||
/// - ProtocolType.UDP
|
||||
/// - ProtocolType.Any(默认值,匹配所有协议)
|
||||
/// </param>
|
||||
/// <returns>与指定端口和协议相关的所有防火墙规则列表</returns>
|
||||
List<FirewallRule> GetRulesByPort(int port, ProtocolType protocol = ProtocolType.Any);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定规则组的所有防火墙规则
|
||||
/// 规则组用于将相关规则进行逻辑分组管理
|
||||
/// </summary>
|
||||
/// <param name="groupName">
|
||||
/// 规则组名称,例如:
|
||||
/// - "Core Networking"(核心网络)
|
||||
/// - "Remote Desktop"(远程桌面)
|
||||
/// - 自定义组名
|
||||
/// </param>
|
||||
/// <returns>属于指定组的所有防火墙规则列表</returns>
|
||||
List<FirewallRule> GetRulesByGroup(string groupName);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 规则管理
|
||||
|
||||
/// <summary>
|
||||
/// 创建新的防火墙规则
|
||||
/// 此操作通常需要管理员权限
|
||||
/// </summary>
|
||||
/// <param name="request">
|
||||
/// 创建规则的请求对象,必须包含以下信息:
|
||||
/// - Name: 规则名称(必须唯一)
|
||||
/// - Direction: 流量方向(入站/出站)
|
||||
/// - Action: 规则动作(允许/阻止)
|
||||
/// - 其他可选配置如端口、地址、应用程序等
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 创建成功返回true,失败返回false
|
||||
/// 失败原因可能包括:权限不足、规则名称重复、配置无效等
|
||||
/// </returns>
|
||||
bool CreateRule(CreateRuleRequest request);
|
||||
|
||||
/// <summary>
|
||||
/// 更新现有的防火墙规则
|
||||
/// 可以修改规则的各项配置,但规则必须已存在
|
||||
/// </summary>
|
||||
/// <param name="request">
|
||||
/// 更新规则的请求对象,必须包含:
|
||||
/// - CurrentName: 当前规则名称(用于定位规则)
|
||||
/// - 要修改的属性(只有非null的属性会被更新)
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 更新成功返回true,失败返回false
|
||||
/// 失败原因可能包括:规则不存在、权限不足、配置无效等
|
||||
/// </returns>
|
||||
bool UpdateRule(UpdateRuleRequest request);
|
||||
|
||||
/// <summary>
|
||||
/// 删除指定名称的防火墙规则
|
||||
/// 此操作不可逆,删除后规则无法恢复
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要删除的规则名称,必须完全匹配</param>
|
||||
/// <returns>
|
||||
/// 删除成功返回true,失败返回false
|
||||
/// 如果规则不存在,通常也返回true(幂等操作)
|
||||
/// </returns>
|
||||
bool DeleteRule(string ruleName);
|
||||
|
||||
/// <summary>
|
||||
/// 删除指定组的所有防火墙规则
|
||||
/// 批量删除操作,会删除组内的所有规则
|
||||
/// </summary>
|
||||
/// <param name="groupName">要删除的规则组名称</param>
|
||||
/// <returns>
|
||||
/// 所有规则都删除成功返回true
|
||||
/// 如果部分规则删除失败,返回false
|
||||
/// </returns>
|
||||
bool DeleteRulesByGroup(string groupName);
|
||||
|
||||
/// <summary>
|
||||
/// 启用指定名称的防火墙规则
|
||||
/// 启用后规则将开始生效
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要启用的规则名称</param>
|
||||
/// <returns>
|
||||
/// 启用成功返回true,失败返回false
|
||||
/// 如果规则已经启用,通常返回true
|
||||
/// </returns>
|
||||
bool EnableRule(string ruleName);
|
||||
|
||||
/// <summary>
|
||||
/// 禁用指定名称的防火墙规则
|
||||
/// 禁用后规则将不再生效,但仍保留在系统中
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要禁用的规则名称</param>
|
||||
/// <returns>
|
||||
/// 禁用成功返回true,失败返回false
|
||||
/// 如果规则已经禁用,通常返回true
|
||||
/// </returns>
|
||||
bool DisableRule(string ruleName);
|
||||
|
||||
/// <summary>
|
||||
/// 切换指定规则的启用状态
|
||||
/// 如果规则当前启用则禁用,如果禁用则启用
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要切换状态的规则名称</param>
|
||||
/// <returns>
|
||||
/// 切换成功返回true,失败返回false
|
||||
/// 如果规则不存在,返回false
|
||||
/// </returns>
|
||||
bool ToggleRule(string ruleName);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 批量操作
|
||||
|
||||
/// <summary>
|
||||
/// 批量创建多个防火墙规则
|
||||
/// 提供事务性的批量创建能力,提高操作效率
|
||||
/// </summary>
|
||||
/// <param name="requests">
|
||||
/// 创建规则请求列表,每个请求都应包含完整的规则配置
|
||||
/// 规则名称在列表中应该唯一
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 所有规则都创建成功返回true
|
||||
/// 如果任何一个规则创建失败,返回false
|
||||
/// 注意:部分实现可能采用"尽力而为"策略,即使部分失败也继续处理其他规则
|
||||
/// </returns>
|
||||
bool CreateRules(List<CreateRuleRequest> requests);
|
||||
|
||||
/// <summary>
|
||||
/// 批量删除多个防火墙规则
|
||||
/// 根据规则名称列表进行批量删除操作
|
||||
/// </summary>
|
||||
/// <param name="ruleNames">要删除的规则名称列表</param>
|
||||
/// <returns>
|
||||
/// 所有规则都删除成功返回true
|
||||
/// 如果任何一个规则删除失败,返回false
|
||||
/// 对于不存在的规则,通常视为删除成功
|
||||
/// </returns>
|
||||
bool DeleteRules(List<string> ruleNames);
|
||||
|
||||
/// <summary>
|
||||
/// 批量启用多个防火墙规则
|
||||
/// 根据规则名称列表进行批量启用操作
|
||||
/// </summary>
|
||||
/// <param name="ruleNames">要启用的规则名称列表</param>
|
||||
/// <returns>
|
||||
/// 所有规则都启用成功返回true
|
||||
/// 如果任何一个规则启用失败,返回false
|
||||
/// </returns>
|
||||
bool EnableRules(List<string> ruleNames);
|
||||
|
||||
/// <summary>
|
||||
/// 批量禁用多个防火墙规则
|
||||
/// 根据规则名称列表进行批量禁用操作
|
||||
/// </summary>
|
||||
/// <param name="ruleNames">要禁用的规则名称列表</param>
|
||||
/// <returns>
|
||||
/// 所有规则都禁用成功返回true
|
||||
/// 如果任何一个规则禁用失败,返回false
|
||||
/// </returns>
|
||||
bool DisableRules(List<string> ruleNames);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 高级功能
|
||||
|
||||
/// <summary>
|
||||
/// 将防火墙设置恢复为系统默认值
|
||||
/// 此操作会删除所有自定义规则和设置,恢复到Windows默认状态
|
||||
/// 操作不可逆,请谨慎使用
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 恢复成功返回true,失败返回false
|
||||
/// 此操作通常需要管理员权限
|
||||
/// </returns>
|
||||
bool RestoreDefaultSettings();
|
||||
|
||||
/// <summary>
|
||||
/// 将所有防火墙规则导出到指定文件
|
||||
/// 导出格式通常为JSON,包含规则的完整配置信息
|
||||
/// </summary>
|
||||
/// <param name="filePath">
|
||||
/// 导出文件的完整路径,建议使用.json扩展名
|
||||
/// 如果文件已存在将被覆盖
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 导出成功返回true,失败返回false
|
||||
/// 失败原因可能包括:路径无效、权限不足、磁盘空间不足等
|
||||
/// </returns>
|
||||
bool ExportRules(string filePath);
|
||||
|
||||
/// <summary>
|
||||
/// 从指定文件导入防火墙规则
|
||||
/// 导入的规则将添加到现有规则中,不会覆盖现有规则
|
||||
/// </summary>
|
||||
/// <param name="filePath">
|
||||
/// 包含规则配置的文件路径,通常为JSON格式
|
||||
/// 文件格式应与ExportRules导出的格式兼容
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 导入成功返回true,失败返回false
|
||||
/// 失败原因可能包括:文件不存在、格式错误、权限不足等
|
||||
/// </returns>
|
||||
bool ImportRules(string filePath);
|
||||
|
||||
/// <summary>
|
||||
/// 获取防火墙规则的详细统计信息
|
||||
/// 提供规则数量分析、分类统计、热门应用和端口等信息
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 包含详细统计信息的FirewallStatistics对象,包括:
|
||||
/// - 总规则数、启用/禁用规则数
|
||||
/// - 按方向、协议、配置文件、动作分类的统计
|
||||
/// - 规则最多的应用程序Top列表
|
||||
/// - 使用最多的端口Top列表
|
||||
/// </returns>
|
||||
FirewallStatistics GetStatistics();
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有有防火墙规则的应用程序列表
|
||||
/// 返回系统中已配置防火墙规则的应用程序路径
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 应用程序完整路径的去重排序列表
|
||||
/// 可用于了解哪些应用程序有网络访问配置
|
||||
/// </returns>
|
||||
List<string> GetApplicationsWithRules();
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前系统的活动网络连接列表
|
||||
/// 显示当前正在进行的网络连接信息
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 活动连接的描述列表,格式可能包含:
|
||||
/// - 协议类型
|
||||
/// - 本地地址和端口
|
||||
/// - 远程地址和端口
|
||||
/// - 连接状态
|
||||
/// - 关联的进程信息
|
||||
/// </returns>
|
||||
List<string> GetActiveConnections();
|
||||
|
||||
/// <summary>
|
||||
/// 阻止指定应用程序的所有网络访问
|
||||
/// 自动创建入站和出站阻止规则,完全阻止应用程序的网络通信
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">
|
||||
/// 要阻止的应用程序完整路径
|
||||
/// 例如:"C:\Program Files\MyApp\MyApp.exe"
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 阻止成功返回true,失败返回false
|
||||
/// 成功时会创建两个规则:入站阻止和出站阻止
|
||||
/// </returns>
|
||||
bool BlockApplication(string applicationPath);
|
||||
|
||||
/// <summary>
|
||||
/// 解除对指定应用程序的网络访问阻止
|
||||
/// 删除该应用程序的所有阻止规则,恢复其网络访问能力
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">
|
||||
/// 要解除阻止的应用程序完整路径
|
||||
/// 路径必须与BlockApplication时使用的路径完全一致
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 解除阻止成功返回true,失败返回false
|
||||
/// 将删除该应用程序的所有阻止类型规则
|
||||
/// </returns>
|
||||
bool UnblockApplication(string applicationPath);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 配置文件管理
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的默认入站动作
|
||||
/// 当没有匹配的规则时,系统将使用此默认动作处理入站流量
|
||||
/// </summary>
|
||||
/// <param name="profile">
|
||||
/// 目标配置文件:
|
||||
/// - FirewallProfile.Domain(域网络)
|
||||
/// - FirewallProfile.Private(私有网络)
|
||||
/// - FirewallProfile.Public(公共网络)
|
||||
/// </param>
|
||||
/// <param name="action">
|
||||
/// 默认动作:
|
||||
/// - RuleAction.Allow(允许)- 安全性较低但兼容性好
|
||||
/// - RuleAction.Block(阻止)- 安全性高但可能影响某些功能
|
||||
/// </param>
|
||||
/// <returns>设置成功返回true,失败返回false</returns>
|
||||
bool SetDefaultInboundAction(FirewallProfile profile, RuleAction action);
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的默认出站动作
|
||||
/// 当没有匹配的规则时,系统将使用此默认动作处理出站流量
|
||||
/// </summary>
|
||||
/// <param name="profile">
|
||||
/// 目标配置文件:
|
||||
/// - FirewallProfile.Domain(域网络)
|
||||
/// - FirewallProfile.Private(私有网络)
|
||||
/// - FirewallProfile.Public(公共网络)
|
||||
/// </param>
|
||||
/// <param name="action">
|
||||
/// 默认动作:
|
||||
/// - RuleAction.Allow(允许)- 通常为默认设置
|
||||
/// - RuleAction.Block(阻止)- 高安全环境下使用
|
||||
/// </param>
|
||||
/// <returns>设置成功返回true,失败返回false</returns>
|
||||
bool SetDefaultOutboundAction(FirewallProfile profile, RuleAction action);
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的通知开关
|
||||
/// 控制当防火墙阻止程序时是否显示通知
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="enable">
|
||||
/// 是否启用通知:
|
||||
/// - true: 显示通知,用户体验好但可能干扰
|
||||
/// - false: 不显示通知,静默处理
|
||||
/// </param>
|
||||
/// <returns>设置成功返回true,失败返回false</returns>
|
||||
bool SetNotifications(FirewallProfile profile, bool enable);
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的单播响应设置
|
||||
/// 控制是否允许对多播和广播流量进行单播响应
|
||||
/// 这个设置影响某些网络发现和文件共享功能
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="enable">
|
||||
/// 是否允许单播响应:
|
||||
/// - true: 允许,提高网络兼容性
|
||||
/// - false: 禁用,提高安全性
|
||||
/// </param>
|
||||
/// <returns>设置成功返回true,失败返回false</returns>
|
||||
bool SetUnicastResponses(FirewallProfile profile, bool enable);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 日志和监控
|
||||
|
||||
/// <summary>
|
||||
/// 获取防火墙日志记录
|
||||
/// 从Windows防火墙日志文件中读取日志条目,用于安全分析和故障排除
|
||||
/// </summary>
|
||||
/// <param name="startTime">
|
||||
/// 开始时间(可选),如果指定,只返回此时间之后的日志
|
||||
/// 如果为null,返回所有可用日志
|
||||
/// </param>
|
||||
/// <param name="endTime">
|
||||
/// 结束时间(可选),如果指定,只返回此时间之前的日志
|
||||
/// 如果为null,返回到当前时间的所有日志
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 日志条目字符串列表,每个条目包含:
|
||||
/// - 时间戳
|
||||
/// - 动作(允许/阻止/丢弃)
|
||||
/// - 协议
|
||||
/// - 源和目标IP地址
|
||||
/// - 端口信息
|
||||
/// - 规则名称等信息
|
||||
/// </returns>
|
||||
List<string> GetFirewallLogs(DateTime? startTime = null, DateTime? endTime = null);
|
||||
|
||||
/// <summary>
|
||||
/// 启用指定配置文件的防火墙日志记录
|
||||
/// 配置防火墙记录被阻止或允许的连接到指定日志文件
|
||||
/// </summary>
|
||||
/// <param name="profile">要启用日志的配置文件</param>
|
||||
/// <param name="logFilePath">
|
||||
/// 日志文件的完整路径,例如:
|
||||
/// "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
|
||||
/// 路径目录必须存在且有写入权限
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// 启用成功返回true,失败返回false
|
||||
/// 失败原因可能包括:路径无效、权限不足等
|
||||
/// </returns>
|
||||
bool EnableLogging(FirewallProfile profile, string logFilePath);
|
||||
|
||||
/// <summary>
|
||||
/// 禁用指定配置文件的防火墙日志记录
|
||||
/// 停止记录防火墙活动到日志文件,可以节省磁盘空间和系统性能
|
||||
/// </summary>
|
||||
/// <param name="profile">要禁用日志的配置文件</param>
|
||||
/// <returns>
|
||||
/// 禁用成功返回true,失败返回false
|
||||
/// 已经禁用的日志记录通常返回true
|
||||
/// </returns>
|
||||
bool DisableLogging(FirewallProfile profile);
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
namespace Utils.Firewall;
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙服务接口(用于依赖注入)
|
||||
/// </summary>
|
||||
|
||||
/// <summary>
|
||||
/// 防火墙服务接口,用于依赖注入和测试
|
||||
/// 提供统一的防火墙管理功能,包括规则管理、状态控制和统计信息获取
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 这个接口抽象了底层防火墙API的实现细节,使得可以:
|
||||
/// 1. 在不同的防火墙实现之间切换(Windows Defender、第三方防火墙等)
|
||||
/// 2. 方便进行单元测试(通过Mock接口)
|
||||
/// 3. 支持依赖注入,提高代码的可测试性和可维护性
|
||||
/// </remarks>
|
||||
public interface IFirewallService
|
||||
{
|
||||
/// <summary>
|
||||
/// 异步获取防火墙状态信息
|
||||
/// </summary>
|
||||
/// <returns>包含防火墙各配置文件启用状态的 <see cref="FirewallStatus"/> 对象</returns>
|
||||
/// <remarks>
|
||||
/// 返回的状态包括:
|
||||
/// - Domain Profile(域配置文件)状态
|
||||
/// - Private Profile(专用配置文件)状态
|
||||
/// - Public Profile(公用配置文件)状态
|
||||
/// </remarks>
|
||||
Task<FirewallStatus> GetStatusAsync();
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取防火墙规则列表
|
||||
/// </summary>
|
||||
/// <param name="filter">可选的规则过滤器,用于筛选特定条件的规则。如果为null,则返回所有规则</param>
|
||||
/// <returns>符合筛选条件的防火墙规则列表</returns>
|
||||
/// <remarks>
|
||||
/// 过滤器可以根据以下条件筛选规则:
|
||||
/// - 规则名称(支持模糊匹配)
|
||||
/// - 协议类型(TCP、UDP、ICMP等)
|
||||
/// - 方向(入站/出站)
|
||||
/// - 动作(允许/阻止)
|
||||
/// - 启用状态
|
||||
/// </remarks>
|
||||
Task<List<FirewallRule>> GetRulesAsync(RuleFilter? filter = null);
|
||||
|
||||
/// <summary>
|
||||
/// 异步根据规则名称获取特定的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要查找的规则名称,大小写敏感</param>
|
||||
/// <returns>匹配的防火墙规则,如果未找到则返回null</returns>
|
||||
/// <exception cref="ArgumentNullException">当ruleName为null或空字符串时抛出</exception>
|
||||
Task<FirewallRule?> GetRuleAsync(string ruleName);
|
||||
|
||||
/// <summary>
|
||||
/// 异步创建新的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="request">包含新规则详细信息的创建请求</param>
|
||||
/// <returns>如果规则创建成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// 创建规则时需要注意:
|
||||
/// 1. 规则名称必须唯一,不能与现有规则重复
|
||||
/// 2. 端口范围格式:单个端口"80",多个端口"80,443",范围"1024-65535"
|
||||
/// 3. IP地址格式:单个IP"192.168.1.1",网段"192.168.1.0/24",多个IP用逗号分隔
|
||||
/// </remarks>
|
||||
/// <exception cref="ArgumentNullException">当request为null时抛出</exception>
|
||||
/// <exception cref="InvalidOperationException">当规则名称已存在时抛出</exception>
|
||||
Task<bool> CreateRuleAsync(CreateRuleRequest request);
|
||||
|
||||
/// <summary>
|
||||
/// 异步更新现有的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="request">包含更新信息的请求,必须指定要更新的规则名称</param>
|
||||
/// <returns>如果规则更新成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// 更新操作会完全替换现有规则的配置
|
||||
/// 如果只需要启用/禁用规则,建议使用专门的启用/禁用方法
|
||||
/// </remarks>
|
||||
/// <exception cref="ArgumentNullException">当request为null时抛出</exception>
|
||||
/// <exception cref="InvalidOperationException">当指定的规则不存在时抛出</exception>
|
||||
Task<bool> UpdateRuleAsync(UpdateRuleRequest request);
|
||||
|
||||
/// <summary>
|
||||
/// 异步删除指定的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要删除的规则名称</param>
|
||||
/// <returns>如果规则删除成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// 注意:删除操作是不可逆的,建议在删除前先备份重要规则
|
||||
/// 系统内置的默认规则通常不能被删除
|
||||
/// </remarks>
|
||||
/// <exception cref="ArgumentNullException">当ruleName为null或空字符串时抛出</exception>
|
||||
Task<bool> DeleteRuleAsync(string ruleName);
|
||||
|
||||
/// <summary>
|
||||
/// 异步启用指定配置文件的防火墙
|
||||
/// </summary>
|
||||
/// <param name="profile">要启用的防火墙配置文件,默认为所有配置文件</param>
|
||||
/// <returns>如果启用成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// Windows防火墙包含三个配置文件:
|
||||
/// - Domain: 当计算机连接到域时使用
|
||||
/// - Private: 当计算机连接到私有网络时使用
|
||||
/// - Public: 当计算机连接到公共网络时使用
|
||||
/// </remarks>
|
||||
Task<bool> EnableFirewallAsync(FirewallProfile profile = FirewallProfile.All);
|
||||
|
||||
/// <summary>
|
||||
/// 异步禁用指定配置文件的防火墙
|
||||
/// </summary>
|
||||
/// <param name="profile">要禁用的防火墙配置文件,默认为所有配置文件</param>
|
||||
/// <returns>如果禁用成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// 警告:禁用防火墙会降低系统安全性,请谨慎操作
|
||||
/// 建议只在必要的测试或故障排除场景中临时禁用
|
||||
/// </remarks>
|
||||
Task<bool> DisableFirewallAsync(FirewallProfile profile = FirewallProfile.All);
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取防火墙统计信息
|
||||
/// </summary>
|
||||
/// <returns>包含防火墙运行统计数据的 <see cref="FirewallStatistics"/> 对象</returns>
|
||||
/// <remarks>
|
||||
/// 统计信息包括:
|
||||
/// - 阻止的连接数量
|
||||
/// - 允许的连接数量
|
||||
/// - 活跃规则数量
|
||||
/// - 最近活动的时间戳
|
||||
/// </remarks>
|
||||
Task<FirewallStatistics> GetStatisticsAsync();
|
||||
|
||||
/// <summary>
|
||||
/// 异步阻止指定应用程序的网络访问
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序的完整文件路径</param>
|
||||
/// <returns>如果阻止操作成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// 此方法会创建一个阻止规则来禁止指定应用程序的所有网络连接
|
||||
/// 路径必须是可执行文件(.exe)的完整路径
|
||||
/// </remarks>
|
||||
/// <exception cref="ArgumentNullException">当applicationPath为null或空字符串时抛出</exception>
|
||||
/// <exception cref="FileNotFoundException">当指定的应用程序文件不存在时抛出</exception>
|
||||
Task<bool> BlockApplicationAsync(string applicationPath);
|
||||
|
||||
/// <summary>
|
||||
/// 异步解除对指定应用程序的网络访问阻止
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序的完整文件路径</param>
|
||||
/// <returns>如果解除阻止操作成功返回true,否则返回false</returns>
|
||||
/// <remarks>
|
||||
/// 此方法会删除之前为该应用程序创建的阻止规则
|
||||
/// 如果应用程序没有被阻止,操作仍会返回true
|
||||
/// </remarks>
|
||||
/// <exception cref="ArgumentNullException">当applicationPath为null或空字符串时抛出</exception>
|
||||
Task<bool> UnblockApplicationAsync(string applicationPath);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FirewallManager" Version="1.0.2" />
|
||||
<PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,1140 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using NetFwTypeLib;
|
||||
|
||||
namespace Utils.Firewall;
|
||||
|
||||
/// <summary>
|
||||
/// Windows防火墙管理API实现
|
||||
/// 提供对Windows防火墙的完整控制,包括状态管理、规则操作、配置文件管理等功能
|
||||
/// 使用Windows COM接口NetFwTypeLib与系统防火墙进行交互
|
||||
/// </summary>
|
||||
public class WindowsFirewallApi : IFirewallApi
|
||||
{
|
||||
/// <summary>
|
||||
/// Windows防火墙策略对象,用于访问防火墙的全局设置和状态
|
||||
/// </summary>
|
||||
private readonly INetFwPolicy2? _fwPolicy;
|
||||
|
||||
/// <summary>
|
||||
/// Windows防火墙规则集合对象,用于管理防火墙规则
|
||||
/// </summary>
|
||||
private readonly INetFwRules? _fwRules;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化WindowsFirewallApi实例
|
||||
/// 通过COM接口连接到Windows防火墙服务
|
||||
/// </summary>
|
||||
public WindowsFirewallApi()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 通过ProgID获取Windows防火墙策略对象的类型
|
||||
Type? netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
|
||||
if (netFwPolicy2Type != null)
|
||||
{
|
||||
// 创建防火墙策略对象实例
|
||||
_fwPolicy = (INetFwPolicy2?)Activator.CreateInstance(netFwPolicy2Type);
|
||||
// 获取防火墙规则集合
|
||||
_fwRules = _fwPolicy?.Rules;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// 初始化失败,通常是因为缺少管理员权限
|
||||
// 在这种情况下,_fwPolicy和_fwRules将保持为null
|
||||
}
|
||||
}
|
||||
|
||||
#region 防火墙状态管理
|
||||
|
||||
/// <summary>
|
||||
/// 获取防火墙的完整状态信息
|
||||
/// 包括各配置文件的状态、规则统计等
|
||||
/// </summary>
|
||||
/// <returns>包含防火墙完整状态的FirewallStatus对象</returns>
|
||||
public FirewallStatus GetFirewallStatus()
|
||||
{
|
||||
// 创建状态对象并获取基本启用状态
|
||||
var status = new FirewallStatus
|
||||
{
|
||||
IsEnabled = IsFirewallEnabled(),
|
||||
ProfileStatuses = new Dictionary<FirewallProfile, ProfileStatus>()
|
||||
};
|
||||
|
||||
// 遍历所有防火墙配置文件(域、私有、公共)获取详细状态
|
||||
foreach (FirewallProfile profile in Enum.GetValues(typeof(FirewallProfile)))
|
||||
{
|
||||
if (profile != FirewallProfile.All)
|
||||
{
|
||||
status.ProfileStatuses[profile] = GetProfileStatus(profile);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取规则统计信息
|
||||
var allRules = GetAllRules();
|
||||
status.TotalRules = allRules.Count; // 总规则数
|
||||
status.EnabledRules = allRules.Count(r => r.Enabled); // 已启用规则数
|
||||
status.InboundRules = allRules.Count(r => r.Direction == RuleDirection.Inbound); // 入站规则数
|
||||
status.OutboundRules = allRules.Count(r => r.Direction == RuleDirection.Outbound); // 出站规则数
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查防火墙是否在任何配置文件中启用
|
||||
/// </summary>
|
||||
/// <returns>如果防火墙在至少一个配置文件中启用则返回true</returns>
|
||||
private bool IsFirewallEnabled()
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
// 检查三个配置文件:域、私有网络、公共网络
|
||||
return _fwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN] ||
|
||||
_fwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE] ||
|
||||
_fwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启用指定配置文件的防火墙
|
||||
/// </summary>
|
||||
/// <param name="profile">要启用的防火墙配置文件,默认为所有配置文件</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool EnableFirewall(FirewallProfile profile = FirewallProfile.All)
|
||||
{
|
||||
try
|
||||
{
|
||||
SetFirewallEnabled(profile, true);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 禁用指定配置文件的防火墙
|
||||
/// </summary>
|
||||
/// <param name="profile">要禁用的防火墙配置文件,默认为所有配置文件</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool DisableFirewall(FirewallProfile profile = FirewallProfile.All)
|
||||
{
|
||||
try
|
||||
{
|
||||
SetFirewallEnabled(profile, false);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件防火墙的启用状态
|
||||
/// 内部方法,用于统一处理启用/禁用逻辑
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="enabled">是否启用</param>
|
||||
private void SetFirewallEnabled(FirewallProfile profile, bool enabled)
|
||||
{
|
||||
if (_fwPolicy == null) return;
|
||||
|
||||
// 根据配置文件标志设置相应的防火墙状态
|
||||
if (profile.HasFlag(FirewallProfile.Domain))
|
||||
_fwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN] = enabled;
|
||||
if (profile.HasFlag(FirewallProfile.Private))
|
||||
_fwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE] = enabled;
|
||||
if (profile.HasFlag(FirewallProfile.Public))
|
||||
_fwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC] = enabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定配置文件的详细状态信息
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <returns>包含配置文件详细状态的ProfileStatus对象</returns>
|
||||
public ProfileStatus GetProfileStatus(FirewallProfile profile)
|
||||
{
|
||||
if (_fwPolicy == null)
|
||||
return new ProfileStatus { Profile = profile };
|
||||
|
||||
var profileType = ConvertToNetFwProfile(profile);
|
||||
return new ProfileStatus
|
||||
{
|
||||
Profile = profile,
|
||||
IsEnabled = _fwPolicy.FirewallEnabled[profileType], // 是否启用
|
||||
BlockAllInboundTraffic = _fwPolicy.BlockAllInboundTraffic[profileType], // 是否阻止所有入站流量
|
||||
NotifyOnListen = _fwPolicy.NotificationsDisabled[profileType] == false, // 是否显示通知
|
||||
UnicastResponsesDisabled = _fwPolicy.UnicastResponsesToMulticastBroadcastDisabled[profileType], // 单播响应设置
|
||||
DefaultInboundAction = (RuleAction)_fwPolicy.DefaultInboundAction[profileType], // 默认入站动作
|
||||
DefaultOutboundAction = (RuleAction)_fwPolicy.DefaultOutboundAction[profileType] // 默认出站动作
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的状态
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="status">要设置的状态信息</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool SetProfileStatus(FirewallProfile profile, ProfileStatus status)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
var profileType = ConvertToNetFwProfile(profile);
|
||||
|
||||
// 设置各项配置
|
||||
_fwPolicy.FirewallEnabled[profileType] = status.IsEnabled;
|
||||
_fwPolicy.BlockAllInboundTraffic[profileType] = status.BlockAllInboundTraffic;
|
||||
_fwPolicy.NotificationsDisabled[profileType] = !status.NotifyOnListen;
|
||||
_fwPolicy.UnicastResponsesToMulticastBroadcastDisabled[profileType] = status.UnicastResponsesDisabled;
|
||||
_fwPolicy.DefaultInboundAction[profileType] = (NET_FW_ACTION_)status.DefaultInboundAction;
|
||||
_fwPolicy.DefaultOutboundAction[profileType] = (NET_FW_ACTION_)status.DefaultOutboundAction;
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 规则查询
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有防火墙规则
|
||||
/// </summary>
|
||||
/// <returns>防火墙规则列表</returns>
|
||||
public List<FirewallRule> GetAllRules()
|
||||
{
|
||||
var rules = new List<FirewallRule>();
|
||||
if (_fwRules == null) return rules;
|
||||
|
||||
// 遍历Windows防火墙中的所有规则并转换为自定义格式
|
||||
foreach (INetFwRule rule in _fwRules)
|
||||
{
|
||||
rules.Add(ConvertToFirewallRule(rule));
|
||||
}
|
||||
|
||||
return rules;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据过滤条件获取防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="filter">过滤条件对象</param>
|
||||
/// <returns>符合条件的防火墙规则列表</returns>
|
||||
public List<FirewallRule> GetRulesByFilter(RuleFilter filter)
|
||||
{
|
||||
var allRules = GetAllRules();
|
||||
var query = allRules.AsQueryable();
|
||||
|
||||
// 按规则名称模式过滤
|
||||
if (!string.IsNullOrEmpty(filter.NamePattern))
|
||||
query = query.Where(r => r.Name.Contains(filter.NamePattern, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
// 按流量方向过滤(入站/出站)
|
||||
if (filter.Direction.HasValue)
|
||||
query = query.Where(r => r.Direction == filter.Direction.Value);
|
||||
|
||||
// 按启用状态过滤
|
||||
if (filter.Enabled.HasValue)
|
||||
query = query.Where(r => r.Enabled == filter.Enabled.Value);
|
||||
|
||||
// 按配置文件过滤
|
||||
if (filter.Profile.HasValue)
|
||||
query = query.Where(r => r.Profiles.HasFlag(filter.Profile.Value));
|
||||
|
||||
// 按协议类型过滤
|
||||
if (filter.Protocol.HasValue)
|
||||
query = query.Where(r => r.Protocol == filter.Protocol.Value);
|
||||
|
||||
// 按动作过滤(允许/阻止)
|
||||
if (filter.Action.HasValue)
|
||||
query = query.Where(r => r.Action == filter.Action.Value);
|
||||
|
||||
// 按应用程序名称过滤
|
||||
if (!string.IsNullOrEmpty(filter.ApplicationName))
|
||||
query = query.Where(r =>
|
||||
!string.IsNullOrEmpty(r.ApplicationName) &&
|
||||
r.ApplicationName.Contains(filter.ApplicationName, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
// 按规则组过滤
|
||||
if (!string.IsNullOrEmpty(filter.Grouping))
|
||||
query = query.Where(r => r.Grouping == filter.Grouping);
|
||||
|
||||
// 按端口过滤(本地端口或远程端口)
|
||||
if (!string.IsNullOrEmpty(filter.Port))
|
||||
query = query.Where(r =>
|
||||
(!string.IsNullOrEmpty(r.LocalPorts) && r.LocalPorts.Contains(filter.Port)) ||
|
||||
(!string.IsNullOrEmpty(r.RemotePorts) && r.RemotePorts.Contains(filter.Port)));
|
||||
|
||||
return query.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据规则名称获取特定的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">规则名称</param>
|
||||
/// <returns>找到的规则对象,如果不存在则返回null</returns>
|
||||
public FirewallRule? GetRuleByName(string ruleName)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwRules == null) return null;
|
||||
|
||||
// 使用Windows防火墙API直接通过名称获取规则
|
||||
INetFwRule rule = _fwRules.Item(ruleName);
|
||||
return ConvertToFirewallRule(rule);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 规则不存在或访问出错
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定应用程序的所有防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序完整路径</param>
|
||||
/// <returns>该应用程序的所有相关规则</returns>
|
||||
public List<FirewallRule> GetRulesByApplication(string applicationPath)
|
||||
{
|
||||
return GetRulesByFilter(new RuleFilter { ApplicationName = applicationPath });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定端口和协议的所有防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="port">端口号</param>
|
||||
/// <param name="protocol">协议类型,默认为任意协议</param>
|
||||
/// <returns>该端口的所有相关规则</returns>
|
||||
public List<FirewallRule> GetRulesByPort(int port, ProtocolType protocol = ProtocolType.Any)
|
||||
{
|
||||
var filter = new RuleFilter { Port = port.ToString() };
|
||||
if (protocol != ProtocolType.Any)
|
||||
filter.Protocol = protocol;
|
||||
return GetRulesByFilter(filter);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定组的所有防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="groupName">规则组名称</param>
|
||||
/// <returns>该组的所有规则</returns>
|
||||
public List<FirewallRule> GetRulesByGroup(string groupName)
|
||||
{
|
||||
return GetRulesByFilter(new RuleFilter { Grouping = groupName });
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 规则管理
|
||||
|
||||
/// <summary>
|
||||
/// 创建新的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="request">创建规则的请求对象,包含规则的所有配置信息</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool CreateRule(CreateRuleRequest request)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwRules == null) return false;
|
||||
|
||||
// 通过ProgID获取防火墙规则对象类型
|
||||
Type? netFwRuleType = Type.GetTypeFromProgID("HNetCfg.FWRule");
|
||||
if (netFwRuleType == null) return false;
|
||||
|
||||
// 创建新的防火墙规则实例
|
||||
INetFwRule? newRule = (INetFwRule?)Activator.CreateInstance(netFwRuleType);
|
||||
if (newRule == null) return false;
|
||||
|
||||
// 设置规则的各项属性
|
||||
newRule.Name = request.Name; // 规则名称
|
||||
newRule.Description = request.Description; // 规则描述
|
||||
newRule.ApplicationName = request.ApplicationName; // 应用程序路径
|
||||
// 注意:INetFwRule 接口可能没有 ServiceName 属性,这里移除了对它的直接赋值
|
||||
newRule.Protocol = (int)request.Protocol; // 协议类型
|
||||
newRule.LocalPorts = request.LocalPorts; // 本地端口
|
||||
newRule.RemotePorts = request.RemotePorts; // 远程端口
|
||||
newRule.LocalAddresses = request.LocalAddresses; // 本地地址
|
||||
newRule.RemoteAddresses = request.RemoteAddresses; // 远程地址
|
||||
newRule.IcmpTypesAndCodes = request.IcmpTypesAndCodes; // ICMP类型和代码
|
||||
newRule.Direction = (NET_FW_RULE_DIRECTION_)request.Direction; // 流量方向
|
||||
newRule.Enabled = request.Enabled; // 是否启用
|
||||
newRule.Profiles = ConvertToNetFwProfiles(request.Profiles); // 适用的配置文件
|
||||
newRule.Action = (NET_FW_ACTION_)request.Action; // 规则动作
|
||||
newRule.Grouping = request.Grouping; // 规则组
|
||||
newRule.InterfaceTypes = request.InterfaceTypes; // 接口类型
|
||||
|
||||
// 设置边缘遍历(用于某些特殊网络场景)
|
||||
if (request.EdgeTraversal)
|
||||
newRule.EdgeTraversal = request.EdgeTraversal;
|
||||
|
||||
// 将新规则添加到防火墙
|
||||
_fwRules.Add(newRule);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新现有的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="request">更新规则的请求对象</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool UpdateRule(UpdateRuleRequest request)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwRules == null) return false;
|
||||
|
||||
// 根据当前名称获取规则
|
||||
INetFwRule rule = _fwRules.Item(request.CurrentName);
|
||||
|
||||
// 根据请求对象中的非空值更新规则属性
|
||||
if (!string.IsNullOrEmpty(request.NewName))
|
||||
rule.Name = request.NewName;
|
||||
if (request.Description != null)
|
||||
rule.Description = request.Description;
|
||||
if (request.Enabled.HasValue)
|
||||
rule.Enabled = request.Enabled.Value;
|
||||
if (!string.IsNullOrEmpty(request.ApplicationName))
|
||||
rule.ApplicationName = request.ApplicationName;
|
||||
// 移除了对 ServiceName 的直接赋值
|
||||
if (request.Protocol.HasValue)
|
||||
rule.Protocol = (int)request.Protocol.Value;
|
||||
if (request.LocalPorts != null)
|
||||
rule.LocalPorts = request.LocalPorts;
|
||||
if (request.RemotePorts != null)
|
||||
rule.RemotePorts = request.RemotePorts;
|
||||
if (request.LocalAddresses != null)
|
||||
rule.LocalAddresses = request.LocalAddresses;
|
||||
if (request.RemoteAddresses != null)
|
||||
rule.RemoteAddresses = request.RemoteAddresses;
|
||||
if (request.Profiles.HasValue)
|
||||
rule.Profiles = ConvertToNetFwProfiles(request.Profiles.Value);
|
||||
if (request.Action.HasValue)
|
||||
rule.Action = (NET_FW_ACTION_)request.Action.Value;
|
||||
if (request.Grouping != null)
|
||||
rule.Grouping = request.Grouping;
|
||||
if (request.EdgeTraversal.HasValue)
|
||||
rule.EdgeTraversal = request.EdgeTraversal.Value;
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除指定名称的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">要删除的规则名称</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool DeleteRule(string ruleName)
|
||||
{
|
||||
try
|
||||
{
|
||||
_fwRules?.Remove(ruleName);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除指定组的所有防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="groupName">规则组名称</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool DeleteRulesByGroup(string groupName)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 先获取组中的所有规则
|
||||
var rules = GetRulesByGroup(groupName);
|
||||
|
||||
// 逐一删除组中的每个规则
|
||||
foreach (var rule in rules)
|
||||
{
|
||||
_fwRules?.Remove(rule.Name);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启用指定名称的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">规则名称</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool EnableRule(string ruleName)
|
||||
{
|
||||
return UpdateRule(new UpdateRuleRequest { CurrentName = ruleName, Enabled = true });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 禁用指定名称的防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleName">规则名称</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool DisableRule(string ruleName)
|
||||
{
|
||||
return UpdateRule(new UpdateRuleRequest { CurrentName = ruleName, Enabled = false });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 切换指定规则的启用状态(启用变禁用,禁用变启用)
|
||||
/// </summary>
|
||||
/// <param name="ruleName">规则名称</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool ToggleRule(string ruleName)
|
||||
{
|
||||
var rule = GetRuleByName(ruleName);
|
||||
if (rule == null) return false;
|
||||
return UpdateRule(new UpdateRuleRequest { CurrentName = ruleName, Enabled = !rule.Enabled });
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 批量操作
|
||||
|
||||
/// <summary>
|
||||
/// 批量创建多个防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="requests">创建规则请求列表</param>
|
||||
/// <returns>所有规则都创建成功返回true,否则返回false</returns>
|
||||
public bool CreateRules(List<CreateRuleRequest> requests)
|
||||
{
|
||||
bool allSuccess = true;
|
||||
foreach (var request in requests)
|
||||
{
|
||||
if (!CreateRule(request))
|
||||
allSuccess = false;
|
||||
}
|
||||
|
||||
return allSuccess;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量删除多个防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleNames">要删除的规则名称列表</param>
|
||||
/// <returns>所有规则都删除成功返回true,否则返回false</returns>
|
||||
public bool DeleteRules(List<string> ruleNames)
|
||||
{
|
||||
bool allSuccess = true;
|
||||
foreach (var ruleName in ruleNames)
|
||||
{
|
||||
if (!DeleteRule(ruleName))
|
||||
allSuccess = false;
|
||||
}
|
||||
|
||||
return allSuccess;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量启用多个防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleNames">要启用的规则名称列表</param>
|
||||
/// <returns>所有规则都启用成功返回true,否则返回false</returns>
|
||||
public bool EnableRules(List<string> ruleNames)
|
||||
{
|
||||
bool allSuccess = true;
|
||||
foreach (var ruleName in ruleNames)
|
||||
{
|
||||
if (!EnableRule(ruleName))
|
||||
allSuccess = false;
|
||||
}
|
||||
|
||||
return allSuccess;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量禁用多个防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="ruleNames">要禁用的规则名称列表</param>
|
||||
/// <returns>所有规则都禁用成功返回true,否则返回false</returns>
|
||||
public bool DisableRules(List<string> ruleNames)
|
||||
{
|
||||
bool allSuccess = true;
|
||||
foreach (var ruleName in ruleNames)
|
||||
{
|
||||
if (!DisableRule(ruleName))
|
||||
allSuccess = false;
|
||||
}
|
||||
|
||||
return allSuccess;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 高级功能
|
||||
|
||||
/// <summary>
|
||||
/// 将防火墙设置恢复为默认值
|
||||
/// 这将清除所有自定义规则和设置
|
||||
/// </summary>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool RestoreDefaultSettings()
|
||||
{
|
||||
try
|
||||
{
|
||||
_fwPolicy?.RestoreLocalFirewallDefaults();
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将所有防火墙规则导出到JSON文件
|
||||
/// </summary>
|
||||
/// <param name="filePath">导出文件的完整路径</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool ExportRules(string filePath)
|
||||
{
|
||||
try
|
||||
{
|
||||
var rules = GetAllRules();
|
||||
|
||||
// 配置JSON序列化选项,包括缩进和枚举转换
|
||||
var json = JsonSerializer.Serialize(rules, new JsonSerializerOptions
|
||||
{
|
||||
WriteIndented = true,
|
||||
Converters = { new JsonStringEnumConverter() }
|
||||
});
|
||||
|
||||
System.IO.File.WriteAllText(filePath, json);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从JSON文件导入防火墙规则
|
||||
/// </summary>
|
||||
/// <param name="filePath">包含规则的JSON文件路径</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool ImportRules(string filePath)
|
||||
{
|
||||
try
|
||||
{
|
||||
var json = System.IO.File.ReadAllText(filePath);
|
||||
|
||||
// 反序列化JSON文件中的规则
|
||||
var rules = JsonSerializer.Deserialize<List<FirewallRule>>(json, new JsonSerializerOptions
|
||||
{
|
||||
Converters = { new JsonStringEnumConverter() }
|
||||
});
|
||||
|
||||
if (rules == null) return false;
|
||||
|
||||
// 为每个导入的规则创建对应的防火墙规则
|
||||
foreach (var rule in rules)
|
||||
{
|
||||
CreateRule(new CreateRuleRequest
|
||||
{
|
||||
Name = rule.Name,
|
||||
Description = rule.Description,
|
||||
ApplicationName = rule.ApplicationName,
|
||||
ServiceName = rule.ServiceName,
|
||||
Protocol = rule.Protocol,
|
||||
LocalPorts = rule.LocalPorts,
|
||||
RemotePorts = rule.RemotePorts,
|
||||
LocalAddresses = rule.LocalAddresses,
|
||||
RemoteAddresses = rule.RemoteAddresses,
|
||||
IcmpTypesAndCodes = rule.IcmpTypesAndCodes,
|
||||
Direction = rule.Direction,
|
||||
Enabled = rule.Enabled,
|
||||
Profiles = rule.Profiles,
|
||||
Action = rule.Action,
|
||||
Grouping = rule.Grouping,
|
||||
InterfaceTypes = rule.InterfaceTypes,
|
||||
Interfaces = rule.Interfaces,
|
||||
EdgeTraversal = rule.EdgeTraversal
|
||||
});
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取防火墙规则的详细统计信息
|
||||
/// 包括规则数量、分类统计、热门应用和端口等
|
||||
/// </summary>
|
||||
/// <returns>包含统计信息的FirewallStatistics对象</returns>
|
||||
public FirewallStatistics GetStatistics()
|
||||
{
|
||||
var rules = GetAllRules();
|
||||
var stats = new FirewallStatistics
|
||||
{
|
||||
TotalRules = rules.Count, // 总规则数
|
||||
EnabledRules = rules.Count(r => r.Enabled), // 已启用规则数
|
||||
DisabledRules = rules.Count(r => !r.Enabled) // 已禁用规则数
|
||||
};
|
||||
|
||||
// 按流量方向统计规则数量
|
||||
stats.RulesByDirection[RuleDirection.Inbound] = rules.Count(r => r.Direction == RuleDirection.Inbound);
|
||||
stats.RulesByDirection[RuleDirection.Outbound] = rules.Count(r => r.Direction == RuleDirection.Outbound);
|
||||
|
||||
// 按协议类型分组统计
|
||||
var protocolGroups = rules.GroupBy(r => r.Protocol);
|
||||
foreach (var group in protocolGroups)
|
||||
{
|
||||
stats.RulesByProtocol[group.Key] = group.Count();
|
||||
}
|
||||
|
||||
// 按配置文件统计规则数量
|
||||
foreach (FirewallProfile profile in Enum.GetValues(typeof(FirewallProfile)))
|
||||
{
|
||||
if (profile != FirewallProfile.All)
|
||||
{
|
||||
stats.RulesByProfile[profile] = rules.Count(r => r.Profiles.HasFlag(profile));
|
||||
}
|
||||
}
|
||||
|
||||
// 按动作统计规则数量
|
||||
stats.RulesByAction[RuleAction.Allow] = rules.Count(r => r.Action == RuleAction.Allow);
|
||||
stats.RulesByAction[RuleAction.Block] = rules.Count(r => r.Action == RuleAction.Block);
|
||||
|
||||
// 统计规则最多的应用程序(Top 10)
|
||||
stats.TopApplications = rules
|
||||
.Where(r => !string.IsNullOrEmpty(r.ApplicationName))
|
||||
.GroupBy(r => r.ApplicationName)
|
||||
.OrderByDescending(g => g.Count())
|
||||
.Take(10)
|
||||
.Select(g => g.Key)
|
||||
.ToList();
|
||||
|
||||
// 统计使用最多的端口(Top 10)
|
||||
var allPorts = new List<string>();
|
||||
foreach (var rule in rules)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(rule.LocalPorts))
|
||||
allPorts.AddRange(rule.LocalPorts.Split(','));
|
||||
if (!string.IsNullOrEmpty(rule.RemotePorts))
|
||||
allPorts.AddRange(rule.RemotePorts.Split(','));
|
||||
}
|
||||
|
||||
stats.TopPorts = allPorts
|
||||
.Where(p => !string.IsNullOrWhiteSpace(p))
|
||||
.GroupBy(p => p.Trim())
|
||||
.OrderByDescending(g => g.Count())
|
||||
.Take(10)
|
||||
.Select(g => g.Key)
|
||||
.ToList();
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有有防火墙规则的应用程序列表
|
||||
/// </summary>
|
||||
/// <returns>应用程序路径的去重排序列表</returns>
|
||||
public List<string> GetApplicationsWithRules()
|
||||
{
|
||||
return GetAllRules()
|
||||
.Where(r => !string.IsNullOrEmpty(r.ApplicationName))
|
||||
.Select(r => r.ApplicationName)
|
||||
.Distinct()
|
||||
.OrderBy(a => a)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前活动的网络连接列表
|
||||
/// 注意:此方法需要使用netstat或WMI来获取实际的连接信息
|
||||
/// 当前为简化实现,返回空列表
|
||||
/// </summary>
|
||||
/// <returns>活动连接列表(当前返回空列表)</returns>
|
||||
public List<string> GetActiveConnections()
|
||||
{
|
||||
// 这个需要使用netstat或WMI来获取活动连接
|
||||
// 简化实现,返回空列表
|
||||
return new List<string>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 阻止指定应用程序的所有网络访问
|
||||
/// 创建入站和出站阻止规则
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序的完整路径</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool BlockApplication(string applicationPath)
|
||||
{
|
||||
var fileName = System.IO.Path.GetFileName(applicationPath);
|
||||
|
||||
// 创建入站阻止规则
|
||||
var blockInbound = CreateRule(new CreateRuleRequest
|
||||
{
|
||||
Name = $"Block {fileName} (Inbound)",
|
||||
Description = $"Automatically created rule to block {applicationPath}",
|
||||
ApplicationName = applicationPath,
|
||||
Direction = RuleDirection.Inbound,
|
||||
Action = RuleAction.Block,
|
||||
Profiles = FirewallProfile.All,
|
||||
Enabled = true
|
||||
});
|
||||
|
||||
// 创建出站阻止规则
|
||||
var blockOutbound = CreateRule(new CreateRuleRequest
|
||||
{
|
||||
Name = $"Block {fileName} (Outbound)",
|
||||
Description = $"Automatically created rule to block {applicationPath}",
|
||||
ApplicationName = applicationPath,
|
||||
Direction = RuleDirection.Outbound,
|
||||
Action = RuleAction.Block,
|
||||
Profiles = FirewallProfile.All,
|
||||
Enabled = true
|
||||
});
|
||||
|
||||
return blockInbound && blockOutbound;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解除对指定应用程序的网络访问阻止
|
||||
/// 删除该应用程序的所有阻止规则
|
||||
/// </summary>
|
||||
/// <param name="applicationPath">应用程序的完整路径</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool UnblockApplication(string applicationPath)
|
||||
{
|
||||
// 获取该应用程序的所有规则
|
||||
var rules = GetRulesByApplication(applicationPath);
|
||||
// 筛选出阻止规则
|
||||
var blockedRules = rules.Where(r => r.Action == RuleAction.Block).ToList();
|
||||
|
||||
bool allSuccess = true;
|
||||
foreach (var rule in blockedRules)
|
||||
{
|
||||
if (!DeleteRule(rule.Name))
|
||||
allSuccess = false;
|
||||
}
|
||||
|
||||
return allSuccess;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 配置文件管理
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的默认入站动作
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="action">默认动作(允许或阻止)</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool SetDefaultInboundAction(FirewallProfile profile, RuleAction action)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
var profileType = ConvertToNetFwProfile(profile);
|
||||
_fwPolicy.DefaultInboundAction[profileType] = (NET_FW_ACTION_)action;
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的默认出站动作
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="action">默认动作(允许或阻止)</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool SetDefaultOutboundAction(FirewallProfile profile, RuleAction action)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
var profileType = ConvertToNetFwProfile(profile);
|
||||
_fwPolicy.DefaultOutboundAction[profileType] = (NET_FW_ACTION_)action;
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的通知开关
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="enable">是否启用通知</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool SetNotifications(FirewallProfile profile, bool enable)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
var profileType = ConvertToNetFwProfile(profile);
|
||||
// 注意:NotificationsDisabled是反向逻辑
|
||||
_fwPolicy.NotificationsDisabled[profileType] = !enable;
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定配置文件的单播响应设置
|
||||
/// 控制是否允许对多播和广播流量的单播响应
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="enable">是否启用单播响应</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool SetUnicastResponses(FirewallProfile profile, bool enable)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
var profileType = ConvertToNetFwProfile(profile);
|
||||
// 注意:UnicastResponsesToMulticastBroadcastDisabled是反向逻辑
|
||||
_fwPolicy.UnicastResponsesToMulticastBroadcastDisabled[profileType] = !enable;
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 日志和监控
|
||||
|
||||
/// <summary>
|
||||
/// 获取防火墙日志记录
|
||||
/// 从Windows防火墙日志文件中读取日志条目
|
||||
/// </summary>
|
||||
/// <param name="startTime">开始时间(可选)</param>
|
||||
/// <param name="endTime">结束时间(可选)</param>
|
||||
/// <returns>日志条目列表</returns>
|
||||
public List<string> GetFirewallLogs(DateTime? startTime = null, DateTime? endTime = null)
|
||||
{
|
||||
// 这需要读取Windows防火墙日志文件
|
||||
// 通常位于 %windir%\system32\LogFiles\Firewall\pfirewall.log
|
||||
var logs = new List<string>();
|
||||
|
||||
try
|
||||
{
|
||||
// 构造防火墙日志文件路径
|
||||
string logPath = System.IO.Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.System),
|
||||
@"LogFiles\Firewall\pfirewall.log"
|
||||
);
|
||||
|
||||
if (System.IO.File.Exists(logPath))
|
||||
{
|
||||
var lines = System.IO.File.ReadAllLines(logPath);
|
||||
foreach (var line in lines)
|
||||
{
|
||||
// 跳过注释行和空行
|
||||
if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("#"))
|
||||
{
|
||||
// TODO: 这里可以根据startTime和endTime参数进行时间过滤
|
||||
logs.Add(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 日志文件可能需要管理员权限才能访问
|
||||
}
|
||||
|
||||
return logs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启用指定配置文件的防火墙日志记录
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <param name="logFilePath">日志文件路径</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool EnableLogging(FirewallProfile profile, string logFilePath)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_fwPolicy == null) return false;
|
||||
|
||||
// Windows防火墙日志设置通常需要通过注册表或组策略
|
||||
// 这里提供一个简化的实现
|
||||
// 实际实现需要修改注册表项或使用高级防火墙管理接口
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 禁用指定配置文件的防火墙日志记录
|
||||
/// </summary>
|
||||
/// <param name="profile">目标配置文件</param>
|
||||
/// <returns>操作成功返回true,失败返回false</returns>
|
||||
public bool DisableLogging(FirewallProfile profile)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 简化实现
|
||||
// 实际实现需要修改相关的注册表设置
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 辅助方法
|
||||
|
||||
/// <summary>
|
||||
/// 将Windows防火墙API的规则对象转换为自定义的FirewallRule对象
|
||||
/// </summary>
|
||||
/// <param name="rule">Windows防火墙API规则对象</param>
|
||||
/// <returns>转换后的FirewallRule对象</returns>
|
||||
private FirewallRule ConvertToFirewallRule(INetFwRule rule)
|
||||
{
|
||||
return new FirewallRule
|
||||
{
|
||||
Name = rule.Name ?? string.Empty, // 规则名称
|
||||
Description = rule.Description ?? string.Empty, // 规则描述
|
||||
ApplicationName = rule.ApplicationName ?? string.Empty, // 应用程序路径
|
||||
// ServiceName 在某些版本的 INetFwRule 中可能不存在,使用默认值
|
||||
ServiceName = string.Empty, // 服务名称
|
||||
Protocol = (ProtocolType)rule.Protocol, // 协议类型
|
||||
LocalPorts = rule.LocalPorts ?? string.Empty, // 本地端口
|
||||
RemotePorts = rule.RemotePorts ?? string.Empty, // 远程端口
|
||||
LocalAddresses = rule.LocalAddresses ?? string.Empty, // 本地地址
|
||||
RemoteAddresses = rule.RemoteAddresses ?? string.Empty, // 远程地址
|
||||
IcmpTypesAndCodes = rule.IcmpTypesAndCodes ?? string.Empty, // ICMP类型和代码
|
||||
Direction = (RuleDirection)rule.Direction, // 流量方向
|
||||
Enabled = rule.Enabled, // 是否启用
|
||||
Profiles = ConvertFromNetFwProfiles(rule.Profiles), // 适用的配置文件
|
||||
EdgeTraversal = rule.EdgeTraversal, // 边缘遍历设置
|
||||
Action = (RuleAction)rule.Action, // 规则动作
|
||||
Grouping = rule.Grouping ?? string.Empty, // 规则组
|
||||
InterfaceTypes = rule.InterfaceTypes ?? string.Empty, // 接口类型
|
||||
Interfaces = ParseInterfaces(rule.Interfaces) // 接口列表
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析接口对象数组为字符串列表
|
||||
/// </summary>
|
||||
/// <param name="interfaces">接口对象(可能是数组)</param>
|
||||
/// <returns>接口名称字符串列表</returns>
|
||||
private List<string> ParseInterfaces(object? interfaces)
|
||||
{
|
||||
var result = new List<string>();
|
||||
if (interfaces is Array array)
|
||||
{
|
||||
foreach (var item in array)
|
||||
{
|
||||
if (item != null)
|
||||
result.Add(item.ToString() ?? string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将自定义的FirewallProfile枚举转换为Windows防火墙API的配置文件类型
|
||||
/// </summary>
|
||||
/// <param name="profile">自定义配置文件枚举</param>
|
||||
/// <returns>Windows防火墙API配置文件类型</returns>
|
||||
private NET_FW_PROFILE_TYPE2_ ConvertToNetFwProfile(FirewallProfile profile)
|
||||
{
|
||||
return profile switch
|
||||
{
|
||||
FirewallProfile.Domain => NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN,
|
||||
FirewallProfile.Private => NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE,
|
||||
FirewallProfile.Public => NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC,
|
||||
_ => NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_ALL
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将自定义的FirewallProfile标志转换为Windows防火墙API的配置文件掩码
|
||||
/// 支持多个配置文件的组合
|
||||
/// </summary>
|
||||
/// <param name="profiles">配置文件标志组合</param>
|
||||
/// <returns>Windows防火墙API配置文件掩码</returns>
|
||||
private int ConvertToNetFwProfiles(FirewallProfile profiles)
|
||||
{
|
||||
int result = 0;
|
||||
if (profiles.HasFlag(FirewallProfile.Domain))
|
||||
result |= (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN;
|
||||
if (profiles.HasFlag(FirewallProfile.Private))
|
||||
result |= (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE;
|
||||
if (profiles.HasFlag(FirewallProfile.Public))
|
||||
result |= (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将Windows防火墙API的配置文件掩码转换为自定义的FirewallProfile标志
|
||||
/// </summary>
|
||||
/// <param name="profiles">Windows防火墙API配置文件掩码</param>
|
||||
/// <returns>自定义配置文件标志组合</returns>
|
||||
private FirewallProfile ConvertFromNetFwProfiles(int profiles)
|
||||
{
|
||||
FirewallProfile result = 0;
|
||||
if ((profiles & (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN) != 0)
|
||||
result |= FirewallProfile.Domain;
|
||||
if ((profiles & (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE) != 0)
|
||||
result |= FirewallProfile.Private;
|
||||
if ((profiles & (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC) != 0)
|
||||
result |= FirewallProfile.Public;
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in new issue
Block a user