2026年6月11日
2026年6月11日
drill コマンドで比較確認する方法|新旧の DNS 事業者・キャッシュサーバー・通信方式ごとに答えを並べる
drill で比較確認をするときは、まず「何と何を比べるか」を決め、出力から ANSWER セクションのレコードだけを取り出して並べ替え、同じ形にそろえてから比べます。そうすれば、問い合わせの ID や応答時間といった毎回変わる値に惑わされず、本当に違う箇所だけが残ります。この記事では、比較しやすい形に出力を整える方法と、DNS 事業者の移転前に新旧の権威サーバーを全レコードで比べるスクリプト、キャッシュサーバー同士・DNSSEC の有無・UDP と TCP・IPv4 と IPv6 で比べる方法を説明します。
drill の基本の書式と、親ゾーンの委任や各権威サーバーの NS・SOA・TTL を並べる方法は、別の記事「drill で TTL と NS を一括確認する方法」で扱っています。ここでは、NS と SOA に限らず、ゾーン内のレコードの中身を比べることに重点を置きます。
比べる前に決めること
比較の組み合わせによって、違いが出たときの意味が変わります。
- 権威サーバーと権威サーバー(新旧の事業者、プライマリとセカンダリ):設定値そのものの比較です。違いがあれば、どちらかの設定が誤っているか、反映が遅れています。
- キャッシュサーバーとキャッシュサーバー:利用者の見え方の比較です。違いの多くはキャッシュの残り時間や、地域ごとに答えを変える CDN によるもので、誤りとは限りません。
- 同じサーバーへの聞き方の違い(DNSSEC の有無、UDP と TCP、IPv4 と IPv6):経路や機能の問題の切り分けです。
権威サーバーの答えとキャッシュサーバーの答えを直接比べるのは避けます。キャッシュサーバーは CNAME の先まで解決して答えますが、権威サーバーは自分のゾーンに無い名前の先までは答えないため、正常でも差が出るからです。
比べやすい形に出力を整える
drill の出力には、ヘッダー、各セクションの見出し、応答時間、問い合わせ先などの行が含まれます。比較に使うのは ANSWER セクションのレコードだけなので、次の関数で取り出します。
# 使い方: rrs サーバー 名前 種別
# ANSWER セクションのレコードを取り出し、TTL の列を消して並べ替える
rrs() {
drill @"$1" "$2" "$3" \
| awk '/^;; ANSWER SECTION:/ {f=1; next} /^;;/ {f=0} f && NF' \
| awk '{ $2 = ""; print }' \
| sort
}
TTL の列(2列目)を消しているのは、キャッシュサーバーでは残り時間が刻々と変わるためと、移転の準備で新しい事業者側だけ TTL を短くしている、といった意図的な差を無視するためです。TTL も比べたいときは、2つ目の awk を外します。
並べ替えを入れているのは、複数のレコードがある場合に、サーバーが返す順番が毎回変わることがあるためです。順番の違いは内容の違いではありません。
なお、TXT レコードの値に連続した空白がある場合、awk で列を組み直すと空白が1つにまとまります。SPF などの比較では影響しませんが、空白そのものを確かめたい場合は元の出力を見ます。
新旧の DNS 事業者を移転前に比べる
DNS 事業者を移すときは、ネームサーバーを切り替える前に、移転先の事業者の権威サーバーへ直接問い合わせ、移転元と同じ答えが返ることを確かめておきます。多くの事業者は、ゾーンを作成した時点で、委任が切り替わる前でも自社の権威サーバーで答えを返します(扱いは事業者ごとに異なります)。
ゾーンの全レコードを一括で取り出すゾーン転送(AXFR)は、一般には許可されていません。そこで、移転元の管理画面から書き出したゾーンの内容などをもとに、確かめたい名前と種別の一覧を用意します。
# names.txt(名前 種別)
example.com A
example.com MX
example.com TXT
www.example.com A
www.example.com AAAA
mail.example.com A
_dmarc.example.com TXT
selector1._domainkey.example.com TXT
次のスクリプトで、一覧のすべてを両方の権威サーバーに問い合わせて比べます。
#!/bin/sh
# 使い方: sh drill-compare.sh names.txt 移転元の権威サーバー 移転先の権威サーバー
# 例: sh drill-compare.sh names.txt ns1.old-dns.example ns1.new-dns.example
list="$1"; old="$2"; new="$3"
rrs() {
drill @"$1" "$2" "$3" \
| awk '/^;; ANSWER SECTION:/ {f=1; next} /^;;/ {f=0} f && NF' \
| awk '{ $2 = ""; print }' \
| sort
}
while read -r name type; do
case "$name" in ''|\#*) continue ;; esac
a=$(rrs "$old" "$name" "$type")
b=$(rrs "$new" "$name" "$type")
if [ "$a" = "$b" ]; then
echo "OK $name $type"
else
echo "DIFF $name $type"
echo " old: $a"
echo " new: $b"
fi
done < "$list"
DIFF の行が出たら、次の順に確認します。
- 新しい側が空:移転先にレコードを作り忘れています。メールの認証に使う TXT(SPF・DKIM・DMARC)や、各種サービスの所有確認用の TXT は漏れやすいので注意します。
- 値の一部が違う:入力の誤り(末尾のドットの有無による名前のずれ、MX の優先度、TXT の引用符の扱い)を疑います。
- 想定どおりの違い:ゾーンの頂点の NS と SOA は事業者ごとに異なるのが普通です。また、事業者独自の機能(頂点での CNAME の代わりになる機能など)を使ったレコードは、返るアドレスが地域や時刻で変わることがあります。
DNSSEC を使っている場合、署名(RRSIG)や鍵は事業者ごとに別のものになるので、この比較には含めません。比べるのは、署名を付けない通常の問い合わせの答えです。
キャッシュサーバー同士を比べる
ネームサーバーやレコードを変更したあと、利用者側で切り替わりが進んでいるかを見るには、主な公開 DNS の答えを並べます。
for r in 1.1.1.1 8.8.8.8 9.9.9.9; do
echo "== $r"
drill @"$r" www.example.com A | awk '/^;; ANSWER SECTION:/ {f=1; next} /^;;/ {f=0} f && NF'
done
ここでは TTL を残しておくと便利です。キャッシュサーバーの TTL は残り時間なので、古い値を返しているサーバーがあっても、その秒数が過ぎれば切り替わると見込めます。公開 DNS は多くの拠点で動いているため、同じアドレスに聞いても、拠点によって答えが違うことがあります。
DNSSEC の有無で比べる
キャッシュサーバーから SERVFAIL が返るときは、DNSSEC の検証の失敗かどうかを切り分けます。
# 通常の問い合わせ
drill @1.1.1.1 www.example.com A
# 検証を止めるよう求める(CD ビットを立てる)
drill -o CD @1.1.1.1 www.example.com A
# 署名も一緒に受け取る(DO ビットを立てる)
drill -D @1.1.1.1 www.example.com A
-o はヘッダーのビットを操作する指定で、大文字で立て、小文字で下ろします。通常の問い合わせでは SERVFAIL なのに、-o CD では答えが返る場合、名前解決の経路ではなく署名の検証で失敗しています。その場合は、DS と鍵の対応や署名の期限を、DNSViz や delv で詳しく調べます。
UDP と TCP、IPv4 と IPv6 で比べる
同じ権威サーバーに、通信方式を変えて問い合わせると、ネットワーク側の問題を見つけられます。
# UDP(既定)と TCP
drill @ns1.example.net example.com DNSKEY
drill -t @ns1.example.net example.com DNSKEY
# IPv4 と IPv6
drill -4 @ns1.example.net example.com SOA
drill -6 @ns1.example.net example.com SOA
UDP では答えが返るのに TCP では時間切れになる場合、権威サーバーの前のファイアウォールで TCP の 53 番が閉じられている可能性があります。DNSSEC の鍵や署名を含む大きな応答は TCP で取り直されることが多いため、この状態では一部の利用者で名前解決が失敗します。IPv6 だけで応答が無い場合は、ネームサーバーの AAAA が古いアドレスを指していないか、IPv6 側の経路やフィルタを確認します。手元の環境が IPv6 で外に出られない場合は、IPv6 が使える別のサーバーから試します。
比較の結果を残す
作業の前後で同じ比較を実行し、結果をファイルに保存しておくと、あとから変化を追えます。
sh drill-compare.sh names.txt ns1.old-dns.example ns1.new-dns.example > compare-$(date +%Y%m%d-%H%M).txt
ネームサーバーを切り替えたあとは、移転元の権威サーバーがゾーンを返さなくなる(REFUSED など)ことがあります。比較は切り替えの前に済ませ、移転元の契約やゾーンは、切り替え後もキャッシュが入れ替わるまでの間は残しておくと安全です。
つまずきやすい点
@にホスト名を書くと、drill は手元のキャッシュサーバーでそのアドレスを引いてから問い合わせます。名前解決そのものが怪しいときは、@192.0.2.53のようにアドレスで指定します。- ゾーンにワイルドカードのレコード(
*.example.comなど)があると、一覧に書いた名前が実在しなくても答えが返ります。新旧で答えがそろっていても、意図したレコードかどうかは名前の一覧の側で確かめます。 - 大量の名前を短い間隔で問い合わせると、事業者によっては制限がかかることがあります。一覧が長い場合は、ループの中で少し待つ処理を入れます。
- drill のオプションは ldns の版によって差があります。導入済みの版は
drill -vで確かめ、オプションの意味はマニュアル(man drill)で確認してください(2026年10月現在)。
まとめ
- 比較は「権威同士」「キャッシュ同士」「聞き方の違い」に分け、権威とキャッシュを直接比べないようにします。
- ANSWER セクションだけを取り出し、TTL の列を消して並べ替えると、本当に違う箇所だけが残ります。
- DNS 事業者の移転では、切り替え前に名前と種別の一覧で新旧の権威サーバーを比べ、TXT などの作り忘れを見つけます。
SERVFAILは-o CDとの比較で DNSSEC の失敗かを切り分け、-t・-4・-6で通信方式ごとの問題を探します。- 比較の結果は日時付きで保存し、移転元のゾーンはキャッシュが入れ替わるまで残しておきます。