用 PowerShell 实时监控防火墙拦截事件的核心是订阅安全日志中事件 ID 5157,通过 EventLogWatcher 实现毫秒级响应,提取源 IP、目标端口等字段并聚合统计,支持一键调用 netsh 封禁恶意 IP。
在 windows server 中用 powershell 实时监控防火墙拦截事件,核心是聚焦 事件 id 5157(windows 筛选平台拒绝连接),配合轻量订阅机制,避免轮询开销。不依赖日志文件路径或 gui 操作,直接从系统安全日志中抓取结构化数据,适合脚本集成与告警联动。
锁定目标事件:只监听 ID 5157 的拦截记录
Windows 防火墙的底层决策由 WFP(Windows Filtering Platform)执行,每次拒绝连接都会写入安全日志,事件 ID 固定为 5157。它自带关键字段:源 IP、目标端口、协议、进程路径、筛选器名称,无需额外解析。
- 确认该事件已启用:默认开启,无需额外配置审计策略
- 过滤建议加时间窗,防止首次启动时拉取历史积压数据:
-FilterHashtable @{LogName='Security'; ID=5157; StartTime=(Get-Date).AddMinutes(-1)} - 避免用
Get-WinEvent -FilterXPath,语法复杂且性能不如FilterHashtable
用 EventLogWatcher 实现毫秒级响应
比定时 Get-WinEvent 轮询更高效——EventLogWatcher 是 .NET 原生监听器,事件发生即触发,资源占用低,适合长期驻留。
- 创建监听器:
$watcher = New-Object System.Diagnostics.Eventing.Reader.EventLogWatcher 'Security' - 注册事件:
Register-ObjectEvent -InputObject $watcher -EventName EventRecordWritten -Action { ... } - 在
-Action块中判断$EventArgs.EventRecord.Id -eq 5157,再提取$_.Properties[10].Value(SourceAddress)、$_.Properties[12].Value(DestinationPort)等索引字段 - 必须以管理员权限运行,否则无法读取 Security 日志
结构化输出并做简单聚合统计
原始事件对象嵌套深,直接输出不可读。建议提取后转成自定义对象,再按源 IP 或端口做分钟级计数,便于发现扫描行为。
- 示例字段映射:
[PSCustomObject]@{Time=$_.TimeCreated; SrcIP=$_.Properties[10].Value; DstPort=$_.Properties[12].Value; App=$_.Properties[17].Value} - 用
Group-Object SrcIP | Where-Object Count -gt 5快速识别高频攻击源 - 搭配
Write-Host或Out-File -Append输出到控制台或轻量日志,避免写入数据库带来延迟
附加建议:封禁 IP 可一键联动防火墙
统计出恶意 IP 后,可立即调用 netsh 创建临时阻断规则,形成“监控→识别→封锁”闭环:
netsh advfirewall firewall add rule name="Block_$SrcIP" dir=in action=block remoteip=$SrcIP profile=any- 规则名带 IP 方便后续清理:
netsh advfirewall firewall delete rule name="Block_192.168.1.100" - 注意:同一 IP 多次触发时,先检查是否已有规则,避免重复添加报错


















