プログラミング学習

digコマンドの基本的な使い方・読み方をドメインの名前解決をしながら学ぶ

dig コマンドの基本的な使い方をドメインの名前解決しながら解説していきます。

フルサービスリゾルバのようにルートの権威サーバーからたどっていき、特定のドメインのIPアドレス(IPv4, Aレコード)を突き止めたいと思います。

ドメインの名前解決の流れ

ドメインの名前解決をするときの流れを簡単におさらい。

以下の図はJPRS用語辞典|スタブリゾルバー(DNSクライアント) より引用したものです。

引用:JPRS用語辞典|スタブリゾルバー(DNSクライアント) より

PCのブラウザのURLバーに入力したら

  1. ブラウザは端末内のスタブリゾルバーを呼び出す
  2. スタブリゾルバーはフルサービスリゾルバに「私の代わりにhoge.jpのIPアドレスを教えてください」と依頼する(名前解決要求)
  3. フルサービスリゾルバはルートの権威サーバから順に問い合わせていき、目的のドメインのIPアドレスを得る
  4. フルサービスリゾルバからスタブリゾルバーに「hoge.jpのIPアドレスはxxx.xxx.xxx.xxxです」と返す
  5. スタブリゾルバーはブラウザにIPアドレスを返す
  6. ブラウザが目的の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
digコマンドlifeゾーン権威サーバーへの問い合わせ結果

今回も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の仕組みに関しても図をふんだんに使って順を追って解説されているのでオススメです。読み進めやすく理解しやすいですよ。

-プログラミング学習