2026年6月17日

2026年6月17日

drill で TTL と NS を一括確認する方法|親ゾーンの委任と各権威サーバーの値を並べて見る

drill を使うと、親ゾーン(.com などの TLD)に登録された NS と、各権威サーバーが返す NS・SOA・TTL を、短いシェルスクリプトでまとめて並べられます。ネームサーバーの変更前後に「どこに何が残っているか」を一度に確かめられるのが利点です。この記事では、drill の基本の書式、出力から TTL と NS を読み取る方法、親と子の値をまとめて比べるスクリプト、結果の読み方を順に説明します。

drill とは

drill は、NLnet Labs が開発している DNS ライブラリ ldns に付属する問い合わせツールです。書式や出力は dig とよく似ていますが、BIND を入れていない環境(Unbound や NSD を使っているサーバーなど)にも入れやすく、DNSSEC の署名をたどる機能も持っています。

導入はパッケージで行えます。パッケージ名はディストリビューションによって異なり、Debian・Ubuntu では ldnsutils、Fedora などでは ldns-utils、macOS の Homebrew では ldns が一般的です(2026年10月現在)。RHEL 系では追加のリポジトリが必要な場合があります。入ったかどうかは drill -v で版を表示して確かめます。

基本の書式と出力の見方

書式は「drill [オプション] 名前 [種別]」です。問い合わせ先を指定するときは dig と同じく @ を付けます。種別を省くと A レコードを問い合わせます。

# 手元のキャッシュサーバー(/etc/resolv.conf の設定)に NS を問い合わせる
drill example.com NS

# 問い合わせ先を指定する
drill @1.1.1.1 example.com NS

# 権威サーバーに直接 SOA を問い合わせる
drill @ns1.example.net example.com SOA

# ルートから委任をたどる
drill -T example.com NS

出力はおおむね次の形です(値は例です)。

;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 40213
;; flags: qr aa rd ; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; example.com.	IN	NS

;; ANSWER SECTION:
example.com.	3600	IN	NS	ns1.example.net.
example.com.	3600	IN	NS	ns2.example.net.

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 12 msec
;; SERVER: 192.0.2.53

読むところは3つです。1つ目は rcode で、NOERROR なら正常、NXDOMAIN は名前が存在しない、SERVFAIL は問い合わせ先が答えを作れなかったことを表します。2つ目は flags で、aa があれば権威サーバー自身の答え、無ければキャッシュサーバーの答えか、親ゾーンからの委任(紹介)です。3つ目が各レコードの2列目の数字で、これが TTL(秒)です。

dig の +short にあたる簡略表示は無いため、必要な行だけを取り出すときは、後で示すように awk でセクションを切り出します。

TTL は「どこに聞いたか」で意味が変わる

同じ NS レコードでも、問い合わせ先によって表示される TTL の意味が違います。ここを取り違えると、待ち時間の見積もりを誤ります。

  • 権威サーバーに直接聞いた答え(aa あり)の TTL は、ゾーンに設定された値そのものです。
  • キャッシュサーバーの答え(aa なし)の TTL は、キャッシュに残っている時間です。数秒おいて2回問い合わせると値が減っていくことで見分けられます。
  • 親ゾーンのサーバーに聞いた答えは、ANSWER ではなく AUTHORITY セクションに NS が入り、aa は付きません。この TTL は TLD 側が決めた値で、ドメインの利用者は変更できません。

ネームサーバーを変えるとき、古い委任がキャッシュサーバーに残る時間には、親ゾーン側の NS の TTL と、子ゾーン(自分のゾーン)側の NS の TTL の両方が関わります。どちらが使われるかはキャッシュサーバーの実装によって異なるため、両方の値を控えておき、長いほうを目安にします。子ゾーン側の TTL は自分で下げられるので、変更の数日前に短くしておくと切り替えが早く進みます。

親と子の値をまとめて確認するスクリプト

次のスクリプトは、親ゾーンのサーバーから委任の情報を取り、そこに書かれた各権威サーバーへ NS と SOA を問い合わせて並べます。drill の出力からセクションごとに行を取り出す小さな関数を使っています。

#!/bin/sh
# 使い方: sh drill-ns-ttl.sh example.com [親ゾーン]
# 例: sh drill-ns-ttl.sh example.co.jp jp
zone="$1"
parent="${2:-${zone#*.}}"

# 指定したセクション(ANSWER / AUTHORITY)の行だけを取り出す
sec() {
  awk -v s=";; $1 SECTION:" 'index($0, s) == 1 {f=1; next} /^;;/ {f=0} f && NF'
}

# 親ゾーンの権威サーバーを1台選ぶ
pns=$(drill "$parent" NS | sec ANSWER | awk '$4 == "NS" {print $5; exit}')
if [ -z "$pns" ]; then
  echo "親ゾーン $parent の NS が取得できません。第2引数で親ゾーンを指定してください" >&2
  exit 1
fi

echo "== 親ゾーン側の委任($pns の AUTHORITY)"
drill @"$pns" "$zone" NS | sec AUTHORITY

for ns in $(drill @"$pns" "$zone" NS | sec AUTHORITY | awk '$4 == "NS" {print $5}'); do
  echo "== 子ゾーン側($ns)"
  drill @"$ns" "$zone" NS  | sec ANSWER
  drill @"$ns" "$zone" SOA | sec ANSWER
done

echo "== 手元のキャッシュサーバーの見え方"
drill "$zone" NS | sec ANSWER

親ゾーンを省略すると、ドメイン名の先頭のラベルを外した名前(example.com なら com)を親とみなします。example.co.jp のように、ドメイン名の区切りとゾーンの区切りが一致しないものは、第2引数で jp のように親ゾーンを指定してください。

権威サーバーに問い合わせるとき、drill は再帰要求のフラグ(RD)を付けたまま送りますが、権威サーバーは自分のゾーンについては通常どおり答えるため、結果の読み取りには影響しません。

結果の読み方

スクリプトの出力では、次の順に確認します。

  1. 親ゾーン側の NS の一覧と、各権威サーバーが返す NS の一覧が一致しているか。親だけに古いサーバーが残っている場合はレジストラ(ドメインの登録事業者)での設定、子だけが違う場合は DNS 事業者側のゾーンの設定を見直します。
  2. 各権威サーバーの SOA のシリアル(SOA の3番目の値)がそろっているか。そろっていない場合、セカンダリへのゾーン転送が止まっている可能性があります。
  3. 各権威サーバーの NS の TTL が同じか。サーバーごとに TTL が違うのは、転送が遅れているか、手作業で別々に設定しているときによく起こります。
  4. 応答が返らない権威サーバーが無いか。タイムアウトや REFUSED が出るサーバーは、委任に書かれているのにそのゾーンを持っていない状態(lame delegation と呼ばれます)の疑いがあります。

新しく追加したレコードがなかなか見えないときは、SOA の最後の値と、SOA レコード自身の TTL も確認します。「存在しない」という答えがキャッシュされる時間(ネガティブキャッシュ)は、この2つのうち短いほうで決まります。

つまずきやすい点

  • drill -T は手元のキャッシュサーバーを使わずにルートから委任をたどるため、外向きの DNS 通信が制限されたネットワークでは途中で止まります。その場合はスクリプトのように親ゾーンのサーバーを直接指定する方法を使います。
  • 親ゾーンのサーバーが返す ADDITIONAL セクションには、ネームサーバーのアドレス(グルー)が入ることがあります。ネームサーバー名が自分のドメインの中にある場合、このグルーのアドレスが古いままだと、委任先が正しくても名前解決に失敗します。
  • キャッシュサーバーの TTL は「残り時間」なので、親や子に設定された値より小さく表示されるのが普通です。設定値より大きく見えるときは、キャッシュサーバー側で TTL の下限を設けている可能性があります。
  • 確認結果を残すときは、変更の前後でスクリプトの出力をファイルに保存して diff で比べると、どこが変わったかを見落としにくくなります。

まとめ

  • drill は dig と似た書式の問い合わせツールで、@サーバー 名前 種別 で問い合わせ先と種別を指定します。
  • aa フラグの有無で、権威サーバーの答えか、キャッシュや委任の情報かを見分けます。TTL の意味はそれぞれ違います。
  • 親ゾーンの AUTHORITY と各権威サーバーの ANSWER をスクリプトで並べると、NS・TTL・SOA シリアルの食い違いを一度に点検できます。
  • 待ち時間は親ゾーン側と子ゾーン側の NS の TTL のうち長いほうを目安にし、子ゾーン側は変更前に短くしておきます。

お気軽にご相談ください

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