web-dev-qa-db-ja.com

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
KyleMit

:この回答はそのままでは不完全である可能性があります。トーチをできるだけ運ぶのに役立つ情報をできるだけ多く追加しようとしましたが、他のユーザーが不完全または不正確な情報を更新することを期待して、コミュニティ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トラフィックの日付と時刻
  • Type-DNSトラフィックのタイプ
  • Prot-使用されているプロトコル[TCP | UDP]
  • Dir-方向-[Receiving |SenDing]
  • リクエストIP-リクエストしているクライアントのIPアドレス
  • R/Q-[〜#〜] r [〜#〜]esponse/Request
  • フラグ-DNS更新メッセージフラグ
  • レコードタイプ-DNSレコードのタイプ
  • ドメイン-最初にリクエストされたドメイン

ルックアップ

各カテゴリの潜在的なルックアップ値のリストは次のとおりです。

フラグルックアップ

  • [〜#〜] noerror [〜#〜]-0-エラーなし。正常な更新。
  • [〜#〜] formerr [〜#〜]-1-フォーマットエラー; DNSサーバーが更新要求を理解しませんでした。
  • [〜#〜] servfail [〜#〜]-0x2-DNSサーバーで、転送タイムアウトなどの内部エラーが発生しました
  • [〜#〜] nxdomain [〜#〜]-0x3-存在するはずの名前が存在しません。
  • [〜#〜] notimp [〜#〜]-0x4-DNSサーバーは、指定された操作コードをサポートしていません。
  • [〜#〜]拒否[〜#〜]-0x5-DNSサーバーは、更新の実行を拒否します。
  • [〜#〜] yxdomain [〜#〜]-0x6-存在してはならない名前が存在します。
  • [〜#〜] yxrrset [〜#〜]-0x7-存在してはならないリソースレコードセットが存在します。
  • [〜#〜] nxrrset [〜#〜]-0x8-存在するはずのリソースレコードセットが存在しません。
  • [〜#〜] notauth [〜#〜]-0x9-DNSサーバーは、ゾーンセクションで指定されたゾーンに対して権限がありません。
  • [〜#〜] notzone [〜#〜]-0xA-前提条件または更新セクションで使用されている名前が、ゾーンセクションで指定されたゾーン内にありません。

レコードタイプルックアップ

  • [〜#〜] a [〜#〜]-0x01-ホストレコード
  • [〜#〜] ns [〜#〜]-0x02-ネームサーバーレコード
  • [〜#〜] cname [〜#〜]-0x05-エイリアスレコード
  • [〜#〜] ptr [〜#〜]-0x0C-逆引き記録
  • [〜#〜] mx [〜#〜]-0x0F-メール交換レコード
  • [〜#〜] srv [〜#〜]-0x21-サービス記録
  • [〜#〜] ixfr [〜#〜]-0xFB-インクリメンタルゾーン転送レコード
  • [〜#〜] axfr [〜#〜]-0xFC-標準ゾーン転送レコード
  • すべて-0xFF-すべてのレコードドメイン

スクリプトの解析

これは、Arun Sabaleからのコマンドレットです 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 | % { $_ }
    }
}
1
KyleMit