Назад | Перейти на главную страницу

Что находится в полях сообщений журнала отладки 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's Как работает DNS дает хороший обзор некоторых полей, но ничего конкретного о форматировании журнала отладки.

Какие все поля?

Бонусные баллы за сценарий PowerShell, который анализирует информацию.

Заметка: Этот ответ потенциально неполный как есть. Я попытался добавить как можно больше информации, чтобы нести факел как можно дальше, но я добавил ее как вики сообщества в надежде, что другие пользователи обновят неполную или неверную информацию.

По вопросу Журнал отладки 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-трафика
  • Prot - Используемый протокол [TCP | UDP]
  • Dir - Направление - [Receiving |Сенding]
  • Запросить IP - IP-адрес запрашивающего клиента
  • R / Q - рesponse / ReqUest
  • Флаг - Флаги сообщений об обновлении DNS
  • Тип записи - Тип DNS-записи
  • Домен - Домен, который изначально был запрошен

Поиски

Вот список потенциальных значений поиска для каждой из категорий:

Пометить поиск:

  • НЕТ ОШИБКИ - 0 - Нет ошибки; успешное обновление.
  • БЫВШИЙ - 1 - Ошибка формата; DNS-сервер не распознал запрос на обновление.
  • СЛУЖБА - 0x2 - DNS-сервер обнаружил внутреннюю ошибку, например тайм-аут пересылки.
  • NXDOMAIN - 0x3 - Имя, которое должно существовать, не существует.
  • NOTIMP - 0x4 - DNS-сервер не поддерживает указанный код операции.
  • ОТКАЗАЛАСЬ - 0x5 - DNS-сервер отказывается выполнять обновление, потому что
  • YXDOMAIN - 0x6 - Имя, которое не должно существовать, существует.
  • YXRRSET - 0x7 - Набор записей ресурсов, который не должен существовать, существует.
  • NXRRSET - 0x8 - Набор записей ресурсов, который должен существовать, не существует.
  • НОТА - 0x9 - DNS-сервер не является полномочным для зоны, указанной в разделе Zone.
  • NOTZONE - 0xA - Имя, используемое в разделах «Необходимые условия» или «Обновление», не входит в зону, указанную в разделе «Зона».

Поиск типа записи:

  • А - 0x01 - Запись хоста
  • NS - 0x02 - Запись сервера имен
  • CNAME - 0x05 - Запись псевдонима
  • PTR - 0x0C - Запись обратного просмотра
  • MX - 0x0F - Запись почтового обмена
  • SRV - 0x21 - Сервисная книжка
  • IXFR - 0xFB - Запись инкрементального переноса зоны
  • AXFR - 0xFC - Стандартная зона передачи записи
  • Все - 0xFF - Все записи Домена

Скрипт разбора

Вот командлет от Аруна Сабале на Чтение журнала отладки DNS и создание вывода в читаемом формате CSV.

После запуска командлета его можно назвать так:

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 | % { $_ }
    }
}