概述
For AI agents: a documentation index is available at /llms.txt; a markdown version of this page is available at /cn/docs/01-overview/index.md.
Windows DNS 服务器可以写入调试日志。它是一个纯文本文件,设计供人类阅读,在繁忙的域控制器上每天会增长数百兆字节。这样的组合使得当你想回答诸如*“昨晚哪个客户端查询了这个域名 40,000 次?”*这样的问题时,几乎毫无用处。
DNSServer.DebugLogParser 将该文本文件转换为 CSV 表格。一条日志行变成一行带有命名列的记录,这样你就可以用 Excel 打开它,加载到 Power BI,批量插入到 SQL Server,或者发送到你的 SIEM。
该模块包含一个命令:
Convert-DNSDebugLogFile -InputFile "C:\Windows\System32\dns\dns.log"
这就是整个入口点。本站的其他内容都是关于如何大规模、定时以及跨多台服务器执行转换。
DNS 调试日志的样子
原始条目是一行带有位置字段的文本,其中一些字段用括号括起来:
2026-01-20 23:00:16 0FE0 PACKET 000002C53117D990 UDP Rcv 10.0.0.2 c049 Q [0001 D NOERROR] A (3)odc(9)officeapps(4)live(3)com(0)
转换后,同一事件变成可筛选和排序的 CSV 行:
DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;"odc.officeapps.live.com";"";"";dc01
注意原始格式难以处理而解析器帮你处理的两点:
- 查询的名称以 DNS 线格式存储,即
(3)odc(9)officeapps(4)live(3)com(0),转换后变成正常的 FQDN。 - 一个事件不总是单行。
PACKET详情块和事件消息会继续出现在缩进的后续行。解析器会将它们附加到所属记录,而不是丢弃或生成孤立行。
每条记录最多包含 16 个原生字段——时间戳、协议、方向、客户端 IP、查询类型、查询名称、响应代码、标志等。完整列列表详见输出格式。
为什么要转换
故障排除
- 查明名称无法解析的原因,以及查询是否到达服务器
- 识别配置错误的客户端或频繁请求服务器的应用
- 跟踪问题查询的实际来源
- 验证区域传送和 DNS 的整体行为
性能与容量
- 按查询量排名客户端,找出“吵闹”的客户端
- 查看哪些记录类型主导流量
- 发现导致不必要查询的配置错误
- 跟踪服务器负载变化,而不是凭猜测
安全分析
- 检测 DNS 隧道和数据外泄(通常表现为过多的
TXT流量——参见SQL Server 分析示例) - 查找针对恶意软件和指挥控制域的查询
- 识别被攻陷主机的查询模式
- 监控 DNS 放大攻击滥用
- 重建事件发生过程
合规与审计
- 满足日志记录和保留要求
- 保持网络活动的审计轨迹
- 为管理层或审计员生成报告
模块工作原理
Convert-DNSDebugLogFile 以流方式读取日志并以流方式写入 CSV。文件从未整体加载到内存,因此 100 MB 的日志消耗的内存大致与 10 MB 的日志相同。详情见性能。
它提供的功能:
| 功能 | 详情 |
|---|---|
| 一致的 CSV 布局 | 18 列,每次顺序相同,无论日志中出现哪些上下文 |
| 多行记录 | PACKET 详情块和事件文本保持附加在其记录上 |
| DNS 服务器版本 | 支持 2012 R2 到 2025 的日志格式 |
| PowerShell 版本 | 支持 Windows PowerShell 5.1+ 和 PowerShell 7.x |
| 文件大小 | 测试过 100 MB+ 日志;单次流式处理 |
| 头部验证 | 拒绝非 DNS 调试日志文件(可关闭) |
| 统计信息 | 可选每日汇总,按上下文及客户端/协议/类型分类 |
| 管道支持 | Get-ChildItem *.log | Convert-DNSDebugLogFile |
| 压缩 | 可选 ZIP 输出,通常压缩率超过 90% |
| 源文件清理 | 成功运行后可选删除日志 |
| 国际日志 | 按文化解析和写入日期,支持如 de-DE 日志在 en-US 工作站读取 |
| 网络路径 | 支持从 SMB/UNC 路径读取 |
| 锁定文件 | 支持读取 DNS 服务器(或其他程序)当前打开的日志 |
活动日志与轮换日志
模块可以读取 DNS 服务器当前正在写入的日志文件。这方便快速查看,但文件在转换过程中会持续变化,结果可能缺失最新条目或以截断记录结束。
对于任何计划任务或生产环境,建议转换已轮换、已关闭的日志文件,且切勿将活动日志与 -RemoveSourceFile 一起使用。
实际操作模式是启用 DNS 服务器的日志轮换,让定时转换跳过最新文件:
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
Sort-Object LastWriteTime -Descending |
Select-Object -Skip 1 |
Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
基于组策略的完整实现记录在基于 GPO 的收集示例中。
下一步去哪儿
- 输出格式 — 列含义及真实示例文件
- 参数和选项 — 详细解释各种参数
- 性能 — 为什么快以及如何保持快速
- 集成 — Excel、Power BI、SQL、SIEM、Python
- 运维最佳实践 — 生产环境运行指南
- 使用示例 — 定时任务、GPO 部署、SQL 分析
- 命令参考 — 权威参数列表
许可和支持
MIT 许可证。社区支持通过 GitHub Issues 进行,欢迎提交错误报告和功能请求。
- GitHub 仓库:AndiBellstedt/DNSServer.DebugLogParser
- PowerShell Gallery:DNSServer.DebugLogParser