2026年6月6日
2026年6月6日
dig で TTL と NS を一括確認する方法|1回の実行で複数の種別を聞き、全権威サーバーと複数ドメインの値を並べる
dig は1回の実行で複数の問い合わせを並べて書けるうえ、全権威サーバーの SOA をまとめて取る +nssearch や、ルートから委任をたどる +trace も備えています。これらを組み合わせると、TTL と NS の確認を「1ドメインずつ何度も打つ」作業から「数行のコマンドで一覧にする」作業に変えられます。この記事では、表示を絞る基本の形、1ドメインの TTL と NS をまとめて見る方法、親ゾーン側の値の取り方、複数ドメインを一覧にするスクリプトの順に説明します。
表示を答えの行だけに絞る
dig の既定の出力はヘッダーや統計まで含むため、まとめて確認するときは読みにくくなります。+noall +answer を付けると、答えのレコードの行だけが残ります。
dig +noall +answer example.com NS
example.com. 3600 IN NS ns1.example.net.
example.com. 3600 IN NS ns2.example.net.
列は左から名前、TTL(秒)、クラス、種別、値です。TTL を「1h」のような単位付きで見たいときは +ttlunits を加えます。ただし後でスクリプトで数値として扱うなら、秒のままのほうが扱いやすくなります。
毎回同じオプションを付けるのが手間なら、ホームディレクトリの ~/.digrc に +noall +answer と書いておくと既定になります。ただし、ほかの調査で既定の出力が必要なときに戸惑うので、使うかどうかは好みで決めてください。
1回の dig で複数の種別をまとめて聞く
dig は、名前と種別の組を1行に続けて書くと、それぞれを順に問い合わせます。先頭に書いたオプションはすべての問い合わせに効きます。
dig +noall +answer example.com NS example.com SOA www.example.com A
NS・SOA・A の行がまとめて表示されるので、「NS の TTL」「SOA のシリアル」「サイトのアドレスと TTL」を1回で見比べられます。SOA の行は、値の部分に「プライマリのサーバー名、管理者のアドレス、シリアル、更新間隔、再試行間隔、失効時間、否定応答の保持時間」の順で7つの値が並びます。ネームサーバーの変更やレコードの更新が反映されたかを確かめるときは、3番目のシリアルを控えておきます。
ここで表示される TTL は、問い合わせ先によって意味が変わります。手元のキャッシュサーバーに聞いた場合は「キャッシュに残っている時間」で、数秒おいて打ち直すと数字が減っていきます。ゾーンに設定された値そのものを見たいときは、次の節のように権威サーバーへ直接聞きます。
全権威サーバーの状態をまとめて見る
+nssearch で SOA のシリアルを並べる
+nssearch は、そのドメインの NS に書かれたすべての権威サーバー(IPv4 と IPv6 のアドレスごと)に SOA を問い合わせ、1行ずつ並べます。
dig +nssearch example.com
SOA ns1.example.net. hostmaster.example.com. 2026101801 7200 3600 1209600 3600 from server 192.0.2.53 in 11 ms.
SOA ns1.example.net. hostmaster.example.com. 2026101801 7200 3600 1209600 3600 from server 2001:db8::53 in 12 ms.
SOA ns1.example.net. hostmaster.example.com. 2026101700 7200 3600 1209600 3600 from server 198.51.100.53 in 25 ms.
この例では、3行目のサーバーだけシリアルが古いことが一目で分かります。セカンダリへのゾーン転送が止まっている、あるいは DNS 事業者の拠点の一部で更新が遅れている、といった状態を疑います。応答が無いサーバーは行が出ないか、エラーの行になるので、NS の数とアドレスの数に対して行が足りているかも見ます。なお +nssearch が見せるのは SOA だけで、NS レコードの TTL は表示されません。
各権威サーバーに NS の TTL を聞く
NS の TTL は、権威サーバーに再帰なし(+norecurse)で聞いて確かめます。NS の一覧を取り出して、順に問い合わせる形にすると一度に済みます。
for ns in $(dig +short example.com NS); do
echo "== $ns"
dig +norecurse +noall +answer @"$ns" example.com NS
done
権威サーバーの答えなら、TTL は設定値そのものです。サーバーごとに TTL や NS の一覧が違う場合は、ゾーンの転送が遅れているか、複数の DNS 事業者で別々に設定している可能性があります。
親ゾーン側の NS と TTL を見る
ネームサーバーを変更するとき、古い委任がキャッシュに残る時間には、自分のゾーン(子ゾーン)の NS の TTL だけでなく、親ゾーン(.com や .jp などの TLD)に登録された NS の TTL も関わります。親ゾーン側の値は、TLD の権威サーバーに再帰なしで聞くと AUTHORITY セクションに出ます。
# .com の権威サーバーを1台選び、委任の情報を聞く
tld=$(dig +short com NS | head -n 1)
dig +norecurse +noall +authority @"$tld" example.com NS
ここで出る TTL は TLD 側が決めた値で、ドメインの利用者は変えられません。親ゾーン側の NS の一覧が、各権威サーバーが返す NS の一覧と一致しているかも合わせて確認します。親にだけ古いサーバーが残っていればレジストラ(ドメインの登録事業者)での設定、子だけが違えば DNS 事業者のゾーンの設定を見直します。
dig +trace example.com NS でも、ルートから TLD、権威サーバーへと委任をたどりながら各段の NS と TTL が表示されます。どの段で古い値が出てくるかを流れで見たいときは +trace、親と子の値を正確に並べたいときは上のように個別に聞く、と使い分けると読みやすくなります。+trace は手元のキャッシュサーバーを使わずに外へ問い合わせるため、DNS の通信が制限されたネットワークでは途中で止まることがあります。
複数ドメインを一覧にするスクリプト
複数のサイトを運用していると、ドメインごとの NS・TTL・シリアルを一覧で見たくなります。次のスクリプトは、ドメインを1行に1つ書いたファイルを読み、親ゾーン側ではなく子ゾーンの権威サーバー(NS の先頭の1台)に聞いた値を、タブ区切りで出力します。
#!/bin/sh
# 使い方: sh dig-ns-ttl.sh domains.txt > result.tsv
# domains.txt は1行に1ドメイン。# で始まる行と空行は読み飛ばす
printf 'ドメイン\tNSのTTL\tシリアル\tNS一覧\n'
while read -r zone; do
case "$zone" in ''|'#'*) continue ;; esac
ns=$(dig +short "$zone" NS | sort)
first=$(echo "$ns" | head -n 1)
if [ -z "$first" ]; then
printf '%s\t-\t-\tNS が取得できません\n' "$zone"
continue
fi
ttl=$(dig +norecurse +noall +answer @"$first" "$zone" NS | awk '$4 == "NS" {print $2; exit}')
serial=$(dig +norecurse +short @"$first" "$zone" SOA | awk '{print $3}')
printf '%s\t%s\t%s\t%s\n' "$zone" "${ttl:--}" "${serial:--}" "$(echo $ns)"
done < "$1"
$(echo $ns) は、改行区切りの NS の一覧を空白区切りの1行にまとめるための書き方です。結果は表計算ソフトに貼り付けるか、変更の前後で保存して diff で比べると、どのドメインの何が変わったかを見落としにくくなります。
このスクリプトは権威サーバーの1台目だけを見ています。全サーバーのシリアルがそろっているかは、気になったドメインについて +nssearch で追加確認してください。ドメインの一覧ファイルを Windows で作った場合は、改行コードが CRLF だと名前の末尾に余計な文字が付いて問い合わせに失敗するので、LF で保存します。
dig には、問い合わせを書いたファイルを読む -f オプションもあります。ファイルの各行にコマンドラインと同じ形で名前と種別を書けば、まとめて実行できます。シェルの繰り返しを書かずに済む一方、行ごとに結果を整形するのは難しいので、一覧表が欲しいときは上のスクリプト、生の出力をそのまま残したいときは -f、と使い分けます。
読むときの注意
- キャッシュサーバーに聞いた TTL は残り時間なので、設定値より小さいのが普通です。設定値より大きく見えるときは、キャッシュサーバー側で TTL の下限を設けていることがあります。
- 新しく作った名前がなかなか見えないときは、SOA の最後の値と SOA レコード自身の TTL も控えます。「存在しない」という答えがキャッシュされる時間は、この2つのうち短いほうが目安です。
- 権威サーバーに短い間隔で大量に問い合わせると、応答を制限されることがあります。多数のドメインを確かめるときは、スクリプトに
sleepをはさむなど間隔を空けます。 - dig のオプションは BIND の版によって追加や変更があります。ここで使ったものは広く使われているものですが、動かない場合は手元の
man digで確認してください(2026年10月現在)。
まとめ
+noall +answerで答えの行だけに絞り、名前と種別の組を続けて書くと、NS・SOA・A などを1回で見比べられます。+nssearchで全権威サーバーの SOA のシリアルを並べ、NS の TTL は各権威サーバーに+norecurseで聞きます。- 親ゾーン側の NS と TTL は、TLD の権威サーバーに再帰なしで聞いた AUTHORITY セクションで確かめ、流れで見たいときは
+traceを使います。 - 複数ドメインはスクリプトでタブ区切りの一覧にし、変更の前後で比べると差分を見落としにくくなります。