2026年6月12日
2026年6月12日
kdig を使った DNS レコードの比較確認手順|A と AAAA、apex と www、MX と逆引きなど関連するレコードの整合を確かめる
サーバー移転や DNS の変更のあとに起きるトラブルの多くは、1つのレコードの誤りではなく、「本来そろっているべき別のレコード同士が食い違っている」ことから起きます。kdig でこれを確かめるときは、権威サーバーを指定して関連するレコードを並べ、A と AAAA、ルートドメイン(apex)と www、MX とその先のアドレス、送信元 IP の逆引きと正引き、CAA と証明書の発行元、という組ごとに突き合わせます。この記事では、その組ごとの比較の手順と、地域によって答えを変える構成を EDNS Client Subnet で比べる方法を説明します。
通信方式や権威サーバーの拠点ごとの比較、変更前後のスナップショットの差分は、別の kdig の記事で扱っています。この記事は「レコード同士の整合」に絞っています。
準備:問い合わせ先と表示を揃える
比較の基準にするのは、キャッシュサーバーではなく権威サーバーの値です。キャッシュには古い値が残っていることがあり、整合の確認には向きません。
# 版を確認する
kdig -V
# 権威サーバー名を調べる
kdig example.com NS +short
# 権威サーバーに再帰なしで聞き、値だけを表示する(ns1.example.net は例)
kdig @ns1.example.net example.com A +norecurse +short
+short は値だけを1行ずつ表示します。複数の値を持つレコードは返る順番が変わることがあるので、比べるときは sort で並べ替えます。kdig のオプションは版によって追加や変更があるため、ここでの書き方は執筆時点(2026年10月現在)のマニュアルを基準にしています。
比較1:A と AAAA が同じサーバーを指しているか
移転で一番見落とされやすいのが AAAA です。A レコードだけを新サーバーに書き換え、AAAA を旧サーバーの IPv6 アドレスのまま残すと、IPv6 で接続できる利用者にだけ旧サイトが表示されます。手元が IPv4 だけの環境だと気づきにくく、「一部の人だけ古いページが見える」という報告で発覚します。
kdig @ns1.example.net www.example.com A +norecurse +short
kdig @ns1.example.net www.example.com AAAA +norecurse +short
AAAA の値が、新サーバーの IPv6 アドレスとしてホスティング事業者から案内されたものと一致しているかを確かめます。新サーバーが IPv6 に対応していない場合は、AAAA を削除するのが正しい対応です。
DNS の値が合っていても、そのアドレスで実際にサイトが応答するかは別の問題です。curl で IPv4 と IPv6 を分けて確かめると、両方が同じサーバーにつながっているかが分かります。
curl -4 -sI https://www.example.com/ | head -n 1
curl -6 -sI https://www.example.com/ | head -n 1
比較2:ルートドメインと www
example.com と www.example.com が同じサーバーを指しているか、片方からもう片方へ転送する設計どおりになっているかを確かめます。
kdig @ns1.example.net example.com A +norecurse +short
kdig @ns1.example.net www.example.com A +norecurse +short
www に CNAME を設定している場合、権威サーバーへの再帰なしの問い合わせでは、置き換え先の名前だけが返ることがあります。置き換え先のアドレスは、再帰ありの問い合わせ(@ で公開 DNS を指定するなど)で確かめてください。
ルートドメインには、ゾーンの SOA や NS と同じ名前になるため、通常の CNAME を置けません。DNS 事業者によっては ALIAS や ANAME、CNAME のフラット化と呼ばれる独自の機能で、ルートドメインにも別名のような設定ができます。この場合、権威サーバーは最終的な A や AAAA を返すので、kdig では普通のアドレスとして見えます。
WordPress では、管理画面の「設定」→「一般」にあるサイトのアドレスが、www ありとなしのどちらかに決まっています。DNS で両方がサーバーに届くことを確かめたら、設定していない側からの転送が働くかも合わせて確認します。
比較3:MX と、その先のアドレス
MX にはメールサーバーのホスト名が入り、そのホスト名に A や AAAA があって初めてメールが届きます。MX の値を取り出し、それぞれのアドレスを引きます。
kdig @ns1.example.net example.com MX +norecurse +short
# 出力例: 10 mail.example.com.
kdig mail.example.com A +short
kdig mail.example.com AAAA +short
確認するのは次の点です。
- MX のホスト名にアドレスがあるか。メールサーバーを移したときに、MX の先のホスト名のレコードだけ消してしまう失敗があります。
- MX の先が CNAME になっていないか。MX の値は別名ではなく、アドレスを持つ名前を指すことが仕様で求められています。CNAME を挟むと、相手のメールサーバーによっては扱われないことがあります。
- AAAA がある場合、そのアドレスでもメールサーバーが待ち受けているか。
比較4:送信元 IP の逆引きと正引き
WordPress のサーバーから問い合わせフォームの通知などのメールを直接送る場合、送信元 IP の逆引き(PTR)が設定され、その名前を正引きすると同じ IP に戻ることが、受信側で信頼される条件の1つになります。
# 逆引き
kdig -x 192.0.2.10 +short
# 出力例: host.example.com.
# 逆引きで得た名前を正引きする
kdig host.example.com A +short
正引きの結果に元の IP が含まれていれば一致しています。逆引きの値は IP アドレスの管理者(VPS やホスティングの事業者)が管理しているため、自分の DNS ではなく事業者の管理画面や申請で設定します。外部のメール配信サービスから送っている場合は、この確認はそのサービスの送信元について行うものになります。
同じ考え方で、SPF(ドメインの TXT)に、実際に送信しているサーバーの IP や送信サービスの指定が含まれているかも突き合わせておくと、移転後のメールの不達を防ぎやすくなります。
kdig @ns1.example.net example.com TXT +norecurse +short | grep 'v=spf1'
比較5:CAA と証明書の発行元
CAA レコードを設定している場合、そこに書かれた認証局しか証明書を発行できません。CAA の値と、実際にサイトで使っている証明書の発行元を比べます。
kdig @ns1.example.net example.com CAA +norecurse +short
# 出力例: 0 issue "letsencrypt.org"
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null \
| openssl x509 -noout -issuer
ホスティングを移ったら、新しい事業者が使う認証局が CAA で許可されているかを確かめます。許可されていないと、証明書の発行や更新に失敗します。CAA は、対象の名前に無ければ親の名前(www.example.com なら example.com)の設定が使われるので、ルートドメインの値も見てください。CAA が1件も無い場合は、どの認証局でも発行できる状態です。
比較6:地域によって答えを変える構成を ECS で比べる
CDN や地域別に応答を変える DNS を使っていると、問い合わせ元の地域によって正しい答えが変わります。kdig の +subnet を使うと、EDNS Client Subnet(ECS)で「この範囲のアドレスから問い合わせた」という情報を付けて聞けます。
# 203.0.113.0/24 は文書用の例。実際には確かめたい地域で使われているアドレス範囲を指定する
kdig @ns1.example.net www.example.com A +norecurse +subnet=203.0.113.0/24
kdig @ns1.example.net www.example.com A +norecurse +subnet=198.51.100.0/24
権威サーバーが ECS に対応していれば、指定した範囲ごとに違う答えが返ることがあります。対応していない場合や、地域別の応答をしていない場合は、どの範囲でも同じ答えになります。応答の OPT 疑似セクションに ECS の情報が返っているかで、相手が扱ったかを判断できる場合があります。プライバシーの観点から ECS を送らない公開 DNS もあるので、この比較は権威サーバーに直接行うのが基本です。
まとめて確認するスクリプト
上の比較の一部を、1回の実行で並べて表示する例です。
#!/bin/sh
# 使い方: sh check-pairs.sh example.com
d="$1"
ns=$(kdig "$d" NS +short | sort | head -n 1)
q() { kdig @"$ns" "$1" "$2" +norecurse +short | sort | tr '\n' ' '; }
echo "権威サーバー: $ns"
echo "apex A : $(q "$d" A)"
echo "www A : $(q "www.$d" A)"
echo "apex AAAA : $(q "$d" AAAA)"
echo "www AAAA : $(q "www.$d" AAAA)"
echo "CAA : $(q "$d" CAA)"
for mx in $(kdig @"$ns" "$d" MX +norecurse +short | awk '{print $2}'); do
echo "MX $mx -> A: $(kdig "$mx" A +short | tr '\n' ' ') AAAA: $(kdig "$mx" AAAA +short | tr '\n' ' ')"
done
移転の作業前と作業後に実行し、出力を見比べると、変え忘れたレコードを見つけやすくなります。DNS の設定を変える前には、DNS 事業者の管理画面からゾーンの内容を書き出すなどして、元に戻せる状態にしておいてください。
まとめ
- 関連するレコード同士の整合は、キャッシュではなく権威サーバーの値で、
+norecurse +shortを使って比べます。 - A と AAAA の向き先の食い違いは、IPv6 の利用者だけに旧サイトが見える原因になります。curl の
-4と-6で実際の接続も確かめます。 - ルートドメインと www、MX とその先のアドレス、逆引きと正引き、SPF と実際の送信元を組ごとに突き合わせます。
- CAA を設定しているなら、使っている認証局が許可されているかを証明書の発行元と比べます。
- 地域別の応答は
+subnetで比べられますが、権威サーバーが ECS に対応している場合に限られます。