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 に変えて試します。

結果の読み方

一覧は次の順に確認します。

  1. 親ゾーン側の NS の一覧と、一覧の「NS名」の列が想定どおりか。古い事業者のサーバーが親に残っていれば、レジストラ(ドメインの登録事業者)での NS の設定が済んでいないか、反映を待っている段階です。
  2. シリアルの列がすべて同じか。1つのアドレスだけ古いなら、そのアドレスを受け持つサーバーへの転送が遅れています。同じアドレスでも NSID ごとに違うなら、拠点の一部で更新が遅れている可能性があります。
  3. NS の TTL の列がそろっているか。サーバーごとに TTL が違うのは、転送の遅れか、複数の事業者で別々に設定しているときによく起こります。
  4. 「応答なし」の行が無いか。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 接続の問題か、サーバー側の問題かを切り分けてから判断します。

お気軽にご相談ください

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