dig
コマンドの基本的な使い方をドメインの名前解決しながら解説していきます。
フルサービスリゾルバのようにルートの権威サーバーからたどっていき、特定のドメインのIPアドレス(IPv4, Aレコード)を突き止めたいと思います。
ドメインの名前解決の流れ
ドメインの名前解決をするときの流れを簡単におさらい。
以下の図はJPRS用語辞典|スタブリゾルバー(DNSクライアント) より引用したものです。

PCのブラウザのURLバーに入力したら
- ブラウザは端末内のスタブリゾルバーを呼び出す
- スタブリゾルバーはフルサービスリゾルバに「私の代わりにhoge.jpのIPアドレスを教えてください」と依頼する(名前解決要求)
- フルサービスリゾルバはルートの権威サーバから順に問い合わせていき、目的のドメインのIPアドレスを得る
- フルサービスリゾルバからスタブリゾルバーに「hoge.jpのIPアドレスはxxx.xxx.xxx.xxxです」と返す
- スタブリゾルバーはブラウザにIPアドレスを返す
- ブラウザが目的のWEBサイトにアクセスし表示する
※ キャッシュがない場合の流れ
今回はdigコマンドを使って3番のフルサービスリゾルバーの動きを真似していき、コマンドの基本的な使い方・読み方を学んでいきます。
この段階で「ようわからん」って方におすすめの書籍
ここらへんの流れを読んで「ちょっとよくわからん...」という方はDNSがよくわかる教科書をおすすめします。
ドメインの登録・管理体制から名前解決の仕組み・動作の流れ、DNSに関するセキュリティ対策、DNSの設定・運用まで基本的なことが丁寧に解説されています。
多少くどいと思ってしまうくらい丁寧に図を交えて解説されているので、わかりやすく読み進めやすい書籍です。
digコマンドを使ってドメインの名前解決をしていく
フルサービスリゾルバのように、本ブログのドメイン free-engineer.life
のIPアドレス(IPv4, Aレコード)をルートの権威サーバからたどっていき突き止めていきます。
コマンドの基本的な使い方
dig [オプション] [@問い合わせ先サーバ] ドメイン名 [タイプ] [クラス]
- 問い合わせ先サーバを省略するとシステム設定のフルサービスリゾルバーが使われます
- タイプを省略すると
A
(IPv4)が指定されます - クラスを省略すると
IN
(インターネット)が指定されます
それでは free-engineer.life
のIPアドレス(IPv4, Aレコード)を突き止めていきましょう!!
1. ルートの権威サーバに問い合わせる
ルートの権威サーバのIPアドレスは最新のヒントファイル(https://www.internic.net/domain/named.root) から調べA.ROOT-SERVERS.NET. (198.41.0.4)を使用します。
(省略)
. 3600000 NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
(省略)
(https://www.internic.net/domain/named.rootより抜粋)
権威サーバへの問い合わせなので 名前解決要求を無効にするオプション +norec
(非再帰的問い合わせ)を付けて実行します。
$ dig +norec @198.41.0.4 free-engineer.life A
実行結果は

StatusはNOERRORなので正常に問い合わせできています。そしてflagsに「aa」がなくANSERセクションが無いことから委任情報が返ってきていることがわかります。
画像に書き込んでいる通り「AUTHORITY SECTION」と「ADDITIONAL SECTION」に委任先の情報が書かれています。
どうやらlife
ゾーンの権威サーバに委任しているようです。
次は委任先のlife
ゾーンの権威サーバにdigコマンドで問い合わせます。委任先のサーバはいくつかありますが v0n0.nic.life.
(65.22.20.35)に問い合わせたいと思います。
;; AUTHORITY SECTION:
life. 172800 IN NS v0n0.nic.life. ← これ
(省略)
;; ADDITIONAL SECTION:
v0n0.nic.life. 172800 IN A 65.22.20.35 ← これ
(省略)
2. lifeゾーンの権威サーバにv0n0.nic.life.に問い合わせる
$ dig +norec @65.22.20.35 free-engineer.life A

今回もflagsに「aa」がなくANSERセクションが無いことから委任情報が返ってきていることがわかります。
委任先は ns-rs2.gmoserver.jp.
となっていますが「ADDITIONAL SECTION」がないためIPアドレスがわかりません。これはNSレコードで指定されている委任先のサーバが外部名(life
ゾーンの外)であるためです。(今回の場合 gmoserver.jp
ゾーン)
ここから先に進むためには、ns-rs2.gmoserver.jp.
のIPアドレスを調べる必要が出てきました。
またルートの権威サーバから問い合わせていくということです。
dig +norec @ns-rs2.gmoserver.jp. free-engineer.life A
とドメイン名指定でコマンド実行すれば良いのですが、それでは今回の趣旨から外れてしまうためns-rs2.gmoserver.jp.のIPアドレスを突き止めます。
そもそも、それやっちゃうと最初からフルサービスリゾルバーに対してdigコマンド実行すればおしまいって話になっちゃいますし。
3. ルートの権威サーバにns-rs2.gmoserver.jp.のIPアドレスを問い合わせる
ルートの権威サーバのIPアドレスは198.41.0.4だったので、そこ宛てに問い合わせます。
~ ❯❯❯ dig +norec @198.41.0.4 ns-rs2.gmoserver.jp A
; <<>> DiG 9.10.6 <<>> +norec @198.41.0.4 ns-rs2.gmoserver.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17669
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 16
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ns-rs2.gmoserver.jp. IN A
;; AUTHORITY SECTION:
jp. 172800 IN NS a.dns.jp.
jp. 172800 IN NS d.dns.jp.
jp. 172800 IN NS e.dns.jp.
jp. 172800 IN NS f.dns.jp.
jp. 172800 IN NS h.dns.jp.
jp. 172800 IN NS g.dns.jp.
jp. 172800 IN NS c.dns.jp.
jp. 172800 IN NS b.dns.jp.
;; ADDITIONAL SECTION:
a.dns.jp. 172800 IN A 203.119.1.1
a.dns.jp. 172800 IN AAAA 2001:dc4::1
d.dns.jp. 172800 IN A 210.138.175.244
d.dns.jp. 172800 IN AAAA 2001:240::53
e.dns.jp. 172800 IN A 192.50.43.53
e.dns.jp. 172800 IN AAAA 2001:200:c000::35
f.dns.jp. 172800 IN A 150.100.6.8
f.dns.jp. 172800 IN AAAA 2001:2f8:0:100::153
h.dns.jp. 172800 IN A 161.232.72.25
h.dns.jp. 172800 IN AAAA 2a01:8840:1bc::25
g.dns.jp. 172800 IN A 203.119.40.1
c.dns.jp. 172800 IN A 156.154.100.5
c.dns.jp. 172800 IN AAAA 2001:502:ad09::5
b.dns.jp. 172800 IN A 202.12.30.131
b.dns.jp. 172800 IN AAAA 2001:dc2::1
;; Query time: 36 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Sat Jul 30 23:54:41 JST 2022
;; MSG SIZE rcvd: 504
委任先のjpゾーンの権威サーバの情報がたくさん返ってきました。この中から次に問い合わせる委任先サーバを選びます。
今回は a.dns.jp.
(203.119.1.1)にしました。
4. jpゾーンの権威サーバ(a.dns.jp.)に問い合わせる
~ ❯❯❯ dig +norec @203.119.1.1 ns-rs2.gmoserver.jp A
; <<>> DiG 9.10.6 <<>> +norec @203.119.1.1 ns-rs2.gmoserver.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49931
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ns-rs2.gmoserver.jp. IN A
;; AUTHORITY SECTION:
gmoserver.jp. 86400 IN NS ns1.gmointernet.com.
gmoserver.jp. 86400 IN NS ns1.gmointernet.jp.
;; ADDITIONAL SECTION:
ns1.gmointernet.jp. 86400 IN A 157.7.33.254
;; Query time: 31 msec
;; SERVER: 203.119.1.1#53(203.119.1.1)
;; WHEN: Sat Jul 30 23:58:13 JST 2022
;; MSG SIZE rcvd: 129
gmoserver.jp
ゾーンの権威サーバに委任しているようです。
次はns1.gmointernet.jp.
(157.7.33.254)に問い合わせます。
5. gmoserver.jpの権威サーバに問い合わせる
~ ❯❯❯ dig +norec @157.7.33.254 ns-rs2.gmoserver.jp A
; <<>> DiG 9.10.6 <<>> +norec @157.7.33.254 ns-rs2.gmoserver.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12878
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ns-rs2.gmoserver.jp. IN A
;; ANSWER SECTION:
ns-rs2.gmoserver.jp. 3600 IN A 157.7.33.87
;; AUTHORITY SECTION:
gmoserver.jp. 86400 IN NS ns1.gmointernet.com.
gmoserver.jp. 86400 IN NS ns1.gmointernet.jp.
;; Query time: 39 msec
;; SERVER: 157.7.33.254#53(157.7.33.254)
;; WHEN: Sun Jul 31 00:03:14 JST 2022
;; MSG SIZE rcvd: 127
flagsに「aa」があり「ANSER SECTION」にns-rs2.gmoserver.jp
のAレコード(IPv4)があることから権威のある応答であることがわかります。
ns-rs2.gmoserver.jp
のIPアドレス(IPv4)は157.7.33.87です。
これでやっと2番の続きを進めることができます。
おさらいしておくと、2番ではfree-engineer.life
の情報をns-rs2.gmoserver.jp.
に委任していることはわかったがIPアドレスがわからなかったためns-rs2.gmoserver.jp.
のIPアドレスを調べる必要が出てきたという状況でした。
今、IPアドレスがわかったので、本来の目的であるfree-engineer.life
のIPアドレス(IPv4, Aレコード)調査に戻ります。
ns-rs2.gmoserver.jp に free-engineer.life のIPアドレスを問い合わせる
~ ❯❯❯ dig +norec @157.7.33.87 free-engineer.life A
; <<>> DiG 9.10.6 <<>> +norec @157.7.33.87 free-engineer.life A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34488
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;free-engineer.life. IN A
;; ANSWER SECTION:
free-engineer.life. 600 IN A 150.95.219.147
;; AUTHORITY SECTION:
free-engineer.life. 600 IN NS ns-rs1.gmoserver.jp.
free-engineer.life. 600 IN NS ns-rs2.gmoserver.jp.
;; Query time: 47 msec
;; SERVER: 157.7.33.87#53(157.7.33.87)
;; WHEN: Sun Jul 31 00:13:37 JST 2022
;; MSG SIZE rcvd: 117
flagsに「aa」があり「ANSER SECTION」にfree-engineer.life
のAレコード(IPv4)があることから権威のある応答であることがわかります。
ついに判明しました!
free-engineer.life
のIPアドレス(IPv4)は 150.95.219.147
でした!
;; ANSWER SECTION:
free-engineer.life. 600 IN A 150.95.219.147 ← これ
【補足】本来ならdigコマンド1回実行するだけでOK
今回はdigコマンドを使って、フルサービスリゾルバのように問い合わせをしていこうというテーマでやったので面倒な感じになりましたが、ただIPアドレスを調べたいだけなら1回ですみます。
名前解決要求を有効にして(+norecオプション付けずに)フルサービスリゾルバ宛(デフォルト)にdigコマンドを実行するだけです。
~ ❯❯❯ dig free-engineer.life A
; <<>> DiG 9.10.6 <<>> free-engineer.life A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14658
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;free-engineer.life. IN A
;; ANSWER SECTION:
free-engineer.life. 165 IN A 150.95.219.147
;; Query time: 129 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Sun Jul 31 00:18:34 JST 2022
;; MSG SIZE rcvd: 63
もしくは名前解決要求を有効にしてパブリックDNS宛に実行。(例: Google Public DNS 8.8.8.8)
~ ❯❯❯ dig @8.8.8.8 free-engineer.life A
; <<>> DiG 9.10.6 <<>> @8.8.8.8 free-engineer.life A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17676
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;free-engineer.life. IN A
;; ANSWER SECTION:
free-engineer.life. 600 IN A 150.95.219.147
;; Query time: 35 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Jul 31 00:22:07 JST 2022
;; MSG SIZE rcvd: 63
どちらの場合でもflagsに「rd ra」があり、フルサービスリゾルバに名前解決要求をしていて「ANSER SECTION」にAレコードの記載があることが確認できると思います。
rd(Recursion Desired)digコマンドの問い合わせが名前解決要求であったという意味
ra(Recursion Available)宛先のサーバが名前解決要求処理可能であったという意味
参考書籍
やっぱよくわからない...名前解決要求とか委任先とか権威サーバとかなに??って方はDNSがよくわかる教科書を読んでみてください。
用語の説明も丁寧で、DNSの仕組みに関しても図をふんだんに使って順を追って解説されているのでオススメです。読み進めやすく理解しやすいですよ。