この記事は、 「ネットワーク中級編|構築・検証・障害切り分けを身につける」 の第35回です。
前回の「TCP通信をパケットで確認する」で学んだパケット解析の考え方を使い、 今回はDNS QueryとDNS ResponseをWiresharkで読み解きます。
DNS通信をパケットで確認する|WiresharkでQuery・Responseを読み解く
「名前解決できない」という障害を、nslookupの結果だけで終わらせず、 実際のDNSパケットから判断できるようになりましょう。 QueryとResponse、Transaction ID、問い合わせ名、レコード種別、RCODE、TTL、 UDP/TCP 53までを、Wiresharkで確認する順序に沿って解説します。
DNS障害では、「Webサイトが開けない」「サーバー名では接続できない」といった症状が発生します。 しかし、原因はDNSサーバー停止だけとは限りません。
問い合わせ自体が送信されていない、応答が返っていない、NXDOMAINが返っている、 想定外のIPアドレスが返っているなど、パケットを見ることで障害箇所をさらに細かく分けられます。
この記事を読み終えるとできること
- DNS QueryとResponseをWiresharkで見分けられる
- Transaction IDで問い合わせと応答を対応付けられる
- A・AAAA・CNAMEなどの問い合わせ種別を読み取れる
- NOERROR・NXDOMAIN・SERVFAILなどの応答を判断できる
- DNSでUDP 53とTCP 53が使われる理由を説明できる
- 「問い合わせなし」「応答なし」「エラー応答」を切り分けられる
DNSをパケットで確認すると何が分かるのか
DNSパケットでは「誰が、どの名前について、何の情報を問い合わせ、 DNSサーバーがどの結果を返したか」を確認できます。
nslookupやdigは名前解決の結果を確認するのに便利ですが、
パケットキャプチャーではその途中にある通信そのものを確認できます。
Queryが出ているか
端末がDNSサーバーへ問い合わせを送信しているか確認します。
何を聞いているか
問い合わせ先の名前と、A・AAAAなどのレコード種別を確認します。
Responseが返るか
DNSサーバーから応答が届いているか、Transaction IDで対応付けます。
何が返ったか
IPアドレス、CNAME、RCODE、TTLなどから応答内容を判断します。
DNS障害の切り分けでは、「名前解決できない」という1つの症状を、Query → Response → 応答内容の3段階に分けます。
まずQueryとResponseの流れを理解する
PCがwww.example.comのIPv4アドレスを知りたいとします。
端末は設定されているDNSサーバーへAレコードを問い合わせ、DNSサーバーが結果を返します。
DNS Query / Responseの基本構成
Response:問い合わせ結果を返す
パケット一覧では2つのDNSパケットが基本
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 1 | 192.168.10.10 | 192.168.10.53 | DNS | Standard query 0x4a3b A www.example.com |
| 2 | 192.168.10.53 | 192.168.10.10 | DNS | Standard query response 0x4a3b A www.example.com |
QueryとResponseには同じTransaction IDが入り、Wiresharkでも対応する要求と応答を関連付けて表示できます。 まずは「問い合わせが1つ、その応答が1つ」という基本形を見つけられるようにしましょう。
今回の検証構成
最も再現しやすいように、PCでWiresharkを起動し、nslookupでDNS問い合わせを発生させます。
IPアドレスやDNSサーバーは、自分の環境に読み替えてください。
検証用の構成例
| 項目 | 例 | 確認方法 |
|---|---|---|
| 検証PC | 192.168.10.10/24 | Windows:ipconfig |
| DNSサーバー | 192.168.10.53 | ipconfig /all または nslookup |
| 問い合わせ名 | www.example.com | nslookup www.example.com |
| 表示フィルター | dns | Wiresharkの表示フィルター欄 |
パケットキャプチャーは、自分が管理する端末・検証環境、または許可を得たネットワークで実施してください。
DNS Queryには利用者がアクセスしようとしたホスト名が含まれるため、業務環境では取得範囲・保存先・共有先にも注意が必要です。
WiresharkでDNS通信を取得する手順
- 利用中のDNSサーバーを確認する
ipconfig /allなどで、PCに設定されているDNSサーバーを確認します。 - Wiresharkで使用中のインターフェースを選ぶ
EthernetまたはWi-Fiのうち、実際に通信しているインターフェースでキャプチャーを開始します。 - 表示フィルターへ
dnsを入力する
DNSとして解析されたパケットだけを表示します。 nslookup www.example.comを実行する
ブラウザのキャッシュに左右されにくい形で、DNS問い合わせを明示的に発生させます。- キャプチャーを停止する
QueryとResponseを探し、送信元・宛先・Transaction IDを確認します。
1.DNSサーバーを確認する
C:\> ipconfig /all
イーサネット アダプター Ethernet:
IPv4 アドレス . . . . . . . . . . : 192.168.10.10
サブネット マスク . . . . . . . . : 255.255.255.0
デフォルト ゲートウェイ . . . . . : 192.168.10.1
DNS サーバー. . . . . . . . . . . : 192.168.10.53
2.WiresharkでDNSだけを表示する
dns
3.nslookupで通信を発生させる
C:\> nslookup www.example.com
サーバー: dns.example.internal
Address: 192.168.10.53
名前: www.example.com
Addresses: (環境により異なります)
実際の応答IPアドレスは名前や時点、DNSサーバー、CDNなどによって変わる可能性があります。 演習では特定のIPアドレスを暗記するのではなく、Queryに対してどのレコードが返ったかを確認してください。
4.パケット一覧でQueryとResponseを確認する
| No. | Time | Source | Destination | Info |
|---|---|---|---|---|
| 10 | 0.000000 | 192.168.10.10 | 192.168.10.53 | Standard query 0x4a3b A www.example.com |
| 11 | 0.018452 | 192.168.10.53 | 192.168.10.10 | Standard query response 0x4a3b A www.example.com |
Queryの宛先が想定したDNSサーバーか、Responseの送信元がそのDNSサーバーかを最初に確認します。 ここを確認するだけでも、誤ったDNSサーバーを参照している設定ミスを見つけられることがあります。
DNS Queryの読み方
Queryでは、Transaction ID、Flags、Queriesセクションを中心に確認します。 WiresharkでQueryパケットを選び、「Domain Name System」を展開します。
0x4a3b0x0100 Standard query10www.example.comA (Host Address)IN確認ポイント1:Transaction ID
Transaction IDはDNSの問い合わせと応答を対応付けるための識別値です。
Queryが0x4a3bなら、対応するResponseでも同じIDを確認します。
確認ポイント2:Responseフラグが0
Queryでは「これは応答ではなく問い合わせ」という状態です。 Wiresharkの表示フィルターでは、問い合わせだけを次のように絞り込めます。
dns.flags.response == 0
確認ポイント3:問い合わせ名とType
Nameは「何という名前を調べているか」、Typeは「その名前について何の情報が欲しいか」を示します。
| Type | 主な意味 | 読み取り例 |
|---|---|---|
| A | IPv4アドレス | www.example.com のIPv4アドレスを知りたい |
| AAAA | IPv6アドレス | www.example.com のIPv6アドレスを知りたい |
| CNAME | 別名 | ある名前の正規名を確認する |
| MX | メール配送先 | そのドメインのメールサーバーを確認する |
| PTR | 逆引き名 | IPアドレスに対応する名前を確認する |
1回の操作でAとAAAAの両方が見えることがあります。 「同じ名前への問い合わせが複数ある=異常」とは限らず、IPv4とIPv6の両方を確認している場合があります。
DNS Responseの読み方
Responseでは、Queryと同じTransaction IDか、Responseフラグが1か、RCODEが正常か、 Answersに期待する情報が入っているかを確認します。
0x4a3b(Queryと一致)0x8180 Standard query response, No error のように表示1www.example.com: type A, class IN確認ポイント1:Transaction IDがQueryと一致する
同時に多数のDNS通信が流れていても、Transaction IDを見ることで、どのResponseがどのQueryに対応するか確認できます。
確認ポイント2:Responseフラグが1
dns.flags.response == 1
確認ポイント3:RCODE
Responseには問い合わせの処理結果を示すReply code(RCODE)が含まれます。 「応答が返ったか」だけでなく、どの結果で返ったかまで確認します。
| RCODE | 名称 | 意味 | 確認の方向 |
|---|---|---|---|
| 0 | NOERROR | DNSメッセージとして処理成功 | Answer内容・CNAME・レコード有無を確認 |
| 2 | SERVFAIL | サーバー側で処理を完了できなかった | 上位DNS、権威DNS、DNSSEC、サーバーログなど |
| 3 | NXDOMAIN | 問い合わせた名前が存在しないという応答 | 名前の誤り、DNSゾーン・レコード、検索サフィックス |
| 5 | REFUSED | DNSサーバーが問い合わせを拒否 | 許可クライアント、ACL、再帰問い合わせ設定 |
NOERRORだから必ず目的のIPアドレスが返るとは限りません。
RCODEが0でも、要求した種類のAnswerが0件であるケースがあります。RCODEとAnswer RRsは別々に確認してください。
DNSヘッダーで確認する重要フィールド
DNSメッセージは、ヘッダーとQuestion・Answer・Authority・Additionalなどのセクションから構成されます。 障害切り分けでは全項目を暗記するより、次のフィールドから読むと効率的です。
| 項目 | 確認すること | 障害切り分けでの意味 |
|---|---|---|
| Transaction ID | QueryとResponseが一致するか | 要求と応答を対応付ける |
| QR / Response | QueryかResponseか | 通信方向を判断する |
| RD | Recursion Desired | クライアントが再帰問い合わせを希望しているか |
| RA | Recursion Available | DNSサーバーが再帰問い合わせに対応しているか |
| TC | Truncated | UDP応答が切り詰められたことを示す |
| RCODE | 応答結果 | NOERROR、NXDOMAIN、SERVFAILなどを判断する |
| Questions | 問い合わせ数 | 何件のQuestionを含むか |
| Answer RRs | 回答レコード数 | 回答が返っているか確認する |
| Authority RRs | 権威情報 | 委任・権威サーバー情報などを読む |
| Additional RRs | 追加情報 | 追加レコードやEDNS(0)のOPTなどが入る場合がある |
RDとRAは混同しない
RD:Recursion Desired
問い合わせ側が「必要なら他のDNSサーバーへ問い合わせて最終結果まで調べてほしい」と希望していることを示します。
RA:Recursion Available
応答側DNSサーバーが再帰問い合わせ機能を利用可能としていることを示します。
社内DNSサーバーへ問い合わせたつもりなのにRAが期待と異なる、REFUSEDが返る、といった場合は、 DNSサーバーの再帰設定や問い合わせ元制限を確認するきっかけになります。
A・AAAA・CNAMEとTTLの読み方
Aレコード
Aレコードは名前に対応するIPv4アドレスを表します。 クライアントがAを問い合わせ、AnswersにIPv4アドレスが返れば、IPv4向けの名前解決結果を取得できています。
AAAAレコード
AAAAレコードはIPv6アドレスを表します。 AとAAAAが近いタイミングで問い合わせられることは珍しくありません。
CNAME
CNAMEは別名を正規名へ対応付けるレコードです。 Response内で「問い合わせた名前 → CNAME → 最終的なA/AAAA」のように複数のレコードが表示される場合があります。
TTL
TTL(Time To Live)は、そのDNSレコードをキャッシュとして保持できる時間の目安です。 DNSレコード変更後に「一部端末だけ古いIPアドレスを参照する」といった事象では、TTLやキャッシュの影響も確認します。
DNS変更直後の調査では、「権威DNSの設定が新しいか」と「クライアントが受け取っている回答が新しいか」を分けて確認します。 Wiresharkは後者を確認する有力な手段です。
UDP 53とTCP 53の違い
DNSはUDPだけのプロトコルではありません。通常の名前解決ではUDP 53をよく見ますが、TCP 53もDNSの正式な通信方式です。
| 通信 | 特徴 | パケットで見えるもの |
|---|---|---|
| DNS over UDP | 通常の問い合わせで広く利用される。コネクション確立なし | DNS Query → DNS Response |
| DNS over TCP | TCP接続上でDNSメッセージを送る | 3ウェイハンドシェイク → DNS Query/Response → TCP制御 |
TCビットに注目する
DNS ResponseのTC(Truncated)が1の場合、応答が切り詰められたことを示します。
その後、クライアントがTCPで問い合わせをやり直す流れが見えることがあります。
現在のDNSではEDNS(0)によってUDPで扱えるDNSメッセージサイズを拡張できます。 そのため「512バイトを超えたら必ずTCP」と単純には判断しません。 実際のパケットではOPTレコードやTCビット、TCPへの切り替わりを確認してください。
ファイアウォールでUDP 53だけを許可しTCP 53を拒否すると、通常の小さな問い合わせは成功するのに、 一部のDNS応答だけ失敗するという分かりにくい障害になることがあります。
障害調査で使えるWiresharkフィルター
DNS調査では、まずdnsから始め、状況に応じて条件を追加します。
| 目的 | 表示フィルター |
|---|---|
| DNS全体 | dns |
| Queryだけ | dns.flags.response == 0 |
| Responseだけ | dns.flags.response == 1 |
| 特定の名前 | dns.qry.name == "www.example.com" |
| エラー応答 | dns.flags.response == 1 && dns.flags.rcode != 0 |
| 特定Transaction ID | dns.id == 0x4a3b |
| 切り詰め応答 | dns.flags.truncated == 1 |
Wiresharkの表示フィルターは、キャプチャー済みパケットから「何を表示するか」を絞る機能です。 フィルターで表示されない場合でも、パケット自体が取得されている可能性があります。 切り分け中は一度フィルターを外して確認する習慣も重要です。
DNS障害をパケットで切り分ける
DNS障害では、QueryとResponseの有無を順番に確認すると原因候補を整理できます。
Query自体が見えない
主な確認ポイント
- 正しいインターフェースをキャプチャーしているか
- DNSキャッシュで名前解決済みではないか
- アプリがDoHなど別方式を使っていないか
- hostsファイルなどDNS以外で名前解決していないか
- 表示フィルターで除外していないか
Queryは出るがResponseが返らない
主な原因候補
- DNSサーバーまでのルーティング障害
- DNSサーバー停止
- ACL/ファイアウォールでUDP/TCP 53を遮断
- 戻り経路の問題
- 誤ったDNSサーバーIPを設定
Responseは返るがNXDOMAIN
主な確認ポイント
- 問い合わせ名の入力ミス
- DNS検索サフィックスの影響
- 対象ゾーン/レコードが存在するか
- 内部DNSと外部DNSの参照先が正しいか
Responseは返るがSERVFAIL
主な確認ポイント
- DNSサーバー自身が上位へ問い合わせできるか
- 権威DNSへの到達性
- DNSSEC検証エラーの有無
- サーバーログやフォワーダー設定
NOERRORでIPも返る
DNSとして分かったこと
- QueryがDNSサーバーへ届いている
- Responseがクライアントへ戻っている
- 名前解決結果を取得できている
それでもアプリが通信できない場合は、次にTCP/UDP接続、ルーティング、FW、サーバー側へ調査を進めます。
期待と違うIPが返る
主な確認ポイント
- DNSレコードの登録値
- 古いキャッシュ
- 内部/外部DNSで回答が分かれる構成
- ロードバランサーやCDNによる回答差
- 参照しているDNSサーバーが想定どおりか
現場での確認順序
- PCに設定されたDNSサーバーを確認する
- WiresharkでQueryが送信されるか確認する
- Queryの宛先DNSサーバーが正しいか確認する
- Responseが返るか確認する
- Transaction IDが一致するか確認する
- RCODEを確認する
- Answer RRsと返却レコードを確認する
- DNSが正常なら、名前解決後のTCP/UDP通信へ調査を進める
調査結果の報告例
【事象】
PC-Aから業務サーバー server01.example.internal を名前指定すると接続できない。
【確認結果】
・PC-AのDNSサーバー設定は192.168.10.53で設計値と一致。
・PC-Aから192.168.10.53宛てのDNS Queryを確認。
・Query Nameは server01.example.internal、TypeはA。
・同一Transaction IDのDNS Responseを確認。
・Response CodeはNXDOMAIN。
・IPアドレスを直接指定した通信は別途到達性あり。
【判断】
クライアント~DNSサーバー間の通信断ではなく、
DNSサーバーが対象名を存在しない名前として回答している状態。
対象ゾーン/Aレコード登録内容を確認する。
DNSが見えないとき:DoH・DoT・キャッシュ
ブラウザでWebサイトを開いたのにdnsフィルターで何も表示されない場合、
すぐに「DNS通信が発生していない」と判断してはいけません。
DNSキャッシュ
OSやアプリが以前の名前解決結果を保持していれば、新しいQueryを送らずに通信を開始できます。
DNS over HTTPS
DNSメッセージをHTTPS上で送る方式です。通常の平文DNSのようにdnsだけで内容を読めない場合があります。
DNS over TLS
DNS通信をTLSで保護します。暗号化区間では問い合わせ名を通常のDNSパケットとして直接読めません。
学習ではnslookupを使う
「ブラウザを開いたのにDNSが見えない」という混乱を避けるため、この記事の基本演習ではnslookupを使います。
DNSパケット解析の学習と、ブラウザ固有のキャッシュ・暗号化DNSの挙動を切り分けられるからです。
実務では「DNSが見えない」こと自体が情報になります。 OS標準のDNSを使っているのか、アプリ独自のDoHを使っているのかを確認すると、監視ポイントや制御方法の検討にもつながります。
DNSパケット解析のよくある勘違い
勘違い1:DNSは必ずUDP 53
DNSはTCP 53も使用します。UDPだけを確認すると、一部の通信を見落とす可能性があります。
勘違い2:ResponseがあればDNSは正常
NXDOMAINやSERVFAILなどのエラー応答でもResponseは返ります。RCODEまで確認します。
勘違い3:NOERRORなら必ずIPが返る
NOERRORでも要求したAnswerが0件の場合があります。Answer RRsとレコード内容を確認します。
勘違い4:同じ名前のQueryが複数なら異常
AとAAAA、再送、複数アプリなど、正常な理由でも複数Queryが発生します。TypeとTransaction IDを見ます。
勘違い5:dnsフィルターに出ない=名前解決していない
キャッシュ、DoH、DoT、別インターフェースなどの可能性があります。
勘違い6:DNSが正常ならWebアクセスも正常
DNSは接続先IPを得る段階です。その後のTCP、TLS、HTTP、FW、サーバー障害は別に切り分けます。
理解度チェック
解答を見る前に、パケットからどう判断するか考えてみましょう。
問題1.DNS QueryとResponseを対応付けるとき、まず確認したいフィールドはどれですか。
- TTL
- Transaction ID
- MACアドレスのOUI
- TCP Sequence Number
解答を見る
QueryとResponseで同じTransaction IDを確認すると、要求と応答を対応付けられます。
問題2.Aレコードの問い合わせで確認しようとしているものは何ですか。
- IPv4アドレス
- IPv6アドレス
- MACアドレス
- TCPポート番号
解答を見る
IPv6アドレスはAAAAレコードで確認します。
問題3.DNS ResponseのRCODEがNXDOMAINでした。最も近い意味はどれですか。
- DNSサーバーまで到達できない
- 問い合わせた名前が存在しないという応答
- TCP 53が遮断された
- ARP解決に失敗した
解答を見る
Responseが返っているため、少なくとも問い合わせに対してDNSサーバーから応答は届いています。名前・ゾーン・レコードを確認します。
問題4.Queryは確認できるのにResponseが1つも返りません。次に確認すべき項目を3つ挙げてください。
解答例を見る
- DNSサーバーが稼働しているか
- DNSサーバーまでのルーティング
- ACL/ファイアウォールでUDP/TCP 53が遮断されていないか
- 戻り経路があるか
- DNSサーバーIPが正しいか
問題5.DNSの応答が切り詰められたことを示すフラグはどれですか。
- RD
- RA
- TC
- AA
解答を見る
Truncatedを示します。状況によっては、その後にTCP 53で問い合わせをやり直す通信が見えます。
実践演習:DNS QueryとResponseから障害箇所を判断する
次のパケット一覧は、PC-Aでnslookup app.example.internalを実行したときのものです。
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 101 | 192.168.10.10 | 192.168.10.53 | DNS | Standard query 0x71c2 A app.example.internal |
| 102 | 192.168.10.53 | 192.168.10.10 | DNS | Standard query response 0x71c2 No such name A app.example.internal |
課題1.QueryとResponseが対応している根拠
どの情報から、No.101とNo.102が同じDNS問い合わせの組だと判断できますか。
解答を見る
Transaction IDがどちらも0x71c2で一致していることが主要な根拠です。問い合わせ名とTypeも一致しています。
課題2.ネットワーク断か、DNS応答エラーか
このキャプチャーから「DNSサーバーまで通信できていない」と判断できますか。
解答を見る
判断できません。むしろDNSサーバーからResponseが返っているため、少なくともこのQuery/Responseの往復通信は成立しています。
問題は「応答が返らない」ことではなく、「No such name / NXDOMAINという内容で返っている」ことです。
課題3.次に確認する項目
次にどこを確認しますか。3つ以上挙げてください。
解答例を見る
- app.example.internalという名前が設計どおりか
- 対象DNSゾーンにAレコードが登録されているか
- 社内DNSと外部DNSの参照先が正しいか
- DNS検索サフィックスで意図しない名前になっていないか
- レコード削除・変更直後でないか
課題4.正常応答だった場合に見る場所
同じQueryに対してNOERRORでAレコードが返っていた場合、名前指定の通信が失敗する原因調査をどこへ進めますか。
解答例を見る
DNSによる名前解決が成立しているため、返却されたIPアドレスを宛先とする通信を確認します。
- TCP 3ウェイハンドシェイク
- UDP通信の送受信
- ルーティング
- ACL/ファイアウォール
- TLSハンドシェイク
- サーバーアプリケーションの待ち受け状態
自分の言葉で説明する課題
「名前解決できないとき、Wiresharkでは何を見ればいいですか?」と後輩から質問されました。 Query、Response、Transaction ID、RCODEの4語を使って1分程度で説明してください。
説明例を見る
DNS障害では、まずクライアントからDNS Queryが送信されているか確認します。 次に、そのQueryに対するDNS Responseが返っているかを見ます。 QueryとResponseはTransaction IDを照合すると対応付けできます。 Responseが返っている場合はRCODEを確認し、NOERRORなのか、NXDOMAINやSERVFAILなどのエラーなのかを判断します。 NOERRORならAnswerのIPアドレスやCNAMEまで確認し、DNSが正常ならその後のTCPやアプリケーション通信へ調査を進めます。
まとめ
- DNS通信では、QueryとResponseをセットで確認する
- Transaction IDを使うと、問い合わせと応答を対応付けられる
- Queryでは問い合わせ名とA・AAAAなどのTypeを確認する
- ResponseではRCODE、Answer RRs、返却されたレコードを確認する
- NXDOMAINは名前が存在しないという応答、SERVFAILはサーバーが処理を完了できなかった応答
- DNSはUDP 53だけでなくTCP 53も使用する
- TCビット、EDNS(0)、TCPへの切り替わりをセットで考える
- DNSが見えない場合はキャッシュ、DoH、DoT、キャプチャー対象インターフェースを確認する
- DNSが正常なら、名前解決後のTCP/UDP、FW、ルーティング、サーバーへ調査を進める
パケット解析では「DNSが動いているか」ではなく、「どこまで正常で、どこから期待と違うか」を説明できることが重要です。

コメント