dig コマンドを利用し DNS の仕組みを理解する
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
これを図にするとこうなる。
- ユーザが Web ブラウザに
tetsuya.xyz
と入力すると、インタネットを経由し DNS Resolver に問い合わせがいく - DNS Resolver が Root Nameserver に問い合わせる
- Root Nameserver のうちの1つ
l.root-servers.net
が TLD (Top Level Domain) の Nameserver のアドレスx.nic.xyz
,y.nic.xyz
,z.nic.xyz
を返却する - DNS Resolver が
.xyz
の Nameserver に問い合わせる - TLD Nameserver のうちの一つ
z.nic.xyz
がtetsuya.xyz
ドメインのネームサーバthomas.ns.cloudflare.com
,jocelyn.ns.cloudflare.com
を返却する - DNS Resolver が
tetsuya.xyz
の Nameserver に問い合わせる - ドメインの Nameserver のうちの一つ
thomas.ns.cloudflare.com
が Web サーバの IP アドレスを返却する - DNS resolver が Web ブラウザ に IP アドレスを返却する
なお、Web ブラウザは 9 番目のステップとして 8 で取得した IP アドレスに対して HTTP/HTTPS リクエストを行う。
DNS Resolver
通常は利用している ISP が用意する Resolver がデフォルトになるが、サードパーティの DNS Resolver を利用することもできる。代表的なものだと Cloudflare 1.1.1.1 や Google 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 アドレスでもアクセスが可能であることが確認できた。
Discussion