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

 PixPin_2026-09-10_14-00-13

 

PixPin_2026-09-10_14-00-58

 

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 有两套主流操作路径:
  1. NetSecurity Cmdlet(Get-NetFirewallRule、New-NetFirewallRule、Set-NetFirewallSetting) 【推荐原生方案】
  2. 调用 netsh advfirewall(命令行封装,兼容旧系统)
流量记录分为两类:
  1. 防火墙日志(pfirewall.log):允许 / 丢弃连接日志,由防火墙服务输出;
  2. 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

  1. netsecurity.dll
     
    PowerShell NetSecurity 模块底层实现,导出所有防火墙规则管理逻辑,封装 WFAS API。
  2. wfapi.dll
     
    Windows Firewall API,所有工具(netsh、MMC 防火墙面板、PowerShell)统一调用入口。
  3. mpssvc.dll
     
    防火墙服务宿主模块,运行在 svchost.exe -k netsvcs。
  4. fwcfg.dll:防火墙配置辅助库

2)关键系统服务

MpsSvc(Windows Defender Firewall)
  • 名称:MpsSvc
  • 描述:承载防火墙规则加载、策略同步、日志控制、WFP 规则管理
  • ⚠️ 服务停止 → 防火墙完全失效,所有规则卸载

3)内核驱动栈(WFP 底层)

  1. fwpkclnt.sys:WFP 平台核心内核客户端
  2. wfplwf.sys:Windows 防火墙内置 WFP 筛选器(实现防火墙规则匹配)
  3. tcpip.sys:TCP/IP 协议栈,数据包处理点
  4. ndis.sys:网络驱动接口规范,网卡收发入口

4)持久化存储载体

  1. 本地防火墙策略
     
    注册表路径:
     
    HKLM\SYSTEM\CurrentControlSet\Services\MpsSvc\Parameters
     
    规则集合、域 / 专用 / 公用配置文件存储在内核可加载的策略容器,不直接可读注册表;
     
    通过 WFAS API 读写,禁止手动直接修改注册表。
  2. 防火墙流量日志文件
     
    默认路径:
     
    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
时序链路:
  1. Cmdlet 通过 netsecurity.dll 调用 wfapi.dll;
  2. RPC 调用本地 mpssvc.exe;
  3. MpsSvc 校验权限、验证规则合法性;
  4. 将规则编译转换为 WFP 筛选器,下发至内核 wfplwf.sys;
  5. 内核数据包通路生效;策略持久保存。

场景 2:启用防火墙丢弃 / 允许流量日志

powershell
Set-NetFirewallSetting -LogAllowedTraffic True -LogBlockedTraffic True -LogPath "C:\Logs\pfirewall.log"
  1. 配置参数提交至 MpsSvc;
  2. 服务更新 WFP 筛选器上下文:开启日志标志;
  3. 数据包匹配规则时,WFP 触发日志回调;
  4. MpsSvc 异步追加日志行到 pfirewall.log;
  5. 支持日志文件轮转(到达阈值自动新建日志)。

五、流量日志关键底层细节

  1. 日志由防火墙服务异步写出
     
    不会实时阻塞数据包转发;高流量场景会出现少量日志延迟。
  2. 日志记录粒度受规则控制
     
    全局开关 + 规则级别日志标记协同生效;全局关闭日志,单条规则开启也无效。
  3. 日志字段含义:源 IP、目标 IP、端口、协议、动作(ALLOW/DROP)、方向、时间、网卡接口。
  4. 权限限制
     
    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 握手前、数据包分片层、流层拦截)。

七、权限与高频故障底层根因

  1. 修改防火墙规则必须管理员权限
     
    WFAS 服务会校验调用者安全令牌;普通用户调用返回拒绝访问。
  2. 日志无法生成,pfirewall.log 空白
  • MpsSvc 未启动;
  • 日志路径权限不足(SYSTEM 无写入权限);
  • 未开启 LogAllowedTraffic / LogBlockedTraffic;
  • 第三方安全软件注入 WFP 筛选器抢占优先级,数据包被提前丢弃,无法触发防火墙日志。
  1. 组策略推送防火墙策略覆盖本地 PowerShell 配置
     
    域 GPO 防火墙策略优先级高于本地策略;PowerShell 修改会被策略强制回写。
  2. 日志过大磁盘占满
     
    需配置日志最大文件大小,开启自动轮转;脚本可定期归档清理旧日志。
  3. 启用日志后轻微 CPU 开销
     
    高并发服务器大量连接场景,日志 IO 会产生负载,生产环境按需开启(不要长期全开允许日志)。

八、关键概念边界(极易混淆)

  1. 防火墙日志 (pfirewall.log):仅记录被防火墙规则处理的流量;
  2. PacketMonitor / netsh trace:基于 ETW、NDIS 层捕获原始数据包,独立于防火墙;
  3. 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防火墙:

  1. 查看当前的防火墙规则:

    powershellCopy Code
    Get-NetFirewallRule
  2. 创建新的防火墙规则:

    powershellCopy Code
    New-NetFirewallRule -DisplayName "MyFirewallRule" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80
  3. 删除现有的防火墙规则:

    powershellCopy Code
    Remove-NetFirewallRule -DisplayName "RuleName"

记录流量信息:

  1. 启用Windows防火墙日志: 首先,你需要确保Windows防火墙的日志功能已启用。你可以通过以下命令进行配置:

    powershellCopy Code
    Set-NetFirewallProfile -Logging MaxSize 4096

在PowerShell中,设置Windows防火墙日志大小的正确命令应该是使用 Set-NetFirewallProfile 命令的 -LogMaxSizeKilobytes 参数。以下是正确的命令:

powershellCopy Code
Set-NetFirewallProfile -LogMaxSizeKilobytes 4096

这样应该可以设置Windows防火墙日志的最大大小为4096 KB。

  1. 查看防火墙日志: 你可以使用以下命令查看Windows防火墙的日志内容:

    powershellCopy Code
    Get-NetFirewallSecurityFilter | Format-Table -AutoSize
  2. 导出防火墙日志到文件: 你也可以将防火墙日志导出到文件中。例如,将日志输出到CSV文件:

    powershellCopy Code
    Get-NetFirewallSecurityFilter | Export-Csv -Path C:\firewall_log.csv -NoTypeInformation
posted @ 2024-03-03 13:38  suv789  阅读(284)  评论(0)    收藏  举报