PowerShell中,你可以使用以下命令来操作Windows防火墙并记录流量信息 PowerShell 有两套主流操作路径: NetSecurity Cmdlet(Get-NetFirewallRule、New-NetFirewallRule、Set-NetFirewallSetting) 【推荐原生方案】 调用 netsh advfirewall(命令行封装,兼容旧系统)

PS C:\WINDOWS\system32> netsh wfp show
下列指令有效:
此上下文中的命令:
netsh wfp show appid - 显示指定文件的应用程序 ID。
netsh wfp show boottimepolicy - 显示启动时策略和筛选器。
netsh wfp show filters - 显示匹配指定流量参数的筛选器。
netsh wfp show ikeevents - 显示匹配指定参数的最近 IKE epoch 事件。
netsh wfp show netevents - 显示最近匹配流量参数的网络事件。
netsh wfp show options - 显示全局 WFP 选项。
netsh wfp show security - 显示指定的安全描述符。
netsh wfp show state - 显示 WFP 和 IPSec 的当前状态。
netsh wfp show sysports - 显示 TCP/IP 堆栈和 RPC 子系统使用的系统端口。
PowerShell 操作 Windows 防火墙 + 流量日志|完整拆解、底层原理、调用链路、依赖组件
一、整体定位
Windows 防火墙(Windows Defender Firewall,原 WFAS)底层基于 WFP(Windows Filtering Platform,Windows 筛选平台)。
PowerShell 有两套主流操作路径:
- NetSecurity Cmdlet(
Get-NetFirewallRule、New-NetFirewallRule、Set-NetFirewallSetting) 【推荐原生方案】 - 调用
netsh advfirewall(命令行封装,兼容旧系统)
流量记录分为两类:
- 防火墙日志(pfirewall.log):允许 / 丢弃连接日志,由防火墙服务输出;
- WFP 捕获、ETW 跟踪、PacketMonitor:更深层数据包流量捕获(不止防火墙规则)。
层级自上而下:PowerShell NetSecurity Cmdlet → Windows Firewall API → WFAS 服务 → WFP 平台(内核驱动)→ TCP/IP 协议栈(tcpip.sys)
二、完整调用栈树形链路
plaintext
PowerShell(pwsh/powershell.exe)
↓ NetSecurity 模块 (NetSecurity.psd1 / netsecurity.dll)
【用户态防火墙管理层】
mpssvc.exe (Windows Defender Firewall service,WFAS)
↓ WFAS API 接口层
↓ 两套能力分支
┌──────────────────────┐ ┌────────────────────────────────┐
│防火墙规则管理 │ │流量日志配置、日志写入控制 │
│内核:wfplwf.sys │ │日志输出:%systemroot%\system32\logfiles\firewall\pfirewall.log
└──────────────────────┘ └────────────────────────────────┘
↓
【底层核心:WFP Windows Filtering Platform】
fwpkclnt.sys(WFP客户端内核驱动)
↓ tcpip.sys / ndis.sys(网络协议栈、网卡驱动)
↓ 数据包进出网卡时触发筛选、允许/丢弃、记录日志
补充:netsh advfirewall 路径对比
plaintext
PowerShell & netsh advfirewall
↓ netsh.exe → wfapi.dll(WFAS用户态API)
↓ mpssvc.exe 防火墙服务
↓ 后续链路同上
NetSecurity Cmdlet 与 netsh 底层共用同一套 WFAS API,只是上层封装不同。
三、核心组件分层拆解
1)用户态关键二进制与 DLL
- netsecurity.dll
PowerShell
NetSecurity模块底层实现,导出所有防火墙规则管理逻辑,封装 WFAS API。 - wfapi.dll
Windows Firewall API,所有工具(netsh、MMC 防火墙面板、PowerShell)统一调用入口。
- mpssvc.dll
防火墙服务宿主模块,运行在
svchost.exe -k netsvcs。 - fwcfg.dll:防火墙配置辅助库
2)关键系统服务
MpsSvc(Windows Defender Firewall)
- 名称:MpsSvc
- 描述:承载防火墙规则加载、策略同步、日志控制、WFP 规则管理
- ⚠️ 服务停止 → 防火墙完全失效,所有规则卸载
3)内核驱动栈(WFP 底层)
- fwpkclnt.sys:WFP 平台核心内核客户端
- wfplwf.sys:Windows 防火墙内置 WFP 筛选器(实现防火墙规则匹配)
- tcpip.sys:TCP/IP 协议栈,数据包处理点
- ndis.sys:网络驱动接口规范,网卡收发入口
4)持久化存储载体
-
本地防火墙策略注册表路径:
HKLM\SYSTEM\CurrentControlSet\Services\MpsSvc\Parameters规则集合、域 / 专用 / 公用配置文件存储在内核可加载的策略容器,不直接可读注册表;通过 WFAS API 读写,禁止手动直接修改注册表。 -
防火墙流量日志文件默认路径:
C:\Windows\System32\LogFiles\Firewall\pfirewall.log格式:W3C 扩展日志文本;日志开关、存储路径、最大大小由Set-NetFirewallSetting控制。
日志写入逻辑:数据包命中 “记录” 标记的规则,WFP 通知 MpsSvc 异步写入日志,避免阻塞网络。
四、两类典型操作底层流程演示
场景 1:PowerShell 创建防火墙放行规则
powershell
New-NetFirewallRule -Name TestRule -DisplayName "测试放行" -Direction Inbound -LocalPort 80 -Action Allow
时序链路:
- Cmdlet 通过 netsecurity.dll 调用 wfapi.dll;
- RPC 调用本地 mpssvc.exe;
- MpsSvc 校验权限、验证规则合法性;
- 将规则编译转换为 WFP 筛选器,下发至内核 wfplwf.sys;
- 内核数据包通路生效;策略持久保存。
场景 2:启用防火墙丢弃 / 允许流量日志
powershell
Set-NetFirewallSetting -LogAllowedTraffic True -LogBlockedTraffic True -LogPath "C:\Logs\pfirewall.log"
- 配置参数提交至 MpsSvc;
- 服务更新 WFP 筛选器上下文:开启日志标志;
- 数据包匹配规则时,WFP 触发日志回调;
- MpsSvc 异步追加日志行到 pfirewall.log;
- 支持日志文件轮转(到达阈值自动新建日志)。
五、流量日志关键底层细节
- 日志由防火墙服务异步写出
不会实时阻塞数据包转发;高流量场景会出现少量日志延迟。
- 日志记录粒度受规则控制
全局开关 + 规则级别日志标记协同生效;全局关闭日志,单条规则开启也无效。
- 日志字段含义:源 IP、目标 IP、端口、协议、动作(ALLOW/DROP)、方向、时间、网卡接口。
- 权限限制
pfirewall.log 默认仅 SYSTEM 可读写;普通用户无法直接修改路径、无法随意删除日志。
六、三条操作方式横向对比
| 方式 | 底层载体 | 优势 | 劣势 |
|---|---|---|---|
| NetSecurity PowerShell Cmdlet | netsecurity.dll + wfapi.dll | 面向对象,管道友好,原生推荐 | Win7 及以上可用,老旧系统需开启模块 |
| netsh advfirewall | netsh.exe + wfapi.dll | 兼容极老系统 | 文本输出,难以自动化解析 |
| 直接调用 WFP 原生 API(C/P/Invoke) | fwpkclnt.sys 用户态 WFP API | 能力最强,可创建自定义 WFP 层筛选器 | 复杂度极高,不适合日常防火墙规则 |
重要区分:Windows 防火墙规则 ≠ 原生 WFP 规则防火墙是构建在 WFP 之上的易用管理层;WFP 能力远强于防火墙(可在 TCP 握手前、数据包分片层、流层拦截)。
七、权限与高频故障底层根因
-
修改防火墙规则必须管理员权限WFAS 服务会校验调用者安全令牌;普通用户调用返回拒绝访问。
-
日志无法生成,pfirewall.log 空白
- MpsSvc 未启动;
- 日志路径权限不足(SYSTEM 无写入权限);
- 未开启 LogAllowedTraffic / LogBlockedTraffic;
- 第三方安全软件注入 WFP 筛选器抢占优先级,数据包被提前丢弃,无法触发防火墙日志。
-
组策略推送防火墙策略覆盖本地 PowerShell 配置域 GPO 防火墙策略优先级高于本地策略;PowerShell 修改会被策略强制回写。
-
日志过大磁盘占满需配置日志最大文件大小,开启自动轮转;脚本可定期归档清理旧日志。
-
启用日志后轻微 CPU 开销高并发服务器大量连接场景,日志 IO 会产生负载,生产环境按需开启(不要长期全开允许日志)。
八、关键概念边界(极易混淆)
- 防火墙日志 (pfirewall.log):仅记录被防火墙规则处理的流量;
- PacketMonitor / netsh trace:基于 ETW、NDIS 层捕获原始数据包,独立于防火墙;
- WFP 是通用内核过滤平台;Windows Defender Firewall 只是 WFP 的一个使用者。
九、配套常用 PowerShell 链路示例(对应底层能力)
powershell
# 查询防火墙全局配置(日志开关)
Get-NetFirewallSetting
# 启用记录被阻止流量
Set-NetFirewallSetting -LogBlockedTraffic True
# 列出所有入站规则
Get-NetFirewallRule -Direction Inbound
# 新建放行端口规则
New-NetFirewallRule -DisplayName "Allow 3389" -LocalPort 3389 -Protocol TCP -Action Allow
在PowerShell中,你可以使用以下命令来操作Windows防火墙并记录流量信息:
操作Windows防火墙:
-
查看当前的防火墙规则:
powershellCopy CodeGet-NetFirewallRule -
创建新的防火墙规则:
powershellCopy CodeNew-NetFirewallRule -DisplayName "MyFirewallRule" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80 -
删除现有的防火墙规则:
powershellCopy CodeRemove-NetFirewallRule -DisplayName "RuleName"
记录流量信息:
-
启用Windows防火墙日志: 首先,你需要确保Windows防火墙的日志功能已启用。你可以通过以下命令进行配置:
powershellCopy CodeSet-NetFirewallProfile -Logging MaxSize 4096
在PowerShell中,设置Windows防火墙日志大小的正确命令应该是使用 Set-NetFirewallProfile 命令的 -LogMaxSizeKilobytes 参数。以下是正确的命令:
powershellCopy Code
Set-NetFirewallProfile -LogMaxSizeKilobytes 4096
这样应该可以设置Windows防火墙日志的最大大小为4096 KB。
-
查看防火墙日志: 你可以使用以下命令查看Windows防火墙的日志内容:
powershellCopy CodeGet-NetFirewallSecurityFilter | Format-Table -AutoSize -
导出防火墙日志到文件: 你也可以将防火墙日志导出到文件中。例如,将日志输出到CSV文件:
powershellCopy CodeGet-NetFirewallSecurityFilter | Export-Csv -Path C:\firewall_log.csv -NoTypeInformation


浙公网安备 33010602011771号