DNS 调试日志消息字段中的内容

DNS 调试日志消息字段中的内容

我有在 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- 应该存在的名称不存在。
  • 不通告 --DNS0x4服务器不支持指定的操作代码。
  • 拒绝 - 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 | % { $_ }
    }
}

相关内容