dig コマンドを利用し DNS の仕組みを理解する

12 min read読了の目安(約7200字

dig (domain information groper) コマンドを利用し、DNS の仕組みを理解する。

$ dig +trace tetsuya.xyz

; <<>> DiG 9.10.6 <<>> +trace tetsuya.xyz
;; global options: +cmd
.			510957	IN	NS	a.root-servers.net.
.			510957	IN	NS	b.root-servers.net.
.			510957	IN	NS	c.root-servers.net.
.			510957	IN	NS	d.root-servers.net.
.			510957	IN	NS	e.root-servers.net.
.			510957	IN	NS	f.root-servers.net.
.			510957	IN	NS	g.root-servers.net.
.			510957	IN	NS	h.root-servers.net.
.			510957	IN	NS	i.root-servers.net.
.			510957	IN	NS	j.root-servers.net.
.			510957	IN	NS	k.root-servers.net.
.			510957	IN	NS	l.root-servers.net.
.			510957	IN	NS	m.root-servers.net.
.			510957	IN	RRSIG	NS 8 0 518400 20200921050000 20200908040000 46594 . wgnBz8tKA9hjwIxmMQgTVwnZaiUpAB9a1+oC5T/syHzqNj1e5qhApLQN NLok43hu5Ykt8RFe/IiDZuYxIdyyzItwk4QN8xNgsQsfhVfBbZ26bWRz fskquwnFn6Gmvq2qI6o42tsBxXUw09X4sNlNYI2zHB3sKaaMu0AbN9WI Pe14jpX/PwaP3m78+XqMy9CiKmuDon6g3BuyecPhCZL5Pa8ZPC7nrKfV pfyNSiPoBODsJE96UHGlOCJTFcbu/6Ia4ek3AGOJf+WC84HPrxLTriyk XHfbPl7EjTbFSPgT8D7jGBfVCTQU3JSfynv29VFAHWZu1gm5VJWNQGaw u5gatA==
;; Received 525 bytes from 1.1.1.1#53(1.1.1.1) in 25 ms

xyz.			172800	IN	NS	x.nic.xyz.
xyz.			172800	IN	NS	y.nic.xyz.
xyz.			172800	IN	NS	z.nic.xyz.
xyz.			172800	IN	NS	generationxyz.nic.xyz.
xyz.			86400	IN	DS	3599 8 1 3FA3B264F45DB5F38BEDEAF1A88B76AA318C2C7F
xyz.			86400	IN	DS	3599 8 2 B9733869BC84C86BB59D102BA5DA6B27B2088552332A39DCD54BC4E8 D66B0499
xyz.			86400	IN	RRSIG	DS 8 1 86400 20200921050000 20200908040000 46594 . VmNIN2L30xL83SLYVfXSnMAE8KzuBazdpXZXk8Stsrb9Olm35Hajp1Q2 tb4gIFXQ8fs4HZNnfLJ2mxTBoxbj9+6+exeySCgBREhoo9W7o+M4YFY+ IGogo0i2AL+rBt1tM2QYto/jdDL5NMaV2ve/XReUR+Py82oEKEb6dR+M 6930JZH2WZhIEhpovTSFFVVZbVdc66MHqFvw75hV0lrOsYub7YZH4dLB JGcqOaCa7YRnKXJ9qRwxEPfSQ1vydWgIyUrOcrex/cPZPXnrI/fgtQvN g8BKS6eccKKpUB2bx388mPUqzu/+If4iRZKBoVLyX7SoL4bbWkYi9RCo RT0OtA==
;; Received 667 bytes from 199.7.83.42#53(l.root-servers.net) in 122 ms

tetsuya.xyz.		3600	IN	NS	thomas.ns.cloudflare.com.
tetsuya.xyz.		3600	IN	NS	jocelyn.ns.cloudflare.com.
1h97h2oec2juov8dlbbjj6i7ik26bm8d.xyz. 3600 IN NSEC3 1 1 1 - 1H9SP7N22537R92KKG4DNO5R90TMHMCQ  NS SOA RRSIG DNSKEY NSEC3PARAM
564j1b7u7qbvd61u17nvt2shof8br18f.xyz. 3600 IN NSEC3 1 1 1 - 568FETMJ9T2BQDS32P3OKA36S7SDQ7N4  NS DS RRSIG
1h97h2oec2juov8dlbbjj6i7ik26bm8d.xyz. 3600 IN RRSIG NSEC3 8 2 3600 20201002173834 20200902190213 30778 xyz. PMyDR/1+cCZxJ96gifnKYV0jeUjLt+KGZrdLGq4KEoeabXAsAp3tw7+Q vtO4OKcNz0WxJbyHiHMsofAU+46uMvTxEk2yBwaELvLpWs2d8/Bw1VLo EXBOnBB4X53SVsG1p++8Hw2O8CuAdjVzp9Lmrhrb73WD8elTOGkAliJ7 bqg=
564j1b7u7qbvd61u17nvt2shof8br18f.xyz. 3600 IN RRSIG NSEC3 8 2 3600 20201002192456 20200903031340 30778 xyz. dptqNDeOwciyUcyJSlNS8sdle9yWm4CerjB6HhqcCBnDFLBFDMHsC4ix o3Y8DyT8obni6xJGJRqNU4ID7B61d55ibDZdYScbgIx5IDmW/rTAHRZZ tzMpL5W+U2CEKNQWKRQvgRCVljWUc5tSvjQHm5MM1jRt8ffYWdMONssl u68=
;; Received 585 bytes from 2a04:2b00:13ee::42#53(z.nic.xyz) in 11 ms

tetsuya.xyz.		52	IN	A	34.230.212.40
tetsuya.xyz.		52	IN	A	107.23.162.152
tetsuya.xyz.		52	IN	A	52.23.32.39
tetsuya.xyz.		52	IN	A	34.224.219.114
tetsuya.xyz.		52	IN	A	34.195.187.253
tetsuya.xyz.		52	IN	A	52.71.235.157
tetsuya.xyz.		52	IN	A	34.227.164.168
tetsuya.xyz.		52	IN	A	54.221.249.251
;; Received 168 bytes from 172.64.33.238#53(thomas.ns.cloudflare.com) in 15 ms

これを図にするとこうなる。

  1. ユーザが Web ブラウザに tetsuya.xyz と入力すると、インタネットを経由し DNS Resolver に問い合わせがいく
  2. DNS Resolver が Root Nameserver に問い合わせる
  3. Root Nameserver のうちの1つ l.root-servers.net が TLD (Top Level Domain) の Nameserver のアドレス x.nic.xyz, y.nic.xyz, z.nic.xyz を返却する
  4. DNS Resolver が .xyz の Nameserver に問い合わせる
  5. TLD Nameserver のうちの一つ z.nic.xyztetsuya.xyz ドメインのネームサーバ thomas.ns.cloudflare.com, jocelyn.ns.cloudflare.com を返却する
  6. DNS Resolver が tetsuya.xyz の Nameserver に問い合わせる
  7. ドメインの Nameserver のうちの一つ thomas.ns.cloudflare.com が Web サーバの IP アドレスを返却する
  8. DNS resolver が Web ブラウザ に IP アドレスを返却する

なお、Web ブラウザは 9 番目のステップとして 8 で取得した IP アドレスに対して HTTP/HTTPS リクエストを行う。

DNS Resolver

通常は利用している ISP が用意する Resolver がデフォルトになるが、サードパーティの DNS Resolver を利用することもできる。代表的なものだと Cloudflare 1.1.1.1Google Public DNS がある。今回の例では 1.1.1.1 を利用していたが、 Google Public DNS に変更すると、 dig の結果も以下のように変わる。

$ dig +trace tetsuya.xyz

; <<>> DiG 9.10.6 <<>> +trace tetsuya.xyz
;; global options: +cmd
.			85384	IN	NS	a.root-servers.net.
.			85384	IN	NS	b.root-servers.net.
.			85384	IN	NS	c.root-servers.net.
.			85384	IN	NS	d.root-servers.net.
.			85384	IN	NS	e.root-servers.net.
.			85384	IN	NS	f.root-servers.net.
.			85384	IN	NS	g.root-servers.net.
.			85384	IN	NS	h.root-servers.net.
.			85384	IN	NS	i.root-servers.net.
.			85384	IN	NS	j.root-servers.net.
.			85384	IN	NS	k.root-servers.net.
.			85384	IN	NS	l.root-servers.net.
.			85384	IN	NS	m.root-servers.net.
.			85384	IN	RRSIG	NS 8 0 518400 20200921050000 20200908040000 46594 . wgnBz8tKA9hjwIxmMQgTVwnZaiUpAB9a1+oC5T/syHzqNj1e5qhApLQN NLok43hu5Ykt8RFe/IiDZuYxIdyyzItwk4QN8xNgsQsfhVfBbZ26bWRz fskquwnFn6Gmvq2qI6o42tsBxXUw09X4sNlNYI2zHB3sKaaMu0AbN9WI Pe14jpX/PwaP3m78+XqMy9CiKmuDon6g3BuyecPhCZL5Pa8ZPC7nrKfV pfyNSiPoBODsJE96UHGlOCJTFcbu/6Ia4ek3AGOJf+WC84HPrxLTriyk XHfbPl7EjTbFSPgT8D7jGBfVCTQU3JSfynv29VFAHWZu1gm5VJWNQGaw u5gatA==
;; Received 525 bytes from 8.8.8.8#53(8.8.8.8) in 23 ms
...

Authoritative nameserver

通常は、 Domain Name Registrar が DNS を用意している。今回の例ではドメインの管理を Cloudflare Managed DNS で行っているため、Cloudflare の DNS サーバのアドレスが返却された。ドメインのネームサーバは以下のコマンドでも確認ができる。

$ dig +short ns tetsuya.xyz
jocelyn.ns.cloudflare.com.
thomas.ns.cloudflare.com.

Web サーバへの HTTP リクエスト

通常、Authoritative nameserver から返却された IP アドレスを直接ブラウザに入力することで Web サイトにアクセスすることができる。今回の例ではサイトは Heroku でホスティングされている。

ここからは余談だが、 Heroku に cURL でアクセスすると 404 が返却される。

$ curl -I 34.230.212.40
HTTP/1.1 404 Not Found
Connection: keep-alive
Server: Cowboy
Date: Thu, 10 Sep 2020 11:15:32 GMT
Content-Length: 494
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache, no-store

ヘルプページによると、 HOST header を確認していることがわかったので追加する。

The Heroku routing layer uses the Host header from the client to ensure the correct application responds to a request.
Why am I seeing ‘No such app’ if I access my application’s SSL endpoint address? - Heroku Help

$ curl -I -H "Host: tetsuya.xyz" 34.230.212.40
HTTP/1.1 200 OK
Server: Cowboy
Date: Thu, 10 Sep 2020 11:15:39 GMT
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Etag: W/"0541e745de570bd4e42b518f4e5f41c9"
Cache-Control: max-age=0, private, must-revalidate
Set-Cookie: _tetsuya_herokuapp_com_session=QlhOQ3RtdllpUm9ZZGlTTVV5QzZpN05ZbTZ0SzRlYkxCOUtNZURscjJOalY4TDdFcHFMZkdTeHVBMU4zcC9rb3k5R0hESjhUWVlYdWhyZCtwQVN3OXBlTG80RXJyVmtTQzA0N2lwSXpaamRTYTJwckZMeVIzK3JZQ2R3UXVmRTdUV1pzTE5nL01vbExHTDJGcDhHdExnPT0tLTFtYUthUk9rSjdGTTVGVjJZck1aVWc9PQ%3D%3D--62bb57f623078e57ec562fe1d12bdec23e5ada21; path=/; HttpOnly
X-Request-Id: 635963c5-ab94-46a2-98a4-a28a1a3163e4
X-Runtime: 0.003315
Via: 1.1 vegur

これで IP アドレスでもアクセスが可能であることが確認できた。