powershell 无法直接按 dns 区域统计查询量,需先启用 dns 诊断日志,再通过解析日志提取域名后缀、分组统计实现区域级汇总,并支持正向/反向区域筛选及自动化告警。
powershell 本身不直接提供“按 dns 区域统计查询量”的实时计数功能,因为 windows 自带的 dns 服务器(dns server role)默认不记录每条查询所属的具体区域,只记录请求类型、客户端 ip、域名和时间等基础字段。但你可以通过启用并解析 dns 诊断日志,结合 powershell 筛选、分组和统计,实现按区域(即查询的域名后缀或权威区域名)动态汇总查询量。
启用 DNS 诊断日志(前提条件)
必须先在 DNS 服务器上开启详细查询日志,否则无数据可分析:
- 以管理员身份运行 PowerShell,执行:
Set-DnsServerDiagnostics -LogIPQuery 1 -LogClientQueries 1 -LogLevel 0xFF - 日志默认保存在 %SystemRoot%\System32\dns\dns.log,确保磁盘有足够空间且服务有写入权限
- 重启 DNS 服务使设置生效:
Restart-Service dns
用 PowerShell 实时提取并按区域归类统计
日志格式为纯文本,每行含时间、客户端IP、查询类型(QUERY)、域名等。关键操作是提取域名后缀(如 example.com),再按其归类计数:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 读取最新日志(例如最近 10 分钟):
$log = Get-Content "$env:SystemRoot\System32\dns\dns.log" -Tail 10000 | Where-Object { $_ -match 'QUERY.*IN' } - 提取域名并截取主区域(去掉子域,保留一级或二级域名):
$zones = $log | ForEach-Object { if ($_ -match '\s+QUERY\s+\S+\s+IN\s+(\S+)') { $domain = $matches[1].ToLower(); if ($domain -match '\.([a-z0-9\-]+\.[a-z]{2,})$') { $matches[1] } else { $domain } } } | Where-Object { $_ } - 按区域统计频次:
$zones | Group-Object | Sort-Object Count -Descending | Select-Object Name, Count
按需扩展:区分正向/反向区域或绑定到特定区域
若已知 DNS 服务器托管了明确的正向区域(如 contoso.com)和反向区域(如 10.168.192.in-addr.arpa),可进一步精准匹配:
- 统计对 contoso.com 及其子域的全部查询:
(Get-Content "$env:SystemRoot\System32\dns\dns.log" -Tail 5000) -match '\bcontoso\.com\b' | Measure-Object - 统计所有反向解析请求(常用于排查 PTR 泛滥):
(Get-Content "$env:SystemRoot\System32\dns\dns.log" -Tail 5000) -match '\.in-addr\.arpa|\.ip6\.arpa' | Measure-Object
自动化轮询与告警(可选进阶)
将上述逻辑封装为脚本,每分钟运行一次,对比前后差异,发现异常突增:
- 用 Get-Date -Format "yyyy-MM-dd HH:mm" 标记时间戳
- 把每次结果导出为 CSV:
$result | Export-Csv -Path "C:\dns\zone_stats_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation - 当某区域单分钟查询超 500 次,可触发邮件或写入事件日志:
if ($result.Count -gt 500) { Write-EventLog -LogName Application -Source "DNSMonitor" -EventID 1001 -EntryType Warning -Message "High query volume on $($result.Name)" }










