2026年6月13日
2026年6月13日
kdig で TTL と NS を一括確認する方法|権威サーバーのアドレスごと・拠点ごとの値まで並べる
kdig で TTL と NS をまとめて確認するには、親ゾーンのサーバーから委任の情報を取り、そこに書かれた各権威サーバーのアドレス(IPv4 と IPv6)へ順に問い合わせる形を、短いスクリプトにするのが近道です。kdig には dig の +nssearch や +trace に当たる機能が見当たらないため、その分を自分で組み立てますが、代わりに +nsid で「どの拠点のサーバーが答えたか」まで並べられます。この記事では、kdig で表示を絞る方法、親と子の値の取り方、アドレスと拠点ごとに一覧にするスクリプト、結果の読み方を説明します。
kdig の準備と表示の絞り方
kdig は Knot DNS に付属する問い合わせツールで、Debian・Ubuntu では knot-dnsutils、RHEL 系では knot-utils(EPEL などの追加リポジトリが必要な場合があります)、Homebrew では knot のパッケージで入ります(2026年10月現在)。kdig -V で版を表示できます。オプションの有無は版によって違うことがあるので、うまく動かないときは手元の man kdig で確かめてください。
書式は dig とよく似ていて、@ で問い合わせ先を、名前の後ろに種別を書きます。既定の出力はヘッダーや統計まで含むため、まとめて確認するときは +noall で表示をいったん消し、必要なセクションだけを戻します。
# 答えの行だけを表示する
kdig +noall +answer example.com NS
# 委任の情報が入る AUTHORITY セクションだけを表示する
kdig +noall +authority @a.gtld-servers.net example.com NS +norecurse
答えの行は、左から名前、TTL(秒)、クラス、種別、値の順です。後でスクリプトから2列目を TTL、4列目を種別として取り出します。
TTL は問い合わせ先で意味が変わる
同じ NS レコードでも、どこに聞いたかで TTL の数字の意味が違います。
- 手元のキャッシュサーバーに聞いた答えの TTL は、キャッシュに残っている時間です。打ち直すと数字が減っていきます。
- 権威サーバーに再帰なし(
+norecurse)で聞いた答えの TTL は、ゾーンに設定された値そのものです。 - 親ゾーン(.com や .jp などの TLD)のサーバーに聞くと、NS は AUTHORITY セクションに入って返ります。この TTL は TLD 側が決めた値で、ドメインの利用者は変えられません。
ネームサーバーを切り替えるとき、古い委任がキャッシュに残る時間には親ゾーン側と子ゾーン側の両方の TTL が関わります。どちらが使われるかはキャッシュサーバーの実装によって違うため、両方を控えて長いほうを目安にします。
アドレスごと・拠点ごとに分けて聞く理由
NS に書かれた1つの名前の裏には、IPv4 と IPv6 の複数のアドレスがあるのが普通です。さらに大手の DNS 事業者は、同じアドレスを世界の複数の拠点で受け持つ方式(エニーキャスト)を使っています。そのため「ns1 に聞いたら新しい値だった」だけでは、別のアドレスや別の拠点も同じ値を返しているとは限りません。
- IPv6 のアドレスだけ古いゾーンを返す
- ある拠点だけ更新が遅れ、その地域の利用者にだけ古い値が見える
といった食い違いは、アドレスを1つずつ指定して聞くと見つけやすくなります。拠点の見分けには、EDNS の NSID というしくみを使います。+nsid を付けて問い合わせると、対応しているサーバーは自分を識別する文字列を応答に含めて返します。
kdig +norecurse +nsid @192.0.2.53 example.com SOA
出力の EDNS の部分に NSID の行が出れば、その文字列が拠点やサーバーの識別子です。内容の書き方は事業者が自由に決めるもので、NSID を返さないサーバーも多くあります。返らない場合は、このあとの一覧で NSID の欄が空になるだけで、TTL とシリアルの比較には影響しません。
親と子の値をアドレスごとに並べるスクリプト
次のスクリプトは、親ゾーンのサーバーから委任の情報(NS とその TTL)を表示し、委任に書かれた各権威サーバーの IPv4・IPv6 のアドレスへ、NS の TTL、SOA のシリアル、NSID を問い合わせてタブ区切りで並べます。
#!/bin/sh
# 使い方: sh kdig-ns-ttl.sh example.com [親ゾーン]
# 例: sh kdig-ns-ttl.sh example.co.jp jp
zone="$1"
parent="${2:-${zone#*.}}"
# 再帰なし・表示を絞った問い合わせ
q() { kdig +norecurse +noall "$@"; }
# 親ゾーンの権威サーバーを1台選ぶ
pns=$(kdig +short "$parent" NS | head -n 1)
if [ -z "$pns" ]; then
echo "親ゾーン $parent の NS が取得できません。第2引数で親ゾーンを指定してください" >&2
exit 1
fi
echo "== 親ゾーン側の委任($pns の AUTHORITY)"
q +authority @"$pns" "$zone" NS
printf '\nNS名\tアドレス\tNSのTTL\tシリアル\tNSID\n'
for ns in $(q +authority @"$pns" "$zone" NS | awk '$4 == "NS" {print $5}' | sort -u); do
for addr in $(kdig +short "$ns" A) $(kdig +short "$ns" AAAA); do
ttl=$(q +answer @"$addr" "$zone" NS | awk '$4 == "NS" {print $2; exit}')
serial=$(q +answer @"$addr" "$zone" SOA | awk '$4 == "SOA" {print $7; exit}')
nsid=$(kdig +norecurse +nsid @"$addr" "$zone" SOA | grep -i 'NSID' | head -n 1)
printf '%s\t%s\t%s\t%s\t%s\n' "$ns" "$addr" "${ttl:-応答なし}" "${serial:-応答なし}" "$nsid"
done
done
親ゾーンを省略すると、ドメイン名の先頭のラベルを外した名前(example.com なら com)を親とみなします。example.co.jp のように、名前の区切りとゾーンの区切りが一致しないドメインでは、第2引数で jp と指定してください。SOA の答えの行では、7列目がシリアルです(名前、TTL、クラス、種別のあとに、プライマリのサーバー名、管理者のアドレス、シリアルと続くため)。
手元の環境に IPv6 の接続が無い場合、IPv6 のアドレスへの問い合わせは時間切れになり「応答なし」と表示されます。これはサーバー側の問題ではないので、IPv6 が使える環境で取り直すか、その行を除いて読みます。親ゾーンと子ゾーンを同じ事業者のサーバーが受け持っている構成などでは、委任の情報が AUTHORITY ではなく ANSWER に入って返ることがあり、その場合はスクリプトの +authority を +answer に変えて試します。
結果の読み方
一覧は次の順に確認します。
- 親ゾーン側の NS の一覧と、一覧の「NS名」の列が想定どおりか。古い事業者のサーバーが親に残っていれば、レジストラ(ドメインの登録事業者)での NS の設定が済んでいないか、反映を待っている段階です。
- シリアルの列がすべて同じか。1つのアドレスだけ古いなら、そのアドレスを受け持つサーバーへの転送が遅れています。同じアドレスでも NSID ごとに違うなら、拠点の一部で更新が遅れている可能性があります。
- NS の TTL の列がそろっているか。サーバーごとに TTL が違うのは、転送の遅れか、複数の事業者で別々に設定しているときによく起こります。
- 「応答なし」の行が無いか。IPv6 の接続の問題を除いても応答が無いアドレスは、委任に書かれているのにそのゾーンを持っていない状態(lame delegation と呼ばれます)や、サーバーの停止を疑います。
1回の結果だけでは、エニーキャストでたまたま近くの拠点に届いた答えしか見えません。拠点ごとの違いが疑わしいときは、別の地域のサーバーや外部の確認サービスからも同じ問い合わせを行い、NSID とシリアルの組み合わせを見比べます。
つまずきやすい点
- 権威サーバーに短い間隔で大量に問い合わせると、応答を制限されることがあります。スクリプトは1ドメインあたり数十回の問い合わせになるため、繰り返し実行するときは間隔を空けます。
- kdig は既定で UDP を使い、応答が切り詰められると TCP で取り直します。経路上で TCP の53番ポートが塞がれていると、大きな応答だけ失敗することがあります。
- 変更の前後でスクリプトの出力をファイルに保存し、
diffで比べると、どのアドレスの何が変わったかを追いやすくなります。 - dig を使い慣れているなら、全権威サーバーのシリアルだけを手早く見るのは dig の
+nssearchのほうが手軽です。アドレスごと・拠点ごとに分けて見たいときに、このスクリプトを使うと役割を分けられます。
まとめ
- kdig では
+noallと+answer・+authorityで表示を絞り、親ゾーンのサーバーと各権威サーバーへ順に問い合わせる形で、TTL と NS の一括確認を組み立てます。 - TTL はキャッシュサーバーなら残り時間、権威サーバーなら設定値、親ゾーンなら TLD 側の値で、意味がそれぞれ違います。
- 権威サーバーは IPv4・IPv6 のアドレスごとに聞き、
+nsidで拠点を見分けると、一部のアドレスや拠点だけの更新遅れを見つけられます。 - 「応答なし」は手元の IPv6 接続の問題か、サーバー側の問題かを切り分けてから判断します。