![替代文本][corporate firewall]
[![Alpha 版本][badge status]][alpha]
一个基于 PowerShell 的 Windows 防火墙全自动化解决方案
Windows Firewall Ruleset 自动配置 Windows 防火墙,并为目标系统及其安装的软件应用严格的防火墙规则。
该项目仍处于 Alpha 阶段,点击上方 "status" 徽章了解更多。
该项目由两大部分组成:防火墙规则和防火墙框架,如下所述:
Windows 防火墙规则按以下分类组织到独立的 PowerShell 脚本中:
例如:
防火墙框架包含多个 PowerShell 模块、脚本和文档,用于收集构建和部署针对目标系统的专用防火墙所需的环境信息,例如:
因此,本仓库是轻松扩展防火墙以包含更多所需规则和功能的良好起点。
目前包含约 800 条防火墙规则、10 多个模块(100 多个函数)、多个脚本以及大量有用的文档。
您可以交互式地选择所需规则,仅部署这些规则,或者自动化处理,部署所有必要的规则和设置到防火墙。
[![在 VSCode 中管理][badge vscode]][vscode] [![PowerShell][badge language]][powershell]
详细的防火墙配置非常耗时,需要大量故障排除,更改需要测试和安全审计,并且如果需要将防火墙部署到数百或数千台远程计算机,情况会变得更糟,例如并非所有计算机都具有相同的软件或限制要求。
与控制面板中的防火墙规则不同,这些规则加载到 GPO 防火墙(本地组策略)中,这意味着系统设置更改或随机程序在其安装过程中安装的规则不会对防火墙产生影响,除非您明确设置例外。
基于程序和服务的规则将检查其指定的可执行文件的数字签名,如果缺少数字签名,将在 VirusTotal 上进行扫描,出于安全考虑,如果此验证失败,则不会创建规则或加载到防火墙中。(可强制)
默认出站行为为 "阻止",除非有允许网络流量的规则。在大多数防火墙中,除非您为每个可能的程序或服务维护规则,否则无法实现此设置。得益于这套规则集,将默认出站设置为阻止几乎不需要额外工作。
与通常情况不同,您将知道哪些规则不再有效或冗余,例如由于已卸载程序、不再存在的系统服务、Windows 更新后重命名的可执行文件等原因。
与预定义的 Windows 防火墙规则不同,这些规则更加严格,例如绑定到特定的用户帐户、规则应用于特定端口、网络接口、特定可执行文件、服务等,所有这些都从目标系统自动学习。
更新、过滤或搜索规则及其属性(如端口、地址等)更加容易,因为这些规则以脚本形式存在,您可以使用编辑器工具,如 regex、[多光标][multicursor] 或 CTRL + F 对规则进行批量操作,在任何防火墙 UI 中由于界面限制都无法做到这一点。
大量代码致力于提供自动化解决方案,以构建和定义针对目标系统和用户的专用防火墙,最大限度地减少手动操作的需要,从而为您节省大量宝贵的管理时间。
本项目 Windows Firewall Ruleset 采用 MIT 许可证。
部分脚本、文件或模块并非 MIT 许可证,或者可能有其自己的版权所有者,因此许可证和版权声明以 "每个文件" 为基础维护。
[![Windows][badge system]][windows]
下表列出了 Windows Firewall Ruleset 已测试的操作系统
| 操作系统 | 版本类型 | 版本号 | 架构 |
|---|---|---|---|
| Windows 10 | Pro | 1809 - 22H2 | x64 |
| Windows 10 | Pro Education | 20H2 | x64 |
| Windows 10 | Enterprise | 1809 - 20H2 | x64 |
| Windows 10 | Education | 20H2 - 22H2 | x64 |
| Windows 11 | Pro Education | 21H2 | x64 |
| Windows 11 | Pro | 22H2 - 23H2 | x64 |
| Windows 11 | Enterprise | 22H2 | x64 |
| Windows Server 2019 | Essentials | 1809 | x64 |
| Windows Server 2019 | Standard | 1809 | x64 |
| Windows Server 2019 | Datacenter | 1809 | x64 |
| Windows Server 2022 | Standard | 21H2 | x64 |
| Windows Server 2022 | Datacenter | 21H2 | x64 |
sigcheck64.exe(强烈推荐)[下载 sigcheck][sigcheck]支持所有 Windows 10.0 系统(主版本 10,次版本 0)及以上版本,但不包括 Home 版,但仅上表中列出的版本已进行测试。
"版本号"列列出了已测试的发布版本,但仅最新操作系统版本会继续测试。
其他未测试但受支持的系统及功能列表请参见 未来
PowerShell Core 不内置于 Windows 中,您需要单独安装,或使用 Windows PowerShell(这是操作系统的一部分)。
如果使用 Windows PowerShell(桌面版)而不是 PowerShell Core,则需要 .NET Framework 最低版本 4.5。
Windows 10 附带最低 .NET 4.6(包含 .NET 4.5),Windows 11 附带最低 .NET 4.8
sigcheck64.exe(或 32 位 sigcheck.exe)是一个数字签名验证工具,您可以从 Microsoft 网站下载,并应放置到 C:\tools 目录或 %PATH% 环境变量中。
Windows Firewall Ruleset 将使用它在为每个可执行文件创建防火墙规则之前,对未数字签名的可执行文件执行基于哈希的在线恶意软件分析(VirusTotal)。
这只是一个推荐,如果 PATH 中没有 sigcheck64.exe,系统会提供下载选项,如果拒绝,则不进行恶意软件分析。
使用此功能即表示您同意 [VirusTotal 服务条款][virustotal terms]、[VirusTotal 隐私政策][virustotal privacy] 和 [Sysinternals 软件许可条款][sysinternals terms]
您可能希望拥有 git 来检查更新、轻松切换分支或贡献代码。
推荐使用 VS Code 作为首选编辑器来浏览代码、根据需要编辑脚本或贡献。
如果使用 VSCode,还需要 PowerShell 扩展以实现代码导航和 PowerShell 语言功能。
要使用 VSCode 导航和编辑代码,强烈建议安装 PSScriptAnalyzer,否则由于各种仓库设置,编辑体验可能会异常。
没有硬件要求,但如果您计划编写和调试代码,建议至少 8GB 内存和 SSD 驱动器,以便舒适地处理项目;如果只是将规则部署到个人防火墙,则更低的配置也能正常工作。
目前,此防火墙针对最新的 Windows 桌面/服务器系统进行测试和设计,并且已知在这些系统上工作。在较旧系统上使用需要额外工作。
测试在 64 位 Windows 上进行,少数规则在 32 位系统上不起作用,需要调整。32 位系统的完整功能正在开发中。
目前,您可以在 32 位系统上加载规则,只是少数规则可能对您的配置完全不相关。
关于如何在较旧 Windows 系统(如 Windows 7 或 Windows Server 2008)上使用此防火墙的信息,请参阅 旧版支持
以下是首次用户在部署防火墙之前应当了解的简要警告和注意事项
您可能会失去某些程序的互联网连接,或者在极少数情况下完全失去互联网连接。如果发生这种情况,您可以临时在 GPO 中允许出站网络,或运行
.\Scripts\Reset-Firewall.ps1 -Remoting -Service,将 GPO 防火墙重置为系统默认值、删除所有规则并将 WinRM 和修改过的服务恢复为系统默认值。
(之后需要重启 PowerShell)
在 docs 目录中有一个 ResetFirewall.md 指南,说明如何手动重置,以防您无法运行脚本或脚本无法解决问题。
除非您在 GPO 中拥有与本规则集完全相同组名的规则,否则您现有的规则不会被删除。但是,这不适用于 Scripts\Reset-Firewall.ps1,该脚本将完全清除 GPO 规则,仅保留控制面板中的规则。
如果您希望 100% 确定,请按照 导出\导入规则 中的说明导出您的 GPO 规则。
系统会询问您要加载哪些规则(如果您选择交互式部署,请参见后文)。为了最大程度减少互联网连接问题,您至少应部署所有通用网络和操作系统相关规则,称为 "CoreNetworking"、"ICMP"、"WindowsSystem"、"WindowsServices"、"Multicast",以及系统中已安装程序对应的所有规则。同时不要忽略 IPv6,即使您使用的是 IPv4 网络,Windows 也需要 IPv6。
在 GPO 中删除不需要的规则很容易,而不是之后在代码中挖掘查找遗漏的东西。
默认配置将设置无法在 GPO 中配置的全局防火墙行为,例如 有状态 FTP 和 PPTP 或全局 IPSec 设置。如果您需要特定设置,请访问 Scripts\Complete-Firewall.ps1 并查看 Set-NetFirewallSetting。
请注意,Scripts\Complete-Firewall.ps1 由 Scripts\Deploy-Firewall.ps1 自动调用。
某些脚本要求您(网络适配器)连接到网络,例如确定 IPv4 广播地址。(否则可能会产生错误)
系统上的所有内容都应保持最新,否则某些规则可能被跳过或不正确,这包括 Windows 更新、Microsoft Store 应用和所有其他软件。
将规则加载到空的 GPO 中应该非常快,但加载到已包含规则的 GPO 中会明显变慢(取决于现有规则的数量)
所有错误和警告将保存到 Logs 目录中,您可以稍后查看这些日志以修复某些问题。大多数警告甚至某些错误可以安全忽略,在某些情况下您可能希望尽可能解决错误。
任何导致 "拒绝访问" 的规则在加载时应通过再次执行特定脚本重新加载,请参见 FAQ 了解更多关于可能发生这种情况的原因。
如果仓库是手动下载、从另一台计算机或介质传输而来,则应首先解除仓库中所有文件的锁定,以避免每个执行脚本时出现 YES/NO 垃圾问题,方法是运行 Scripts\Unblock-Project.ps1
主脚本 Scripts\Deploy-Firewall.ps1 会执行此操作以防您忘记,但在那种情况下初始的 YES/NO 问题仍然会出现。
如果启用了 "勒索软件保护"(在 Windows Defender 中),请确保将 pwsh.exe(Core 版)或 powershell.exe(桌面版)或两者加入白名单,否则在开发模式下安装模块时会发生错误。
如果仓库代码下载到勒索软件保护下的文件夹,任何内容都可能被阻止。
需要重启 PowerShell 控制台才能使 "受控文件夹访问" 更改生效。
默认情况下,规则为 Users 组创建,仅在必要时为 Administrators 组创建。出于安全原因,建议使用标准用户帐户进行日常计算。
如果您是管理员且不愿在计算机上创建标准帐户,则必须修改 Config\ProjectSettings.ps1 中的 DefaultGroup 变量,并指定 Administrators。