Windows ServerでDNSクエリログを有効化し、ログファイルを解析する方法
本記事では、Windows Server上で稼働するDNSサーバーにおいて、すべてのユーザークエリに対するDNSロギングを有効にする方法と、DNSログの解析・分析方法について解説します。筆者がこの作業に取り組んだのは、支店オフィスの古いActive Directoryドメインコントローラーを廃止する必要があり、どのデバイスがまだそのDNSサーバーを使用しているのかを把握しなければならなかったケースです。DNSログを有効化して解析した結果、対象デバイスを特定し、他のDNSサーバーへ再設定することができました。また、この手法は、Active Directoryネットワーク内で不審なアクティビティ(悪意のあるURLへのアクセス、ボットネット感染ホストなど)を行っているホストの発見にも役立ちます。
DNSクエリログの有効化方法
もちろん、WiresharkやMicrosoft Network Monitor、pktmonなどをDNSホストにインストールしてポート53番のトラフィックをキャプチャすることも可能ですが、Windows Serverに組み込まれているDNSクエリロギング機能を使う方がはるかに簡単です。
デフォルトでは、Windows ServerのDNSロギングは無効になっています。有効化する手順は以下の通りです。
- DNSマネージャースナップイン(
dnsmgmt.msc)を開き、対象のDNSサーバーに接続します。 - サーバーのプロパティを開き、デバッグ ログタブに移動します。
- デバッグのためにパケットをログするオプションを有効にします。
- 続いて、ロギングオプションを設定します。DNSパケットの方向(受信/送信)、プロトコル(UDPおよび/またはTCP)、パケットタイプ(単純なDNSクエリ、更新、通知など)を選択できます。
- IPアドレスによるパケットフィルターオプションを使うと、記録対象の送受信パケットのIPアドレスを指定できます。これにより、ログサイズを大幅に削減できます。
- ログ ファイルのパスと名前欄に、すべてのイベントを記録するテキストファイル名を指定します。デフォルトではDNSログのサイズは500MBに制限されており、上限に達すると古いDNSルックアップイベントは新しいものによって上書きされます。
PowerShellでの設定確認と変更
GUIだけでなく、PowerShellを使ってDNSクエリロギングを有効化したり、現在の設定を取得したりすることもできます。
Get-DnsServerDiagnostics
なお、高負荷のWindows DNSホストでは、DNSクエリロギングがCPU・メモリ・ストレージに追加負荷をかける可能性がある点に注意してください(ディスク性能には十分な余裕が必要です)。
動作確認:テストクエリの実行
設定後、任意のコンピューターからDNSサーバーに対してクエリを実行してみましょう。例えば、Windows Serverが稼働するDNSホストのIPアドレスが192.168.13.10の場合:
nslookup woshub.com 192.168.13.10
PowerShellでDNS名前解決を試すこともできます。
Resolve-DnsName -Name woshub.com -Server 192.168.13.10
DNSルックアップクエリにより、要求されたホストのクライアントIPアドレスが返されます。
DNSログの確認方法
次に、クエリがDNSサーバーのログに記録されていることを確認します。テキストログファイルをクライアントIPアドレス(192.168.13.130)で検索しましょう。ログファイルはメモ帳で開いてもよいですし、PowerShellでgrepのように検索することも可能です。
get-content "C:\Logs\dc01dns.log" | Out-String -Stream | Select-String "192.168.13.130"
イベントの記録例は以下のようになります。
11/17/2021 6:00:00 AM 0D0C PACKET 00000272D98DD0B0 UDP Rcv 192.168.13.130 0002 Q [0001 D NOERROR] A (8)woshub(2)com(0)
ご覧の通り、(8)woshub(2)com(0)という名前を解決するDNSクエリが、クライアント192.168.13.130からUDP経由で受信され(Rcv)、その後DNSサーバーが正常に(NOERROR)応答しています。
各フィールドの意味は、ログファイルの冒頭に以下のように記載されています。
Field # Information Values ------- ----------- ------ 1 Date 2 Time 3 Thread ID 4 Context 5 Internal packet identifier 6 UDP/TCP indicator 7 Send/Receive indicator 8 Remote IP 9 Xid (hex) 10 Query/Response R = Response / blank = Query 11 Opcode Q = Standard Query / N = Notify / U = Update / ? = Unknown 12 Flags (hex) 13 Flags (char codes) A = Authoritative Answer / T = Truncated Response / D = Recursion Desired / R = Recursion Available 14 ResponseCode 15 Question Type 16 Question Name
Get-DNSDebugLog.ps1によるログの整形
この特殊な形式のため、DNSログファイルを手動で解析するのは困難です。そこで、Get-DNSDebugLog.ps1スクリプトを使って、DNSクエリログをより扱いやすい形式に変換します。
このPowerShellスクリプトは筆者作成のものではありませんが、現在TechNet Scriptcenterからは入手できないため、GitHubリポジトリに保存されています:https://github.com/maxbakhub/winposh/blob/main/Get-DNSDebugLog.ps1
ファイルをディスクにダウンロードします。次に、現在のコンソールセッションでPowerShellスクリプトの実行を許可します。
Set-ExecutionPolicy -Scope Process Unrestricted
Get-DNSDebugLog.ps1から関数をセッションにインポートします。
. C:\ps\Get-DNSDebugLog.ps1
そして、DNSログをより便利な形式に変換します。
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | format-table
また、結果をCSVファイルにエクスポートしてExcelでさらに分析することもできます(PowerShellから直接Excelファイルにアクセスし、必要なDNSクエリを書き込むことも可能です)。
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | Export-Csv C:\log\ProperlyFormatedDNSLog.csv –NoTypeInformation
このファイルをExcelに取り込めば、DNSクエリの分析に活用できます(ホストのIPアドレスと、それぞれがDNSサーバーに要求したDNS名が含まれています)。
Log Parser 2.2を使った解析
Log Parser 2.2(https://docs.microsoft.com/en-us/archive/blogs/secadv/parsing-dns-server-log-to-track-active-clients)を使ってDNSログファイルを解析することもできます。例えば、以下のコマンドはIPアドレスごとのDNSクエリ数を表示します。
LogParser.exe -i:TSV -nskiplines:30 -headerRow:off -iSeparator:space -nSep:1 -fixedSep:off -rtp:-1 "SELECT field9 AS IP, REVERSEDNS(IP) AS Name, count(IP) as QueryCount FROM "C:\Logs\dc01dns.log" WHERE field11 = 'Q' GROUP BY IP ORDER BY QueryCount DESC"
イベントログへの記録と大規模環境での運用
ここまでの例では、テキストファイルを使ってDNSログを収集しました。Windows Server 2012以降では、DNSクエリをイベントビューアー(Microsoft-Windows-DNS-Server/Audit)に直接記録することも可能です。しかし筆者の経験上、テキスト形式のDNSログの方がはるかに分析しやすくなっています。
もちろん、複数のサーバーでDNSクエリを記録したい場合は、Splunk、ELK、Graylog、Azure Log Analyticsなど、ログの収集・保存・処理に特化したソリューションの利用をおすすめします。
まとめ
DNSクエリログを有効化して解析した結果、筆者は依然として旧DNSサーバーを使用していたデバイスのIPアドレスを特定し、それらを他のDNSサーバーへ再設定することができました。旧ドメインコントローラーがFSMOロールを保持していないのであれば、削除を進めて問題ありません(ADユーザーのログオンイベントはここでは考慮不要です)。同様の手順は、ネットワーク内の不審なDNSアクティビティの調査にも応用できるため、日常的な運用監視の手段としても有用です。
-
Windows 11でDNSサーバーを変更する方法|設定アプリとコントロールパネルの手順を解説
DNS(Domain Name System/ドメインネームシステム)は、ドメイン名をIPアドレスに対応付ける仕組みで、インターネットに接続・アクセスするうえで極めて重要な役割を担っています。この仕組みのおかげで、私たちは複雑なIPアドレスではなく「techcult.com」のような分かりやすい名前でWebサイトにアクセスできるのです。 いわばDNSは「インターネットの電話帳」のようなもの。数字の羅列を覚えなくても、名前だけで目的のサイトへたどり着けるようにしてくれます。多くのユーザーはプロバイダー(ISP)が提供するデフォルトのDNSサーバーをそのまま使っていますが、それが必ずしも最適な選択
-
Windows 11でDNSサーバーを変更する方法【設定アプリ・コントロールパネル対応】
Windows 11のPCやノートパソコンでDNS設定を見直すことは、プライバシーを強化したい方にとって重要な作業です。Webページを開くときも、アプリがバックグラウンドでサーバーに接続するときも、DNSを変更しておけばPC上のすべてのインターネット通信を保護できます。この記事では、初心者の方に向けて、Windows 11でDNSサーバーを変更する方法を2つの手順で詳しく解説します。 DNSとは?なぜ変更する必要があるのか? 多くの人にとって、インターネットへの接続はスイッチを入れるように簡単なものになっています。面倒な手順を踏むことなく、数秒でデバイスをネットワークにつなげられるのは、D