2026年6月9日

2026年6月9日

host を使った DNS レコードの比較確認手順|権威サーバー同士と公開キャッシュサーバーの答えを並べる

host コマンドでは、問い合わせ先のサーバーを最後の引数に書くだけで切り替えられるため、同じレコードを複数のサーバーに聞いて並べる「比較確認」が短いコマンドでできます。まず host -C で権威サーバー同士の SOA のシリアルをそろっているか確かめ、次に権威サーバーと公開キャッシュサーバーの答えを並べ、違いがあれば TTL を見て原因を判断する、という順で進めます。この記事では、その手順と比較用のスクリプト、食い違いのパターンごとの原因と対処を説明します。

host の基本と比較に使う書式

host は BIND に付属する問い合わせツールで、Debian・Ubuntu では bind9-host や bind9-dnsutils、RHEL 系では bind-utils に含まれます(2026年10月現在)。出力が1行の文章の形で短く、比較に向いています。

# 種別を指定して問い合わせる(問い合わせ先は手元の設定)
host -t MX example.com

# 問い合わせ先を最後の引数で指定する
host -t MX example.com 8.8.8.8

# 権威サーバーを指定する
host -t A www.example.com ns1.example.net

# TTL も見たいときは詳しい表示にする
host -v -t A www.example.com 8.8.8.8

問い合わせ先を指定すると、出力の先頭に Using domain server: から始まる数行が付きます。比較するときはこの部分を取り除き、答えの行だけを並べます。通常の表示には TTL が出ないため、TTL が必要なときは -v を付け、dig と同じ形式の ANSWER SECTION の2列目を読みます。

比べる相手を決める

比較は「何と何を比べるか」で読み方が変わります。この記事では次の2種類を扱います。

  • 権威サーバー同士:ゾーンを持っているサーバーがすべて同じ内容を返しているか。ここが食い違っていると、どのサーバーに当たるかで利用者の見え方が変わります。
  • 権威サーバーとキャッシュサーバー:設定した値が、利用者が使うキャッシュサーバーにどこまで届いているか。違っていても、TTL の範囲内なら待てば解消します。

権威サーバーの答えを基準にし、それと他を比べる、という順番を守ると判断に迷いません。

手順1:権威サーバー同士の SOA を比べる

最初に -C を使います。対象ゾーンの NS をすべて調べ、それぞれに SOA を問い合わせて並べてくれます。

host -C example.com
Nameserver 192.0.2.53:
	example.com has SOA record ns1.example.net. hostmaster.example.com. 2026101801 7200 3600 1209600 300
Nameserver 198.51.100.53:
	example.com has SOA record ns1.example.net. hostmaster.example.com. 2026101801 7200 3600 1209600 300

見るのは SOA の3番目の値、シリアルです。すべてのサーバーで同じなら、ゾーンの内容はそろっていると考えられます。一部だけ古い場合は、そのサーバーへのゾーン転送が止まっているか、遅れています。応答が返らないサーバーがある場合は、委任に書かれているのに動いていないか、そのゾーンを持っていない可能性があります。

なお、DNS 事業者によっては変更のたびにシリアルを更新しない、または独自の方式で管理していることがあります。シリアルがそろっていても念のため、次の手順で個別のレコードも比べます。

手順2:レコードを全サーバーに聞いて並べる

次のスクリプトは、対象ゾーンの権威サーバーと、指定した公開キャッシュサーバーに同じ問い合わせを送り、答えを1行ずつ並べます。答えの並び順はサーバーや問い合わせのたびに変わることがあるため、並べ替えてから表示しています。

#!/bin/sh
# 使い方: sh host-compare.sh ゾーン名 [調べる名前]
# 例: sh host-compare.sh example.com www.example.com
zone="$1"
name="${2:-$1}"
types="A AAAA CNAME MX TXT"

auth=$(host -t NS "$zone" | awk '/name server/ {print $NF}')
servers="$auth 1.1.1.1 8.8.8.8 9.9.9.9"

for t in $types; do
  echo "== $name $t"
  for s in $servers; do
    printf '%-24s ' "$s"
    host -W 3 -t "$t" "$name" "$s" 2>&1 \
      | grep -v -e '^Using domain server' -e '^Name:' -e '^Address:' -e '^Aliases:' -e '^$' \
      | sort | tr '\n' ' '
    echo
  done
done

権威サーバーの行どうしが一致しているか、キャッシュサーバーの行が権威サーバーの行と一致しているかを、上から順に見ていきます。変更の前後で比べたいときは、出力をファイルに保存して diff を使うと、変わった行だけを確認できます。

食い違いのパターンと対処

起こりやすい順に並べます。

キャッシュサーバーだけが古い値を返す

権威サーバーはすべて新しい値なのに、公開キャッシュサーバーの一部が古い値を返す場合です。多くはキャッシュの残り時間によるもので、異常ではありません。host -v -t A 名前 8.8.8.8 で TTL を確かめ、その秒数が過ぎれば新しい値に変わります。次回の変更に備えて、作業の前に TTL を短くしておくと待ち時間を減らせます。

追加したレコードがキャッシュサーバーで「存在しない」になる

追加する前に誰かが問い合わせていると、「存在しない」という答えがキャッシュされます。この時間は、SOA の最後の値と SOA レコードの TTL のうち短いほうで決まります。手順1の出力の最後の値を見て、その時間が過ぎるのを待ちます。

権威サーバーの間で答えが違う

手順1でシリアルが食い違っていれば、ゾーン転送を確認します。自前でプライマリとセカンダリを運用している場合は、転送の許可や通知の設定、セカンダリのログを見ます。DNS 事業者を使っている場合は、変更の反映が数分遅れることもあるため、しばらくおいて再度比べ、解消しなければ事業者に問い合わせます。シリアルが同じなのに内容が違う場合は、手作業で別々に設定したサーバーが混ざっていないかを確認します。

一部の公開キャッシュサーバーだけが失敗する

特定のキャッシュサーバーでだけ SERVFAIL になる場合、DNSSEC の署名の問題が疑われます。検証を行うキャッシュサーバーでのみ失敗するためです。DS の登録状況や署名の状態を、DNSSEC の検証ができるツールで確かめます。

権威サーバーが応答しない、または拒否する

タイムアウトや REFUSED が返るサーバーは、そのゾーンを持っていないか、止まっている可能性があります。レジストラに登録した NS に、移転前の古いサーバーが残っていないかを確認します。

社内と社外で答えが違う

社内のネットワークから手元の設定で問い合わせると、社内向けの DNS サーバーが別の答えを返すことがあります。意図した構成なら問題ありませんが、比較のときは社外のキャッシュサーバーと権威サーバーを明示して問い合わせ、社内の答えと分けて扱います。

比較するときの注意

  • ネットワークによっては、外部の DNS サーバーへの直接の問い合わせが止められています。権威サーバーの行がすべてタイムアウトになる場合は、通信の制限を疑います。
  • -W の秒数を短くしすぎると、遠いサーバーの応答を失敗と見誤ります。結果が不安定なときは秒数を延ばして再度確かめます。
  • 公開キャッシュサーバーは、同じアドレスでも場所によって別の拠点が答えるため、時間をおいて問い合わせると結果が変わることがあります。

まとめ

  • host は問い合わせ先を最後の引数で切り替えられるため、同じレコードを複数のサーバーで比べるのに向いています。
  • まず host -C で権威サーバー同士の SOA のシリアルを比べ、ゾーンの内容がそろっているかを確かめます。
  • 次に権威サーバーと公開キャッシュサーバーの答えを並べ、違いがあれば -v で TTL を見て、待てば解消するものかを判断します。
  • 権威サーバー同士の食い違いや応答しないサーバーは、待っても解消しないため、転送の設定や委任を直します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲