我有在 DNS 服务器上启用调试日志记录选项,我正在尝试解析 dns.log 中的输出。以下是来自 technet 的指南,介绍如何使用服务器调试日志选项,但我找不到任何权威资料表明每个字段的标准格式是什么,更不用说何时包含详细信息。
以下是该问题的一个示例日志行我的 Windows DNS 调试日志中括号中的数字代表什么含义?:
6/5/2013 10:00:32 AM 0E70 PACKET 00000000033397A0 UDP Rcv 10.161.60.71 5b47 Q [0001 D NOERROR] A (12)somecomputer(6)domain(3)com(0)
不幸的是,这个答案并没有涉及其他字段的含义。
Technet 的DNS 的工作原理对某些字段进行了很好的回顾,但没有具体说明调试日志格式。
所有的字段是什么?
解析信息的 powershell 脚本可获得加分。
答案1
笔记:这个答案本身可能不完整。我尝试添加尽可能多的信息,以帮助尽可能多地传播这个话题,但我将其添加为社区 Wiki,希望其他用户能够更新不完整或不正确的信息。
根据问题DNS 调试日志 dns.log 格式回顾,字段映射如下
Date and Time Type Prot Dir Request IP R/Q Flag Record Domain
6/5/2013 10:00:32 AM 0E70 PACKET 00000000033397A0 UDP Rcv 10.161.60.71 5b47 Q [0001 D NOERROR] A (12)somecomputer(6)domain(3)com(0)
以下是字段级别信息的列表:
- 日期和时间- DNS 流量的日期和时间
- 类型- DNS 流量的类型
- 蛋白质- 正在使用的协议 [TCP|UDP]
- 目录- 方向 - [录制獲取|森叮
- 请求 IP- 请求客户端的 IP 地址
- 收/问-R回覆问尤斯特
- 旗帜- DNS 更新消息标志
- 记录类型- DNS 记录的类型
- 领域- 最初请求的域名
查找
以下是每个类别的潜在查找值的列表:
国旗查询:
- 无错误 -
0
- 没有错误;更新成功。 - 前任 -
1
- 格式错误;DNS 服务器无法理解更新请求。 - 服务失败-
0x2
- DNS 服务器遇到内部错误,例如转发超时 - 恩斯域-
0x3
- 应该存在的名称不存在。 - 不通告 --DNS
0x4
服务器不支持指定的操作代码。 - 拒绝 -
0x5
- DNS 服务器拒绝执行更新,因为 - 易讯域名——
0x6
一个不应该存在的名字却存在了。 - 韓國總統計師 -
0x7
- 不应该存在的资源记录集确实存在。 - NXRR设置 -
0x8
- 应该存在的资源记录集不存在。 - 诺特 -
0x9
- DNS 服务器对于“区域”部分中命名的区域没有权威性。 - 非区域 -
0xA
- 先决条件或更新部分中使用的名称不在区域部分指定的区域内。
记录类型查找:
- A-
0x01
- 主机记录 - 国家标准-
0x02
- 名称服务器记录 - 别名记录-
0x05
- 别名记录 - 优先权-
0x0C
- 反向查找记录 - 墨西哥-
0x0F
- 邮件往来记录 - 服务车辆-
0x21
- 服务记录 - IXFR-
0xFB
- 增量区域传输记录 - AXFR-
0xFC
- 标准区域传输记录 - 全部-
0xFF
- 所有记录域
解析脚本
这是 Arun Sabale 于读取 DNS 调试日志并生成可读 CSV 格式的输出。
运行 cmdlet 后,您可以像这样调用它:
Get-DNSDebugLog -DNSLog ".\DnsDebug.log" | Export-Csv .\ProperlyFormatedLog.csv
脚本:
###########################################################################
# NAME: read DNS debug logs
# AUTHOR: Arun Sabale
# COMMENT:
# VERSION HISTORY:
# 1.0 - Initial release
###########################################################################
function Get-DNSDebugLog
{
<#
.SYNOPSIS
This cmdlet parses a Windows DNS Debug log.
.DESCRIPTION
When a DNS log is converted with this cmdlet it will be turned into objects for further parsing.
.EXAMPLE
Get-DNSDebugLog -DNSLog ".\Something.log" | Format-Table
Outputs the contents of the dns debug file "Something.log" as a table.
.EXAMPLE
Get-DNSDebugLog -DNSLog ".\Something.log" | Export-Csv .\ProperlyFormatedLog.csv
Turns the debug file into a csv-file.
.PARAMETER DNSLog
Path to the DNS log or DNS log data. Allows pipelining from for example Get-ChildItem for files, and supports pipelining DNS log data.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
[Alias('Fullname')]
[string] $DNSLog = "StringMode")
BEGIN { }
PROCESS {
$TheReverseRegExString="\(\d\)in-addr\(\d\)arpa\(\d\)"
ReturnDNSLogLines -DNSLog $DNSLog | % {
if ( $_ -match "^\d\d" -AND $_ -notlike "*EVENT*") {
$Date=$null
$Time=$null
$DateTime=$null
$Protocol=$null
$Client=$null
$SendReceive=$null
$QueryType=$null
$RecordType=$null
$Query=$null
$Result=$null
$Date=($_ -split " ")[0]
# Check log time format and set properties
if ($_ -match ":\d\d AM|:\d\d PM") {
$Time=($_ -split " ")[1,2] -join " "
$Protocol=($_ -split " ")[7]
$Client=($_ -split " ")[9]
$SendReceive=($_ -split " ")[8]
$RecordType=(($_ -split "]")[1] -split " ")[1]
$Query=($_.ToString().Substring(110)) -replace "\s" -replace "\(\d?\d\)","." -replace "^\." -replace "\.$"
$Result=(((($_ -split "\[")[1]).ToString().Substring(9)) -split "]")[0] -replace " "
}
elseif ($_ -match "^\d\d\d\d\d\d\d\d \d\d:") {
$Date=$Date.Substring(0,4) + "-" + $Date.Substring(4,2) + "-" + $Date.Substring(6,2)
$Time=($_ -split " ")[1] -join " "
$Protocol=($_ -split " ")[6]
$Client=($_ -split " ")[8]
$SendReceive=($_ -split " ")[7]
$RecordType=(($_ -split "]")[1] -split " ")[1]
$Query=($_.ToString().Substring(110)) -replace "\s" -replace "\(\d?\d\)","." -replace "^\." -replace "\.$"
$Result=(((($_ -split "\[")[1]).ToString().Substring(9)) -split "]")[0] -replace " "
}
else {
$Time=($_ -split " ")[1]
$Protocol=($_ -split " ")[6]
$Client=($_ -split " ")[8]
$SendReceive=($_ -split " ")[7]
$RecordType=(($_ -split "]")[1] -split " ")[1]
$Query=($_.ToString().Substring(110)) -replace "\s" -replace "\(\d?\d\)","." -replace "^\." -replace "\.$"
$Result=(((($_ -split "\[")[1]).ToString().Substring(9)) -split "]")[0] -replace " "
}
$DateTime=Get-Date("$Date $Time") -Format "yyyy-MM-dd HH:mm:ss"
if ($_ -match $TheReverseRegExString) {
$QueryType="Reverse"
}
else {
$QueryType="Forward"
}
$returnObj = New-Object System.Object
$returnObj | Add-Member -Type NoteProperty -Name Date -Value $DateTime
$returnObj | Add-Member -Type NoteProperty -Name QueryType -Value $QueryType
$returnObj | Add-Member -Type NoteProperty -Name Client -Value $Client
$returnObj | Add-Member -Type NoteProperty -Name SendReceive -Value $SendReceive
$returnObj | Add-Member -Type NoteProperty -Name Protocol -Value $Protocol
$returnObj | Add-Member -Type NoteProperty -Name RecordType -Value $RecordType
$returnObj | Add-Member -Type NoteProperty -Name Query -Value $Query
$returnObj | Add-Member -Type NoteProperty -Name Results -Value $Result
if ($returnObj.Query -ne $null) {
Write-Output $returnObj
}
}
}
}
END { }
}
function ReturnDNSLogLines
{
param(
$DNSLog)
$PathCorrect=try { Test-Path $DNSLog -ErrorAction Stop } catch { $false }
if ($DNSLog -match "^\d\d" -AND $DNSLog -notlike "*EVENT*" -AND $PathCorrect -ne $true) {
$DNSLog
}
elseif ($PathCorrect -eq $true) {
Get-Content $DNSLog | % { $_ }
}
}