
一个基于 PowerShell 的 Windows 防火墙全自动化解决方案
Windows Firewall Ruleset 自动配置 Windows 防火墙,并为目标系统及其安装的软件应用严格的防火墙规则。
该项目仍处于 Alpha 阶段,点击上方 "status" 徽章了解更多。
该项目由两大部分组成:防火墙规则和防火墙框架,如下所述:
Windows 防火墙规则按以下分类组织到独立的 PowerShell 脚本中:
例如:
防火墙框架包含多个 PowerShell 模块、脚本和文档,用于收集构建和部署针对目标系统的专用防火墙所需的环境信息,例如:
因此,本仓库是轻松扩展防火墙以包含更多所需规则和功能的良好起点。
目前包含约 800 条防火墙规则、10 多个模块(100 多个函数)、多个脚本以及大量有用的文档。
您可以交互式地选择所需规则,仅部署这些规则,或者自动化处理,部署所有必要的规则和设置到防火墙。
详细的防火墙配置非常耗时,需要大量故障排除,更改需要测试和安全审计,并且如果需要将防火墙部署到数百或数千台远程计算机,情况会变得更糟,例如并非所有计算机都具有相同的软件或限制要求。
与控制面板中的防火墙规则不同,这些规则加载到 GPO 防火墙(本地组策略)中,这意味着系统设置更改或随机程序在其安装过程中安装的规则不会对防火墙产生影响,除非您明确设置例外。
基于程序和服务的规则将检查其指定的可执行文件的数字签名,如果缺少数字签名,将在 VirusTotal 上进行扫描,出于安全考虑,如果此验证失败,则不会创建规则或加载到防火墙中。(可强制)
默认出站行为为 "阻止",除非有允许网络流量的规则。在大多数防火墙中,除非您为每个可能的程序或服务维护规则,否则无法实现此设置。得益于这套规则集,将默认出站设置为阻止几乎不需要额外工作。
与通常情况不同,您将知道哪些规则不再有效或冗余,例如由于已卸载程序、不再存在的系统服务、Windows 更新后重命名的可执行文件等原因。
与预定义的 Windows 防火墙规则不同,这些规则更加严格,例如绑定到特定的用户帐户、规则应用于特定端口、网络接口、特定可执行文件、服务等,所有这些都从目标系统自动学习。
更新、过滤或搜索规则及其属性(如端口、地址等)更加容易,因为这些规则以脚本形式存在,您可以使用编辑器工具,如 regex、多光标 或 CTRL + F 对规则进行批量操作,在任何防火墙 UI 中由于界面限制都无法做到这一点。
大量代码致力于提供自动化解决方案,以构建和定义针对目标系统和用户的专用防火墙,最大限度地减少手动操作的需要,从而为您节省大量宝贵的管理时间。
本项目 Windows Firewall Ruleset 采用 MIT 许可证。
部分脚本、文件或模块并非 MIT 许可证,或者可能有其自己的版权所有者,因此许可证和版权声明以 "每个文件" 为基础维护。
下表列出了 Windows Firewall Ruleset 已测试的操作系统
sigcheck64.exe(强烈推荐)下载 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 服务条款、 和
目前,此防火墙针对最新的 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 由 自动调用。
将规则加载到空的 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。
有关为什么不建议使用管理员帐户的安全原因,请参阅 。 用于部署防火墙的管理员帐户必须设置密码。
如果您没有 SSH 密钥和其他通过 SSH 克隆所需的设置,则可以通过 HTTPS 克隆,或直接从 Releases 下载发布的 zip 文件,然后在最新版本下的 "assets" 下载 zip 文件。
这里的步骤假设您已从 "Releases" 下的 "assets" 部分下载了 zip 文件。
解压下载的归档文件,这些步骤假设您已将 zip 文件(仓库根目录)解压到 C:\ 根驱动器。
如果您希望使用 Windows PowerShell,请参阅 如何打开 Windows PowerShell。否则,PowerShell Core 和 Windows PowerShell 的过程类似:
打开解压后的文件夹,右键单击空白处,有一个以管理员身份运行 PowerShell Core 的选项(假设您在安装 PowerShell Core 时启用了上下文菜单),如果没有,请手动打开。
如果没有 PowerShell 上下文菜单,请执行以下两行命令进入 C:\ 根驱动器(输入或复制/粘贴每个命令并按回车),这是您解压下载的 zip 文件的位置
c:
cd \
进入下载的文件夹:
cd WindowsFirewallRuleset*
要查看当前执行策略,请键入以下命令并按回车:
(提示: 您可以使用 TAB 键自动补全)
Get-ExecutionPolicy
记住上述命令的输出,请注意 PowerShell Core 默认为 RemoteSigned,而 Windows PowerShell 在非服务器版本上默认为 Restricted。
将执行策略设置为不受限制,以便能够解除项目文件的锁定,(注意:RemoteSigned 仅在脚本解除锁定后才能工作)
以下部分给出了一些轻松管理防火墙的提示
Deploy-Firewall.ps1 脚本支持几个参数,让你按如下方式定制部署自动化:
- 要逐步进行操作,并在加载哪些规则集时收到确认提示,同时尝试实时解决问题,请运行:```powershell
.\Scripts\Deploy-Firewall.ps1 -Interactive
Deploy-Firewall:```powershell
.\Scripts\Deploy-Firewall.ps1为了了解各参数的含义,以便自行组合使用,请参阅`Deploy-Firewall.ps1`脚本中的注释,或运行以下命令:```powershell
Get-Help .\Scripts\Deploy-Firewall.ps1 -Detailed
有两种方法管理 GPO 规则:
使用本地组策略,此方法限制了你可以对该仓库中的规则进行的操作,例如禁用它们、更改某些属性或添加新规则。
更多信息请参阅:管理 GPO 防火墙
编辑 PowerShell 脚本,此方法赋予你完全控制权,你可以无限制地更改或删除现有规则,或添加新规则。
无论你的计划或设置是什么,你肯定希望执行额外的工作,例如自定义规则,或为尚未被此防火墙覆盖的程序添加新规则。
规则加载到本地组策略中,如果在防火墙设置期间你接受了创建个性化防火墙管理控制台的快捷方式,你可以运行该快捷方式,否则请按照管理 GPO 防火墙中提到的步骤操作。
有关 GPO 的更多信息,请参阅: 配置安全策略设置
如果你只想部署特定规则,有两种方法:
执行 Scripts\Deploy-Firewall.ps1,仅为你想要的规则集选择 是,否则选择 否 并按回车跳过当前规则集。
在 PowerShell 控制台中 cd 导航到包含所需规则集脚本的目录,然后执行单个脚本。
例如 cd .\Rules\IPv4\Outbound\Software 然后执行 .\Adobe.ps1 加载 Adobe 规则。
你可能之后想要运行 Scripts\Complete-Firewall.ps1 以应用默认防火墙行为(如果尚未设置),或者你可以在 GPO 中手动执行,但功能有限。
“功能有限” 意味着 Scripts\Complete-Firewall.ps1 配置了一些无法在防火墙 GUI 中调整的防火墙参数。
在两种情况下,所有匹配规则集组 DisplayGroup 的规则将在加载规则到 GPO 之前被删除。
目前有三种删除防火墙规则的方式:
最简单的方法是在 GPO 中选择所有要删除的规则,右键单击并删除。
根据文件删除规则,有一个专为此目的的函数,位于:
Modules\Ruleset.Firewall\Public\Remove-FirewallRule.ps1
但使用前你需要先将防火墙导出到文件。
要恢复到旧的防火墙状态(控制面板中的那个),你需要删除 GPO 中的所有规则,并在右键单击节点后将所有属性设置为 未配置:
高级安全 Windows Defender 防火墙 - 本地组策略对象
删除所有规则或恢复到以前的状态也可以通过 Scripts\Reset-Firewall.ps1 完成。
注意,如果你已有导出的 GPO 规则,还需要重新导入它们。
如果你想要从 GPO 导出规则,有两种可用方法:
在本地组策略中单击右键节点后点击 导出策略... 菜单进行导出:
高级安全 Windows Defender 防火墙 - 本地组策略对象
使用 PowerShell 导出,运行 Scripts\Backup-Firewall.ps1。
如果你想自定义导出,请参阅位于 Ruleset.Firewall 模块中的 Export-RegistryRule 函数,它几乎可以按任何你想的方式自定义导出。
如果你想要导入规则,使用 GPO 导入与导出相同,使用 PowerShell 导入只需运行 Scripts\Restore-Firewall.ps1,它会拾取你之前的导出文件。
要自定义导出/导入,请查看 Modules\Ruleset.Firewall\Public,那里有关于如何使用导出/导入模块函数的说明。
注意: Export-FirewallRule 函数非常慢,建议改为运行 Export-RegistryRule 函数,它尽可能快。
本节及其功能目前是实验性的,尚未完全完成,目前支持部署到单台远程计算机。

在远程防火墙部署中,至少涉及两台计算机,
一台称为管理计算机(客户端),其他所有计算机称为托管计算机(服务器)。
脚本由管理员在管理计算机上执行,然后防火墙同时部署或配置到多台服务器计算机上。
有关实现细节,请参阅 Modules\Ruleset.Remote 模块
注意: 远程功能并非远程防火墙部署所独有,本地部署默认也需要正常工作的 WinRM 和 PS 远程配置。
在远程部署之前,远程计算机(服务器)需要配置为接受连接,建立 SSL 连接的示例如下:
要允许执行,请在服务器计算机上配置 WinRM 服务和远程注册表,运行:
注意: 如果使用 PowerShell Core,请在下面的 Enable-WinRMServer 中省略 -Protocol HTTPS,这会同时启用 HTTP 和 HTTPS,这是临时解决方法,使兼容性模块能够在远程会话中工作。```powershell
Set-ExecutionPolicy -Scope LocalMachine RemoteSigned Set-Location C:\Path\to\WindowsFirewallRuleset Import-Module .\Modules\Ruleset.Remote Enable-WinRMServer -Protocol HTTPS -KeepDefault -Confirm:$false Enable-RemoteRegistry -Confirm:$false
完成这些步骤后,在 `\Exports` 目录中你将找到SSL证书(*.cer)文件,
需要将其复制到管理计算机的 `\Exports` 目录中。\
默认情况下,如果服务器计算机尚未拥有SSL证书,则会创建一个自签名SSL证书。
**注意:** 手动配置服务器计算机仅针对初始设置执行一次,
后续部署无需重复执行。
下一步是转到管理计算机并按需运行脚本,例如:```powershell
# On management computer
cd C:\Path\to\WindowsFirewallRuleset\Scripts
Deploy-Firewall -Domain "RemoteComputerName"
上面两组命令需要在同一版本的 PowerShell 中运行,例如,如果服务器是在 PowerShell Core 中配置的,那么客户端计算机也需要 PowerShell Core 才能进行部署。
如果服务器或管理计算机是工作站(例如,不是 Windows 服务器或不属于域),则其网络配置文件必须设置为专用配置文件。
远程部署可以在以下位置进行详细自定义:
Modules\Ruleset.Remote\Scripts\WinRMSettings.ps1Modules\Ruleset.Remote\Scripts\*Firewall.psscModules\Ruleset.Remote\Public\Register-SslCertificate.ps1Modules\Ruleset.Remote\Scripts\SessionSettings.ps1更多信息和故障排除提示,另请参阅 远程帮助
如需支持、问题报告、建议或自定义此仓库以及定期更新此防火墙的方法,请参阅 SUPPORT.md
以下功能是期望的,并可能在未来的某个时间点实现:
远程防火墙管理
适用于 Windows Server 版本和专用网关系统的全面防火墙规则集。
按需或定期注册表扫描,以验证活动防火墙过滤策略和防火墙设置的完整性
对以下尚未测试的 Windows 10.0 版本提供完整功能:
针对 x86 系统的功能
| 操作系统 | 版本类型 | 版本号 | 架构 |
|---|
| 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 |
您可能希望拥有 git 来检查更新、轻松切换分支或贡献代码。
推荐使用 VS Code 作为首选编辑器来浏览代码、根据需要编辑脚本或贡献。
如果使用 VSCode,还需要 PowerShell 扩展以实现代码导航和 PowerShell 语言功能。
要使用 VSCode 导航和编辑代码,强烈建议安装 PSScriptAnalyzer,否则由于各种仓库设置,编辑体验可能会异常。
没有硬件要求,但如果您计划编写和调试代码,建议至少 8GB 内存和 SSD 驱动器,以便舒适地处理项目;如果只是将规则部署到个人防火墙,则更低的配置也能正常工作。
Scripts\Deploy-Firewall.ps1某些脚本要求您(网络适配器)连接到网络,例如确定 IPv4 广播地址。(否则可能会产生错误)
系统上的所有内容都应保持最新,否则某些规则可能被跳过或不正确,这包括 Windows 更新、Microsoft Store 应用和所有其他软件。
软件或 Windows 更新可能会重命名可执行文件或其位置,用户帐户也可能被管理员重命名。因此,需要根据系统随时可能发生的变化,根据需要定期重新加载特定规则以更新防火墙。
这种行为称为 软件回归
在部署防火墙之前,建议更新目标计算机上的系统和用户程序,包括 Windows 商店应用,特别是如果系统是全新安装的,因为稍后更新可能需要重新加载某些规则。
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
系统可能会提示您接受执行策略更改,如果是,请键入 Y 并按回车接受。
更多信息请参见 关于执行策略
此时,您应首先通过执行名为 Scripts\Unblock-Project.ps1 的脚本来 "解除锁定" 所有仓库文件。顺便说一下,仓库文件被 Windows 锁定以防止用户运行从互联网下载的不可信脚本代码:
.\Scripts\Unblock-Project.ps1
如果询问,请确保回答 R 即 [R] Run once,根据需要重复多次以解除项目锁定。(大约最多 8 次)
仓库文件解除锁定后,将执行策略更改为 RemoteSigned:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
系统可能再次提示您接受执行策略更改,键入 Y 并按回车接受。
某些程序(如您的网络浏览器、游戏等)的规则依赖于安装变量。
大多数路径会自动搜索,变量会透明更新,否则您会收到警告和描述如何修复问题。
如有需要,这些安装变量可以在 Rules 目录下的各个脚本中找到。
建议在下一步运行主脚本之前关闭所有 MMC 管理控制台,如 gpedit.msc 或 secpol.msc。
返回 PowerShell 控制台,运行以下两个 Deploy-Firewall 命令之一:
要以尽可能少的提示自动部署防火墙,请运行:
.\Scripts\Deploy-Firewall.ps1 -Force
否则,要以交互方式提示加载哪些规则,请运行:
.\Scripts\Deploy-Firewall.ps1
```按回车键后,系统会询问你想要哪种规则集。\
如果需要在决定是否运行某个规则集时获得帮助,请在提示运行规则集时输入 `?` 并按回车以获取更多信息。\
如果出于任何原因想要中断并中止部署(例如开始新的部署),请在 PowerShell 窗口处于焦点时按键盘上的 `CTRL + C`,然后重启 PowerShell 控制台。
按照提示输出操作(例如按回车接受默认操作),这将需要你大约15分钟的注意力。
注意: 如果管理员账户使用的是 Microsoft 账户登录计算机,系统将要求提供凭据,该凭据必须是 Microsoft 电子邮件和密码,无论你是否使用 Windows Hello,指定 PIN 码等将不起作用,且不支持其他 Windows Hello 身份验证方法。
如果提供了无效的凭据,你将收到错误提示 Access is denied。
如果发生这种情况,你需要重启 PowerShell 控制台并重试。
有关为何需要这样做的更多信息,请参阅 FAQ
如果你遇到错误,可以选择忽略错误,或者更新产生错误的脚本,然后稍后重新运行该特定脚本。
完成后,你可能希望调整本地组策略中的一些规则,并非所有规则都默认启用,或者你可能想切换默认的允许/阻止行为。
规则可能无法涵盖你系统上安装的所有程序,在这种情况下,需要创建缺失的规则。
现在测试你的互联网连接(例如使用网页浏览器或其他程序),如果部署这些规则后无法连接到互联网,你有以下几个选项:
docs 目录以获取更多故障排除选项和文档作为部署防火墙的先决条件,一些系统服务已被启动并设置为自动启动,在 Logs 目录中你将找到 Services_<DATE>.log,以帮助你在需要时将服务恢复为默认状态。
例如,如果不需要,Windows Remote Management 服务不应运行(默认是“手动”启动)。