2026年6月11日
2026年6月11日
kdig と nslookup の違いと使い分け|同じ障害がそれぞれでどう表示されるかと、WordPress サーバーでの調べ分け
kdig と nslookup の違いがいちばんはっきり出るのは、名前解決がうまくいかないときです。nslookup は「見つからない」「サーバーが失敗した」といった要約を短く表示し、kdig は応答コード・フラグ・件数をそのまま表示します。要約で足りる場面では nslookup が手軽ですが、「名前が無いのか、種別が無いのか」「DNSSEC の検証で落ちたのか」を区別したいときは kdig が向いています。この記事では、代表的な障害が2つのツールでそれぞれどう見えるかを並べ、WordPress を動かす Linux サーバーで名前解決を調べるときの使い分けを説明します。
ツールの入手方法や基本的な書式の対応は別の記事で扱っているので、ここでは「障害時の見え方の違い」と「調べ分けの手順」に絞ります。
前提:2つの nslookup と kdig
nslookup には、Windows に標準で入っているものと、Linux・macOS で BIND に付属するもの(Debian・Ubuntu では bind9-dnsutils、RHEL 系では bind-utils)があり、表示が異なります。以下では両方の表示を挙げます。Windows 版の表示は、OS の表示言語が日本語なら一部が日本語になります。
kdig は Knot DNS に付属するツールで、Linux では knot-dnsutils(Debian・Ubuntu)などのパッケージで入ります(2026年10月現在)。出力の形は dig に近く、ヘッダーの status に応答コード、Flags の行にフラグと各セクションの件数が出ます。
障害ごとの見え方
名前が存在しない(NXDOMAIN)
- Windows 版 nslookup:
*** ... can't find nosuch.example.com: Non-existent domainの形で表示されます(日本語表示では「見つけられません」の文になります)。 - BIND 版 nslookup:
** server can't find nosuch.example.com: NXDOMAINと表示されます。 - kdig:ヘッダーに
status: NXDOMAINと出て、AUTHORITY に SOA が1件付きます。
この段階では3つとも分かりやすく、差はほとんどありません。サブドメインの綴りや、DNS 事業者の管理画面のホスト名の欄を見直します。
名前はあるが、その種別のレコードが無い(NODATA)
ここで差が出ます。
- Windows 版 nslookup:エラーにならず、SOA の情報(
primary name serverなど)だけが表示されることがあります。慣れないと「何か返ってきたので正常」と読み違えます。 - BIND 版 nslookup:
*** Can't find example.com: No answerと表示されます。 - kdig:
status: NOERRORで、ANSWER: 0になります。
「MX を登録したはずなのに届かない」「AAAA を消したはずなのに残っている」といった確認では、NXDOMAIN と NODATA の違いが手がかりになります。kdig なら、応答コードと件数の組み合わせで機械的に判断できます。
問い合わせ先が失敗した(SERVFAIL)
- Windows 版 nslookup:
Server failedと表示されます。 - BIND 版 nslookup:
** server can't find ...: SERVFAILと表示されます。 - kdig:
status: SERVFAILと表示されます。
SERVFAIL の原因で多いのは、権威サーバーに届かないことと、DNSSEC の検証の失敗です。nslookup では両者を見分けられませんが、kdig では検証を外す +cdflag を付けて問い合わせ直せます。
# 検証ありで SERVFAIL、検証なしで値が返るなら DNSSEC の問題
kdig @1.1.1.1 www.example.com A
kdig @1.1.1.1 www.example.com A +cdflag
2つ目で値が返るなら、親ゾーンの DS とゾーンの鍵が合っていない可能性が高いと判断できます。DNS 事業者を移転した直後に起こりやすい症状です。
問い合わせを断られた(REFUSED)
- Windows 版 nslookup:
Query refusedと表示されます。 - BIND 版 nslookup:
REFUSEDを含む行が表示されます。 - kdig:
status: REFUSEDと表示されます。
権威サーバーに、そのサーバーが担当していない名前を聞いた場合や、外部からの再帰問い合わせを許可していないキャッシュサーバーに聞いた場合に起こります。問い合わせ先の選び方を見直します。
応答が返らない(タイムアウト)
- Windows 版 nslookup:
DNS request timed out.の行が繰り返し表示されます。 - BIND 版 nslookup:
connection timed out; no servers could be reachedと表示されます。 - kdig:
;; WARNINGや;; ERRORで始まる行が出て、ヘッダーは表示されません。
DNS の設定ではなく通信の問題です。kdig では +tcp で TCP に切り替えて結果が変わるかを見ると、UDP だけが止められているかを切り分けられます。nslookup でも -vc で TCP を使えますが、版によって挙動が違うため、詳しく調べるなら kdig のほうが確かめやすくなります。
WordPress サーバーでの調べ分け
WordPress の管理画面の「サイトヘルス」で外部への通信の失敗が報告される、更新やプラグインのダウンロードが cURL error 6(名前解決の失敗)で止まる、といったときの調べ方です。
手順1:PHP と同じ経路で引けるかを確かめる
PHP の通信は、OS の名前解決の仕組み(/etc/hosts と /etc/resolv.conf など)を使います。一方、nslookup と kdig は DNS サーバーに直接問い合わせ、/etc/hosts を参照しません。まず OS と同じ経路の結果を見ます。
# OS の名前解決の仕組みを通して引く
getent ahosts api.wordpress.org
ここで失敗し、次の手順の kdig では引けるなら、/etc/hosts の誤った記述や、/etc/resolv.conf の問い合わせ先の誤りを疑います。Docker などのコンテナで WordPress を動かしている場合は、コンテナの中で同じコマンドを実行します。コンテナには独自の resolv.conf があるためです。
手順2:設定された DNS サーバーに kdig で聞く
# resolv.conf に書かれたサーバー(例:192.0.2.53)に直接聞く
kdig @192.0.2.53 api.wordpress.org A
# 公開 DNS と比べる
kdig @1.1.1.1 api.wordpress.org A
設定されたサーバーだけが SERVFAIL やタイムアウトになるなら、そのサーバーの不調か、サーバーから外への通信の制限が原因です。ホスティング事業者の DNS を使っている場合は、事業者に状況を問い合わせます。
手順3:定期的な確認は kdig で状態を読む
障害が断続的に起こる場合は、応答コードを記録して傾向を見ます。kdig の出力から status の値を取り出す例です。
# 応答コードだけを取り出して日時と一緒に記録する
st=$(kdig @192.0.2.53 api.wordpress.org A \
| awk -F'status: ' '/status:/ {split($2, a, ";"); print a[1]; exit}')
echo "$(date '+%F %T') ${st:-NO_RESPONSE}" >> dns-check.log
コマンドの終了コードは、ツールや版によって「応答を受け取れたか」と「答えが得られたか」のどちらを表すかが違います。スクリプトでは終了コードに頼らず、このように応答コードそのものを読むほうが判断がぶれません。
使い分けのまとめ方
- Windows の PC から、利用者と同じ状態で引けるかをすぐに確かめたい:nslookup
- NXDOMAIN と NODATA を区別したい、DNSSEC の失敗かどうかを見分けたい:kdig
- UDP と TCP の違い、暗号化 DNS の経路を確かめたい:kdig
- WordPress サーバーで PHP の名前解決の失敗を調べたい:まず
getent、次に kdig
まとめ
- NXDOMAIN は両者とも分かりやすく表示されますが、NODATA は Windows 版 nslookup では SOA だけが出て読み違えやすく、kdig なら
NOERRORとANSWER: 0で判断できます。 - SERVFAIL は nslookup では原因を見分けられません。kdig の
+cdflagで DNSSEC の検証の失敗かどうかを切り分けます。 - タイムアウトは通信の問題で、kdig の
+tcpで UDP だけの遮断かを確かめます。 - WordPress サーバーでは、nslookup と kdig が
/etc/hostsを使わない点に注意し、まずgetent ahostsで PHP と同じ経路を確かめてから kdig で DNS サーバーを調べます。