名前解決においてどの経路でDNS情報を取得しているかを確認する手順

Linuxのdigコマンドを使用して、名前解決がどのネームサーバを経由して行われているかを確認するコマンドを記録しておきます。DNS情報を変更したのに、変更した情報が引けない、設定した内容と異なる応答があるなど、具体的にどこのDNSサーバと通信しているかを見える化します。

digコマンドの実行例

まずは結論から、ずばり以下のコマンドとオプションを実行します。

# dig @ネームサーバ  調査するドメイン名 +trace +noall

具体例として、googleのネームサーバ(8.8.8.8)に対して、blog.dassyi.com がどのように名前解決されているかを確認するには、以下のように入力します。

# dig @8.8.8.8 blog.dassyi.com +trace +noall
;; Received 525 bytes from 8.8.8.8#53(8.8.8.8) in 0 ms
;; Received 1175 bytes from 192.58.128.30#53(j.root-servers.net) in 8 ms
;; Received 656 bytes from 192.33.14.30#53(b.gtld-servers.net) in 9 ms
;; Received 49 bytes from 157.112.145.146#53(ns1.wpx.ne.jp) in 15 ms

ここで、オプションの詳細を説明します。+traceオプションは、キャッシュを使用せず、ルートサーバから順に名前解決するオプションになります。+noallオプションは、出力を非表示にするオプションで、これを付与することでたくさんの情報を出力することを制御しています。(見やすくしています)

これより、googleのネームサーバ(8.8.8.8)に問い合わせをして、
j.root-servers.net のルートサーバに問い合わせをして、
b.gtld-servers.net のgtld(ジェネリックトップレベルドメイン)サーバに問い合わせをして、
ns1.wpx.ne.jp のエックスサーバ社のネームサーバに問い合わせしていることがわかります。

例えば、DNSサーバの切り替えをした際に、新旧どちらのサーバに問い合わせをしているかを確認する場合などに使えます。

<2024年9月18日追記>
以前は上記コマンドでtraceが効きましたが、先日同じコマンドを実行すると、上記のような結果が表示されなくなっていました。ググって調査したところ、どうもバージョンアップで動きが変わったようです。(dnssecが関係している?)googleのネームサーバ(8.8.8.8)では想定した結果が得られなくなりましたが、1.1.1.1 に対して、同じコマンドを実行すると、以前と同じ結果が得られます。

遠隔からbindのバージョンを調べることも可能

digコマンドで、対象のネームサーバのバージョンを調べることが可能です。具体的には以下のコマンドを実施することで、バージョンが分かります。

 $dig @DNSサーバのIPアドレス chaos txt version.bind

ただし、bindの設定(named.conf)でversion unknown にしていれば、バージョンは表示されません。実運用しているbindのqueryログを確認していて、この手のアクセスが実際にありました。バージョンをさらけ出さない設定を実施しておくことの重要さを改めて認識しました。

補足

digコマンドがインストールされていない場合は、dnf install bind-utils でインストールしておきましょう!

また、DNSサーバ(bind)を実際に構築してみたい場合や、安全に運用するためのノウハウについては下記のリンク先を参照ください。今回ご紹介したdigコマンドと一緒にご確認いただくと理解も深まると思います。

bindでコンテンツ兼キャッシュDNSサーバを内部と外部向けに1台で共存して構築する方法(前編)

bindでコンテンツ兼キャッシュDNSサーバを内部と外部向けに1台で共存して構築する方法(後編)

bindサーバを安全に運用するためのノウハウ集

今回は、ここまでです。最後までご覧いただきありがとうございました。