如何使用PowerShell批量查询pfirewall.log文件中被封禁IP的连接记录?
美国、香港服务器
如何使用PowerShell批量查询pfirewall.log文件中被封禁IP的连接记录?
11-22 来源:
使用 PowerShell 批量查询 pfirewall.log 中被封禁 IP 的连接记录,核心是通过 筛选 DROP 关键字(防火墙阻断标识)、解析日志字段,实现批量提取、统计、导出,适合快速处理大量日志或多 IP 排查。以下是 4 个实用场景的脚本(直接复制可用),含详细说明:
前置准备
确认日志路径(默认路径,若自定义需替换):
C:\Windows\System32\LogFiles\Firewall\pfirewall.log
以 管理员身份 打开 PowerShell(避免权限不足无法读取日志)。
确保日志已启用 “记录丢弃的数据包”(参考前文 wf.msc 配置方法)。
场景 1:批量提取所有被封禁(DROP)的连接记录
输出所有被防火墙阻断的连接,包含关键信息(日期、时间、被封禁 IP、目标端口等),便于快速浏览:
powershell
# 日志文件路径(默认路径,自定义路径需修改)
$logPath = "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
# 读取日志,筛选 DROP 记录,解析关键字段
Get-Content -Path $logPath -ErrorAction SilentlyContinue |
Select-String -Pattern "DROP" | # 仅保留被封禁的记录
ForEach-Object {
$fields = $_.Line -split "\s+" # 按空格分割日志字段(日志默认空格分隔)
# 只处理有效字段(避免日志表头/异常条目)
if ($fields.Count -ge 8) {
[PSCustomObject]@{
日期 = $fields[0]
时间 = $fields[1]
动作 = $fields[2] # 固定为 DROP
协议 = $fields[3] # TCP/UDP/ICMP
被封禁IP = $fields[4] # 攻击源IP(核心字段)
源端口 = $fields[5] # 攻击源端口
服务器IP = $fields[6] # 目标服务器IP
目标端口 = $fields[7] # 服务器被攻击的端口(如3389、80)
完整记录 = $_.Line # 保留完整日志行(便于核查)
}
}
} |
Format-Table -AutoSize # 自动调整表格列宽,美观显示
输出效果示例:
日期 时间 动作 协议 被封禁 IP 源端口 服务器 IP 目标端口
2025-11-22 09:15:30 DROP TCP 192.168.1.100 54321 10.0.0.5 3389
2025-11-22 09:16:45 DROP TCP 192.168.1.101 63210 10.0.0.5 80
场景 2:按指定 IP 批量查询(精准定位某一被封禁 IP 的所有记录)
若已知被封禁 IP(如 192.168.1.100),快速提取该 IP 的所有阻断记录:
powershell
$logPath = "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
$targetIP = "192.168.1.100" # 替换为你的被封禁IP
Get-Content -Path $logPath -ErrorAction SilentlyContinue |
Select-String -Pattern "DROP.*$targetIP" | # 匹配 DROP + 目标IP(精准筛选)
ForEach-Object {
$fields = $_.Line -split "\s+"
if ($fields.Count -ge 8) {
[PSCustomObject]@{
日期 = $fields[0]
时间 = $fields[1]
协议 = $fields[3]
被封禁IP = $fields[4]
目标端口 = $fields[7]
连接状态 = "已被防火墙阻断"
}
}
} |
Sort-Object -Property 日期, 时间 # 按时间排序,便于追溯攻击时序
场景 3:批量统计被封禁 IP 的攻击次数(按攻击频率排序)
快速识别高频攻击 IP(如暴力破解源),输出 IP 及对应的攻击次数,方便优先处理:
powershell
$logPath = "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
Get-Content -Path $logPath -ErrorAction SilentlyContinue |
Select-String -Pattern "DROP" |
ForEach-Object {
$fields = $_.Line -split "\s+"
if ($fields.Count -ge 5) { $fields[4] } # 仅提取被封禁IP
} |
Where-Object { $_ -notmatch "::1|127.0.0.1" } | # 排除本地IP(避免干扰)
Group-Object | # 按IP分组统计
Select-Object @{Name="被封禁IP"; Expression={$_.Name}},
@{Name="攻击次数"; Expression={$_.Count}} |
Sort-Object -Property 攻击次数 -Descending # 按攻击次数降序排列
输出效果示例:
被封禁 IP 攻击次数
192.168.1.100 28
192.168.1.101 15
203.0.113.5 8
场景 4:批量导出被封禁 IP 记录到 CSV(便于存档 / 分析)
将所有被封禁记录导出为 CSV 文件(Excel 可直接打开),适合长期存档或进一步数据分析:
powershell
$logPath = "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
$exportPath = "C:\Temp\被封禁IP连接记录.csv" # 导出路径(可自定义)
# 确保导出目录存在(如C:\Temp不存在则自动创建)
$exportDir = Split-Path -Path $exportPath -Parent
if (-not (Test-Path -Path $exportDir)) {
New-Item -Path $exportDir -ItemType Directory -Force | Out-Null
}
# 提取记录并导出CSV
Get-Content -Path $logPath -ErrorAction SilentlyContinue |
Select-String -Pattern "DROP" |
ForEach-Object {
$fields = $_.Line -split "\s+"
if ($fields.Count -ge 8) {
[PSCustomObject]@{
日期 = $fields[0]
时间 = $fields[1]
动作 = $fields[2]
协议 = $fields[3]
被封禁IP = $fields[4]
源端口 = $fields[5]
服务器IP = $fields[6]
目标端口 = $fields[7]
日志完整行 = $_.Line
}
}
} |
Export-Csv -Path $exportPath -Encoding UTF-8 -NoTypeInformation # 导出CSV
使用方式:
导出后打开 C:\Temp\被封禁IP连接记录.csv,可用 Excel 筛选、排序,或导入到数据分析工具。
关键优化与注意事项
避免日志表头干扰:脚本中通过 $fields.Count -ge 8 过滤表头(表头字段数不足),确保只处理有效连接记录。
权限问题:若提示 “无法访问文件”,需以管理员身份运行 PowerShell,或先将日志文件复制到桌面再读取(绕过系统目录权限限制)。
日志编码:默认日志为 ANSI 编码,Get-Content 可正常读取;若日志编码异常,可添加 -Encoding Default 参数。
大日志处理:若日志文件过大(如超过 100MB),可添加 -ReadCount 1000 分批读取,提升效率:
Get-Content -Path $logPath -ReadCount 1000 -ErrorAction SilentlyContinue
排除无效 IP:脚本中已排除本地回环 IP(127.0.0.1、::1),避免无关记录干扰。
扩展:实时监控被封禁 IP(动态查看新阻断记录)
若需实时监控新增的被封禁连接,可添加 -Wait 参数实现实时刷新:
powershell
$logPath = "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
Get-Content -Path $logPath -Wait -ErrorAction SilentlyContinue | # -Wait:实时监听日志更新
Select-String -Pattern "DROP" |
ForEach-Object {
$fields = $_.Line -split "\s+"
if ($fields.Count -ge 8) {
"[{0} {1}] 被封禁IP: {2} → 攻击端口: {3}" -f $fields[0], $fields[1], $fields[4], $fields[7]
}
}
运行后会实时输出新的阻断记录,适合临时监控攻击行为。
通过以上脚本,可高效完成批量查询、统计、导出等操作,覆盖日志分析的核心需求。若需调整字段、筛选条件(如按端口 / 时间范围),可留言说明场景,可进一步优化脚本。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快