- Published on
なぜ amazon.co.jp にアクセスできるのか
- Authors
- Name
- Yasuo Omori
- @omoriyasuo
はじめに
DNS について学習する機会があったので雑にメモ。 まとめるだけだと面白みがないので、なぜ amazon は繋がるのかも考える。
ドメインについて
ドメインとは
簡単にいうと、「インターネット上にある住所」のこと。 家の住所があることで、ハガキなどが届くのを考えると分かりやすい。
ドメインの構成
amazon.co.jp.
amazon
- 3LD / サードレベルドメイン
co
- 2LD / セカンドレベルドメイン
jp
- TLD / トップレベルドメイン
.
- ルート
FQDN とは
- FQDN
- Fully Qualified Domain Name の略で絶対ドメインのこと。
- 例えば、
amazon.co.jp
の FQDN はamazon.co.jp.
である。 - 普段、ルートを気にせずアクセスできるのは、サーバとクライアント側がよしなに補ってくれているから。
DNS について
なぜ DNS が必要か
- コンピュータが通信する際には、「255.255.255.255」のような IP アドレスを用いて相手を特定する。しかし、人間が識別するのは困難。そこで、人間が覚えやすいようにドメイン名が利用されるようになった。
- 人間にとって便利になった一方、コンピュータは IP アドレスでないと理解できない。そこで、ドメイン名と IP アドレスをマッピングしてくれる DNS が必要になる。
DNS の構成
[^1]: 画像は jprs から引用
- 木構造になっていて、トップにはルートサーバがある。どのドメインにアクセスしてもまずルートサーバーにリクエストがかかる。 そして、ルートサーバは
com
/net
/jp
などのトップレベルドメインサーバーにアクセスしてね、という情報を返してくれる。 例えば、amazon.co.jp
で言うと、ルートサーバは「jp
サーバにアクセスしてね」という情報を返す。 - トップレベルドメインサーバにアクセスすると、「次はセカンドレベルドメインサーバに問い合わせてね」という情報が返る。 サードレベルドメインサーバまで繰り返すことで、最終的に目的の IP アドレスを取得して通信することが出来る。
amazon を例に試してみる
では、試しにルートサーバー(198.41.0.4)にアクセスして、 .jp
の権威サーバの一覧データを返すか確認してみる。
$ dig @198.41.0.4 amazon.co.jp.
; <<>> DiG 9.10.6 <<>> @198.41.0.4 amazon.co.jp.
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58620
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 16
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;amazon.co.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 65.22.40.25
h.dns.jp. 172800 IN AAAA 2a01:8840:1ba::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: 167 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Sat Jun 26 20:18:11 JST 2021
;; MSG SIZE rcvd: 497
これで、次にアクセスすべきトップレベルドメインの IP アドレスが分かった。(複数あるのは落ちても大丈夫なように冗長構成にしているため) また、ANSWER が 0 になっているのは、198.41.0.4
のルートサーバはamazon.co.jp
を知らないということ。
では、次に a.dns.jp
の IP アドレスを元に(なんでも良いが)トップレベルドメインのサーバーに問い合わせてみる。
$ dig @203.119.1.1 amazon.co.jp.
; <<>> DiG 9.10.6 <<>> @203.119.1.1 amazon.co.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21744
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;amazon.co.jp. IN A
;; AUTHORITY SECTION:
amazon.co.jp. 86400 IN NS pdns1.ultradns.net.
amazon.co.jp. 86400 IN NS ns2.p31.dynect.net.
amazon.co.jp. 86400 IN NS pdns6.ultradns.co.uk.
amazon.co.jp. 86400 IN NS ns1.p31.dynect.net.
;; Query time: 88 msec
;; SERVER: 203.119.1.1#53(203.119.1.1)
;; WHEN: Sat Jun 26 20:26:15 JST 2021
;; MSG SIZE rcvd: 154
このサーバでも ANSWER は 0 になっているので、amazon.co.jp
のことをまだ知らない状態だと分かる。 また同様に、セカンドドメインレベルのサーバの情報を得るためにpdns1.ultradns.net
にアクセスしてみる。 すると、ANSWER が 3 になりamazon.co.jp
の IP アドレスが 3 つ存在することが分かる。
$ dig @pdns1.ultradns.net amazon.co.jp.
; <<>> DiG 9.10.6 <<>> @pdns1.ultradns.net amazon.co.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32643
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 10, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;amazon.co.jp. IN A
;; ANSWER SECTION:
amazon.co.jp. 60 IN A 52.119.168.48
amazon.co.jp. 60 IN A 52.119.164.121
amazon.co.jp. 60 IN A 52.119.161.5
;; AUTHORITY SECTION:
amazon.co.jp. 86400 IN NS pdns6.ultradns.co.uk.
amazon.co.jp. 86400 IN NS pdns1.ultradns.net.
amazon.co.jp. 86400 IN NS ns4.p31.dynect.net.
amazon.co.jp. 86400 IN NS ns3.p31.dynect.net.
amazon.co.jp. 86400 IN NS pdns5.ultradns.info.
amazon.co.jp. 86400 IN NS pdns4.ultradns.org.
amazon.co.jp. 86400 IN NS pdns3.ultradns.org.
amazon.co.jp. 86400 IN NS pdns2.ultradns.net.
amazon.co.jp. 86400 IN NS ns2.p31.dynect.net.
amazon.co.jp. 86400 IN NS ns1.p31.dynect.net.
;; Query time: 81 msec
;; SERVER: 204.74.108.1#53(204.74.108.1)
;; WHEN: Sat Jun 26 20:38:16 JST 2021
;; MSG SIZE rcvd: 343
上記の一連の動作を一瞬でやってくれているのが、$ dig amazon.co.jp.
$ dig amazon.co.jp.
; <<>> DiG 9.10.6 <<>> amazon.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8161
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;amazon.co.jp. IN A
;; ANSWER SECTION:
amazon.co.jp. 16 IN A 52.119.161.5
amazon.co.jp. 16 IN A 52.119.168.48
amazon.co.jp. 16 IN A 52.119.164.121
;; Query time: 5 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Sat Jun 26 20:56:15 JST 2021
;; MSG SIZE rcvd: 89
このようにdig
コマンドでやったことを、amazon.co.jp
にアクセスした時に DNS は裏側でよしなにやってくれている。(さらに詳しくいうとフルリゾルバーがやってる)
ゆるふわ
何か障害があった時に、対応できるようになりたい