2026年6月18日

2026年6月18日

drill を使った DNS レコードのデバッグ手順|応答コードとフラグの読み方、SERVFAIL・DNSSEC・TCP の切り分け

drill は ldns ライブラリに付属する DNS の問い合わせツールで、dig とよく似た出力に加えて、ルートからのトレース(-T)や DNSSEC 署名の追跡(-S)を備えています。この記事では「名前が引けない」「一部の環境だけ失敗する」といった症状を、drill の応答コードとフラグを読みながら原因に近づけていく手順を、よくある原因の順に説明します。

導入と基本の形

drill は多くの Linux ディストリビューションや Homebrew でパッケージとして配布されています。パッケージ名はディストリビューションによって異なります(2026年10月現在)。

# Debian / Ubuntu
sudo apt install ldnsutils

# Fedora など(パッケージ名は ldns-utils)
sudo dnf install ldns-utils

# Alpine Linux
sudo apk add drill

# macOS(Homebrew。ldns に drill が含まれる)
brew install ldns

基本の形は「drill 名前 種別 @問い合わせ先」です。問い合わせ先を省くと /etc/resolv.conf に書かれたキャッシュサーバーを使います。

drill www.example.com A
drill www.example.com A @1.1.1.1
drill example.com MX @ns1.example.net

出力のどこを見るか

drill の出力は dig とほぼ同じ構成です。以下は説明用の例で、名前と値は架空です。

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

;; ANSWER SECTION:
www.example.com.	300	IN	A	203.0.113.10

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 18 msec
;; SERVER: 1.1.1.1
;; WHEN: ...
;; MSG SIZE  rcvd: 49

デバッグで最初に見るのは2行目までです。

  • rcode:応答コード。NOERROR(正常)、NXDOMAIN(名前が存在しない)、SERVFAIL(サーバー側で答えを作れなかった)、REFUSED(問い合わせを拒否した)が代表的です。dig では status: と表示される部分です。
  • flags:qr は応答であること、rd は再帰を求めたこと、ra は相手が再帰に対応していること、aa は権威ある答えであること、ad は DNSSEC の検証に成功したとキャッシュサーバーが示していること、tc は応答が切り詰められたことを表します。
  • 各セクションの件数:ANSWER が0件で AUTHORITY に SOA が1件だけ、という形は「名前はあるがその種別のレコードが無い」(NODATA)か、NXDOMAIN のときに見られます。

以下、症状ごとに原因の多い順に確認していきます。

原因1:権威サーバーの設定と、キャッシュの古い答えが食い違っている

一番多いのは、レコードを変更したのに古い値が返る、新しく作った名前が引けない、というケースです。まず権威サーバーとキャッシュサーバーの答えを並べます。

# 権威サーバーの名前を調べる
drill example.com NS

# 権威サーバーに直接聞く(再帰を求めない)
drill -o rd www.example.com A @ns1.example.net

# キャッシュサーバーに聞く
drill www.example.com A @1.1.1.1

-o はヘッダーのビットを操作するオプションで、大文字で立て、小文字で下ろします。-o rd は再帰要求を外す指定です。権威サーバーの応答の flags に aa があり、値が意図どおりなら、権威サーバーは正しく設定されています。キャッシュサーバーだけが古い値を返すなら、ANSWER の TTL(残り秒数)が切れるのを待ちます。新しく作った名前で NXDOMAIN が続く場合は、作成前に問い合わせた「存在しない」という答えがキャッシュされている可能性があります。その保持時間は、AUTHORITY に出る SOA の最後の数値と SOA 自体の TTL の小さいほうが目安です。

権威サーバー自身が古い値や NXDOMAIN を返すなら、待っても直りません。DNS 事業者の管理画面で、レコードの名前(www の有無、サブドメインの綴り)と、編集しているゾーンが今の委任先の事業者のものかを見直します。

原因2:委任の途中が壊れている

権威サーバーのどれかが応答しない、委任先の登録が古い、といった問題は、ルートからたどると見つけやすくなります。

drill -T www.example.com A

-T はルートサーバーから順に問い合わせ、各段の委任と最後の答えを表示します。このとき @サーバー の指定は使われません。途中の段で古い DNS 事業者のネームサーバーが出てくるなら、レジストラ側の NS 変更が済んでいないか反映待ちです。特定のネームサーバーへの問い合わせだけが時間切れになるなら、そのサーバーに drill -o rd ... @そのサーバー で個別に問い合わせ、REFUSED や aa の無い答えが返らないかを確かめます。委任されているのにそのドメインを預かっていないサーバー(lame delegation)は、こうした応答になります。

原因3:DNSSEC の検証に失敗している(SERVFAIL)

キャッシュサーバーが SERVFAIL を返し、権威サーバーに直接聞くと値が返る、という組み合わせは DNSSEC を疑う典型です。検証を行うキャッシュサーバーは、署名の検証に失敗すると答えを返さず SERVFAIL にします。

切り分けには CD(Checking Disabled)ビットを使います。CD を立てると、キャッシュサーバーは検証をせずに答えを返します。

# 通常の問い合わせ
drill www.example.com A @1.1.1.1

# 検証を無効にして問い合わせる
drill -o CD www.example.com A @1.1.1.1

CD 付きでは答えが返り、CD 無しでは SERVFAIL になるなら、原因は DNSSEC の検証失敗とほぼ判断できます。続いて署名の連鎖を追います。

drill -S www.example.com A

-S は、その名前の署名を親ゾーンへ向かってたどり、信頼の起点となる鍵まで検証を試みます。起点の鍵(トラストアンカー)は -k ファイル で指定でき、指定しない場合は既定の場所(Debian 系のマニュアルでは /usr/share/dns/root.key)のファイルが使われます。既定の場所はビルドや配布元によって異なることがあるので、エラーになる場合は手元の man drill で確認してください。

よくある原因は、DNS 事業者を移転した後に親ゾーンの DS レコードを更新していない、鍵の更新途中で古い DS が残っている、署名の有効期限が切れている、のいずれかです。どこで連鎖が切れているかを図で確かめるには DNSViz が分かりやすく、drill の結果と合わせて見ると判断がぶれません。DS の変更はレジストラ側の作業になることが多く、誤ると名前解決が止まるため、変更前に現在の値を控えておきます。

原因4:応答が大きく、UDP で受け取れていない

TXT レコードが多いドメインや DNSSEC の署名付き応答は、サイズが大きくなりがちです。途中の機器が大きな UDP パケットや断片化したパケットを落とす環境では、時間切れや不安定な失敗になります。

# TCP で問い合わせる
drill -t example.com TXT @ns1.example.net

# 切り詰められたら EDNS0 のバッファを広げ、だめなら TCP に切り替える
drill -a example.com TXT @ns1.example.net

# DNSSEC の署名も含めて要求する(DO ビット)
drill -D example.com DNSKEY @ns1.example.net

UDP では失敗して TCP では成功するなら、経路上の機器か、権威サーバー側の TCP 対応・応答サイズの設定に問題があります。権威サーバーが TCP の 53 番ポートを受け付けていない場合も、大きな応答は受け取れません。サーバーを自分で運用しているなら、ファイアウォールで TCP の 53 番も許可されているかを確認します。

原因5:手元のリゾルバー設定が想定と違う

@ を付けたときは正常で、付けないときだけ失敗するなら、手元の設定が原因です。drill は既定で /etc/resolv.conf を読みますが、systemd-resolved を使う環境ではそこに 127.0.0.53 のようなローカルのスタブだけが書かれていることがあります。

# 使われているキャッシュサーバーを確かめる
cat /etc/resolv.conf

# 別の設定ファイルを読ませて比べる
drill -c /run/systemd/resolve/resolv.conf www.example.com A

後者のファイルの場所は systemd-resolved を使う環境での一例です。内部と外部で答えを変える構成(社内 DNS)では、社内のキャッシュサーバーと公開のキャッシュサーバーで答えが違うのが正常な場合もあります。

調べるときの注意

  • 問い合わせは読み取りだけの操作ですが、権威サーバーに短い間隔で大量に送ると応答を制限されることがあります。繰り返し確認するときは間隔を空けます。
  • 他人のドメインやサーバーへの調査は、自分の管理範囲か、許可を得た範囲にとどめます。
  • 設定を直すときは、DNS 事業者の管理画面で変更前のレコードを控え、TTL を短くしてから作業すると、誤りに気付いたときの戻しが早くなります。

まとめ

  • drill の出力では、まず rcode(NOERROR / NXDOMAIN / SERVFAIL / REFUSED)と flags(aa / ad / tc など)を読みます。
  • 権威サーバーへの問い合わせ(-o rd)とキャッシュサーバーへの問い合わせを並べ、設定の誤りかキャッシュの残りかを分けます。
  • 委任の問題は -T でルートからたどり、古いネームサーバーや応答しないサーバーを探します。
  • SERVFAIL は -o CD の有無で比べ、DNSSEC が原因なら -S と DNSViz で連鎖の切れ目を確かめます。
  • UDP だけ失敗するなら -t や -a で TCP と比べ、手元だけ失敗するなら resolv.conf を見直します。

お気軽にご相談ください

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