DNSが引けない時の切り分け手順|名前解決トラブルを効率よく調査する方法

名前解決トラブル

DNSが引けない時の切り分け手順

DNSはネットワークやインターネットを利用する上で欠かせない仕組みです。

しかし実際の運用現場では、「Webサイトへ接続できない」「メールが送信できない」「名前解決ができない」といったトラブルが頻繁に発生します。

DNS障害は原因が多岐にわたるため、やみくもに設定を変更するとかえって問題を複雑化させてしまいます。

重要なのは体系的な切り分けです。

本記事では、実務で利用できるDNSトラブルの切り分け手順を順番に解説します。

まず確認するべきこと

DNSが原因と思い込まないことが重要です。

実際には次のようなケースもあります。

  • ネットワーク断
  • ルーティング障害
  • Webサーバ停止
  • ファイアウォール設定ミス
  • DNS設定ミス

まずは本当にDNSが原因なのか確認します。

症状を整理する

最初に症状を整理します。

例えば次のような状況があります。

  • 特定サイトだけ接続できない
  • 全サイト接続できない
  • 一部PCだけ発生する
  • 全利用者で発生する

影響範囲を把握することで原因候補を絞り込めます。

IPアドレスで接続できるか確認する

DNSかどうかを判断する最も簡単な方法です。

例えば対象サーバのIPアドレスが分かっている場合です。

ping 192.168.60.20

またはブラウザで直接アクセスします。

http://192.168.60.20

接続できる場合はDNS障害の可能性が高くなります。

ネットワーク疎通確認

まずネットワークが正常か確認します。

ping 8.8.8.8

応答が無い場合はDNS以前の問題です。

ネットワーク障害を疑います。

デフォルトゲートウェイ確認

Linuxの場合です。

ip route

デフォルトルートが存在するか確認します。

DNSサーバ設定確認

Linuxでは次を確認します。

cat /etc/resolv.conf

例です。
nameserver 192.168.60.10

設定ミスが無いか確認します。

複数DNS設定確認

複数指定されている場合もあります。

nameserver 192.168.60.10
nameserver 8.8.8.8

どちらが応答しているか確認が必要です。

digで確認する

まず最も基本的な確認です。

dig www.example.com

正常ならANSWER SECTIONが表示されます。

DNSサーバを指定して確認する

指定されたDNSサーバへ直接問い合わせます。

dig @192.168.60.10 www.example.com

応答があるか確認します。

タイムアウトの場合

次のような表示になります。

connection timed out

DNSサーバへ到達できない可能性があります。

53番ポート確認

DNSサーバ側で確認します。

$ ss -ltnup | grep :53

UDP53およびTCP53で待受しているか確認します。

namedサービス確認

BINDの場合です。

$ systemctl status named

正常なら以下になります。
active (running)

ログ確認

BINDログを確認します。

$ journalctl -u named

エラーが出ていないか確認します。

設定ファイル確認

named.confの構文確認です。

$ named-checkconf

正常なら何も表示されません。

ゾーンファイル確認

$ named-checkzone example.com  /var/named/example.com.zone

ゾーンファイルの記述ミスを確認できます。

NXDOMAINの場合

dig結果に次が表示される場合です。

status: NXDOMAIN

対象レコードが存在しません。

ホスト名の誤りを確認します。

SERVFAILの場合

内部エラーです。

status: SERVFAIL

ゾーン設定やDNSサーバ内部エラーが考えられます。

REFUSEDの場合

問い合わせが拒否されています。

status: REFUSED

allow-query設定を確認します。

権威DNSへ直接問い合わせる

キャッシュの影響を排除します。

dig @ns1.example.com www.example.com

権威DNSが正常か確認できます。

キャッシュDNSとの比較

比較確認します。

$ dig @8.8.8.8 www.example.com

$ dig @1.1.1.1 www.example.com

結果が異なる場合があります。

DNS変更直後の確認

変更したばかりの場合はTTLを疑います。

www.example.com. 3600 IN A 192.168.60.20

3600秒間は古い情報が残る可能性があります。

セカンダリーDNS確認

権威DNSが複数ある場合です。

$ dig @ns1.example.com SOA example.com

$ dig @ns2.example.com SOA example.com

シリアル番号を比較します。

シリアル番号不一致

例です。


ns1
2026060902

ns2
2026060901

ゾーン転送が失敗している可能性があります。

ファイアウォール確認

DNSサーバ側で確認します。

$ firewall-cmd --list-services

dnsが含まれているか確認します。

SELinux確認

BIND起動失敗時に確認します。

$ getenforce

Enforcingの場合は監査ログも確認します。
$ausearch -m avc

クライアントキャッシュ確認

クライアント側に古い情報が残る場合があります。

Windowsの場合です。


ipconfig /flushdns

DNSキャッシュを削除します。

BINDキャッシュ削除

キャッシュDNSの場合です。

# rndc flush

キャッシュを削除できます。

実務でよくある原因

  1. ゾーンファイル記述ミス
  2. named.conf設定ミス
  3. シリアル番号更新忘れ
  4. ファイアウォール設定忘れ
  5. TTLによる反映遅延
  6. allow-query設定ミス
  7. セカンダリーDNS未同期

切り分けの流れ


IPで接続確認
↓
ネットワーク確認
↓
resolv.conf確認
↓
dig実行
↓
DNSサーバ指定確認
↓
named確認
↓
ログ確認
↓
ゾーン確認

この順番で確認すると効率よく原因を特定できます。

実務で覚えておきたいポイント

  • まずIPアドレスで接続確認する
  • digを利用して切り分ける
  • named-checkconfを活用する
  • named-checkzoneを活用する
  • TTLの影響を考慮する
  • シリアル番号を確認する

まとめ

DNSトラブルは原因が多岐にわたるため、体系的な切り分けが重要です。

まずはネットワークとDNSを切り分け、その後digやnamed-checkconf、named-checkzoneを利用して問題箇所を特定します。

また、TTLやキャッシュ、セカンダリーDNSの同期状態なども考慮する必要があります。

DNS障害対応では、順序立てて確認する習慣を身につけることが迅速な復旧につながります。