Published on

なぜ amazon.co.jp にアクセスできるのか

Authors

はじめに

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 の構成

jprs-root-tree[^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 は裏側でよしなにやってくれている。(さらに詳しくいうとフルリゾルバーがやってる)

ゆるふわ

何か障害があった時に、対応できるようになりたい