DNSの仕組みはなぜ分かりにくいのか。


DNSってわかりにくいですよね。

DNSを触るたびにDNSのことを断片的に調べていたのですが、全然理解できませんでした。
なんでこんなに理解するのが難しいのかなーと考えつつ、ちゃんと理解しようと思い立ち、今回DNSについて調べたので備忘録として残しておきます。

※ [DNSがよくわかる教科書](https://www.amazon.co.jp/DNS%E3%81%8C%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E6%97%A5%E6%9C%AC%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-JPRS-%E6%B8%A1%E9%82%89%E7%B5%90%E8%A1%A3%E3%80%81%E4%BD%90%E8%97%A4%E6%96%B0%E5%A4%AA%E3%80%81%E8%97%A4%E5%8E%9F%E5%92%8C%E5%85%B8/dp/479739448X/ref=asc_df_479739448X/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=12262791834028147610&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009298&hvtargid=pla-541227524388&psc=1&th=1&psc=1) を非常に参考にさせていただいております。もしもう少し深くまで学びたいという場合はぜひ読んでみてください。

# なぜDNSが分かりにくいのか

この記事の趣旨はまさにここなのですが、**登場人物の用語が統一されていない**というところに尽きると思います。
技術に限らず何かを勉強するときは

1. 全体像をうっすら理解する
1. 各機能が何をしているか理解する

という流れで理解してようやく **「分かる」** となることが多いかなと思います。

DNSの場合、なんとなく全体像がわかった後に各機能が何をしているかを検索して調べようとすると、登場人物の用語が統一されておらず、記事によって登場人物の呼び方が違うので、今この記事はどこの機能のことを言ってるんだろう？となってしまうわけです。（名前解決の仕組みなのに名前解決で戸惑うわけですね）

なのでDNSを理解するときは、 **「各機能は色々な呼び方をされている」** ということを念頭に置いて、前後の文脈から今どこの機能のことを説明しているのかを想像する必要があります。

# DNSの基礎

ここからが本題です。
なんとなく全体像を把握して、各機能について後は自分で調べられる状態を目指します。

1. DNSの全体像の把握
    1. DNSの名前解決の流れ
    1. ドメインを取得・更新した時の流れ
1. 自分でドメインを取得〜名前解決出来るようになるまでの流れ

という感じでまとめていきます。

## DNSの全体像の把握

DNSを理解するには大きく2つに分類すると分かりやすいかなと思います。

1. 名前解決
1. ドメインの管理

`名前解決`と`ドメインの管理`では登場人物とやることが異なるので別々に説明していきます。

## DNSの名前解決の流れ

名前解決とは「`example.jp`のIPアドレスを教えてください。」と質問すると「`example.jp`のIPアドレスは`500.000.000.001`ですよ。」と回答が返ってくるというものです。ブラウザにドメインを入力して該当のWebページを表示させるのが名前解決です。

### ドメインツリーによる名前解決

![名前解決の流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/1bb47681-4351-3948-5239-777fa46a8a79.png)

この図はDNSについて調べると必ず出てくる図なので1度は見たことがあり、「これはなんとなく分かるよ」という方も多いのではないでしょうか。

この世には無数にドメインとIPが存在しており、1つのサーバーが全てを処理するのは不可能です。そこで上図のような**ドメインツリー** という形でドメインを管理しています。

クライアントが`https://example.jp`というWebサイトにアクセスしたい場合に、まず上図右上のルートサーバーに対して「`example.jp`のIP」について尋ねます。ルートサーバーは`example.jp`のIPは知りませんが、`jp`が管理されている場所は知っているのでそれを教えてあげます。

次にjpサーバーに対して「`example.jp`のIP」について尋ねます。jpサーバーは`example.jp`のIPは知りませんが、`example.jp`が管理されている場所は知っているのでそれを教えてあげます。

最後にexample.jpサーバーに対して「`example.jp`のIP」について尋ねます。example.jpサーバーは`example.jp`のIPを知っているのでそれを教えてあげます。

これで`example.jp`のIPが`500.000.000.001` ということがわかりました。
このようにクライアントが何度もIPを尋ねて、目的のIPを取得する流れがDNSによる名前解決です。

#### 権威サーバー
このドメインを管理しているサーバーを**権威サーバー**と呼びます。

![権威サーバー群.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/4ae41210-93af-1e47-3044-88d63e3f31c0.png)

### フルリゾルバーによるキャッシュ

さて、`example.jp`にアクセスするたびに毎回毎回ドメインツリーによる名前解決をするのは非常に手間ですよね。そこで登場するのが**キャッシュ**です。このキャッシュをしてくれるサーバーを**フルリゾルバー**と呼びます。

#### 初回アクセス

![フルリゾルバー:初回アクセス時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/d2bf9acf-9395-cc04-ad70-672a87879c6c.png)

初回アクセス時の名前解決の流れはほとんど一緒です。間にフルリゾルバーが入っただけですね。
初回アクセス時にフルリゾルバーはその情報を保存します。（どれくらいの間キャッシュしておくのかという設定が、DNSでよく見る**TTL**というやつです。）

#### 2回目以降のアクセス

![フルリゾルバー:2回目以降のアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/34e805a4-4b3e-d498-b332-4f43bd9c2b21.png)

2回目以降はフルリゾルバーにデータが保存されていたらその情報を返し、保存されていなければ初回アクセスと同じようにドメインツリーによる名前解決を試みます。

### DNSの名前解決の登場人物

便宜上`クライアント`という言葉を使っていますが、`クライアント`にも正式名称があり、`スタブリゾルバー` と呼びます。

最終的な名前解決の流れが以下の図です。

![DNSによる名前解決の流れ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/f20f61e1-c3c6-b0f8-d233-487a2bd47987.png)

DNSについて調べる時には、`スタブリゾルバー`, `フルリゾルバー`, `権威サーバー` のどれについて解説しているのかを前後の文脈から読み取ってみてください。

#### 各機能の色々な呼び方
|構成要素|現在使われている別の名称（主なもの）|
|---|---|
|スタブリゾルバー|DNSクライアント など|
|フルリゾルバー|キャッシュDNSサーバー, 参照サーバー, ネームサーバー, DNSサーバー など|
|権威サーバー|権威DNSサーバー, ゾーンサーバー, ネームサーバー, DNSサーバー など|

[「DNSがよくわかる教科書 P79 COLUMN 統一されていない名称に注意」](https://www.amazon.co.jp/DNS%E3%81%8C%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E6%97%A5%E6%9C%AC%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-JPRS-%E6%B8%A1%E9%82%89%E7%B5%90%E8%A1%A3%E3%80%81%E4%BD%90%E8%97%A4%E6%96%B0%E5%A4%AA%E3%80%81%E8%97%A4%E5%8E%9F%E5%92%8C%E5%85%B8/dp/479739448X/ref=asc_df_479739448X/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=12262791834028147610&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009298&hvtargid=pla-541227524388&psc=1&th=1&psc=1) 参照

ネームサーバー, DNSサーバーが丸かぶりしてて地獄だなと思いました。

## DNSのドメインの管理

名前解決をするには権威サーバーが「`exmaple.jp`のIPアドレスは`500.000.000.001`です。」ということを知っている必要があります。つまり我々一般ユーザーがドメインを取得しWebサーバーを構築した後に、それらの情報を権威サーバーに登録する必要があるわけです。また、IPアドレスが変わってしまった場合には権威サーバーの更新をする必要があります。

この我々一般ユーザーが取得したドメイン情報を登録・更新したりする処理がDNSのドメインの管理です。

### ドメインの管理

権威サーバーを誰もが自由に更新できてしまうと非常に困ったことになってしまいます。この権威サーバーを管理している組織を**レジストリ**と呼びます。各権威サーバーには必ずレジストリがいます。

![レジストリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/ad97265a-c11a-3bca-b2ec-1781bc425635.png)

|ドメイン|管理組織|
|---|---|
|ルートサーバー|ICANN|
|jpサーバー|JPRS|
|example.jpサーバー|自分の会社など|

レジストリは権威サーバーを管理する組織なので、自分の会社もレジストリです。Amazon Route 53などでDNSの設定をしたことがある人もいるのではないでしょうか。実は自分達もレジストリだったのです。

### ドメインの登録・更新

権威サーバーはレジストリによって管理されていますが、レジストリに対して直接ドメインの取得や更新の依頼をしたことがある人はいないと思います。お名前.com や Value DomainなどのDNSサービスを使ってドメインの登録をしているはずです。

このレジストリへの登録や更新を我々の代わりに行なってくれている組織を**レジストラ**と呼びます。

![レジストラ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/5d5e8ac7-dd71-d649-8cfb-1f84aeb19566.png)

# ドメイン登録の流れ

長くなってしまいましたがドメインに関する基礎はここで終わりです。
実際にドメインを取得して名前解決が出来るようになるまでに何が行われているかを簡単にまとめてみました。

|機能|利用サービス|
|---|---|
|レジストラ|Value Domain|
|自社の権威サーバー|Amazon Route 53|

![ドメイン登録の流れ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/248b78fa-60e0-b460-efec-30999d665c49.png)

色々なツールを行き来するのでとても複雑に見えますが、大きく分けると以下の2つを行なっています。

1. jpサーバーに`example.jp`へのアクセスは「自身の権威サーバー（`example.jpサーバー`）にアクセスしてください」と登録する
1. 「取得したドメイン(`example.jp`)」と「IPアドレス(`500.000.000.001`)」の対応を自身の権威サーバーに登録する

#### ③後の画面サンプル（Amazon Route 53）

![Screen Shot 0004-02-06 at 19.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/f7adcca5-a43a-4e49-b520-cb3e609b6992.png)

Amazon Route 53でゾーンを作成するとデフォルトで上図のような画面になります。
このNSレコードが自身の権威サーバーの場所を示す情報なので、これをValue Domainに登録するわけですね。

```
ns-1866.awsdns-41.co.uk.
ns-1228.awsdns-25.org.
ns-925.awsdns-51.net.
ns-266.awsdns-33.com.
```

この画面ではIPとドメインの対応は登録されていません。登録したいIPがわかったら`Aレコード`として登録してあげるわけです。

#### ④の画面サンプル（Value Domamin）

![Screen Shot 0004-02-06 at 19.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/e289108d-4bbc-954e-fe94-79e6757c6de9.png)

Value Domainでドメインを取得すると`ネームサーバー変更`というページにアクセスできます。他のレジストラにも同じような画面があるはずです。ここに③で取得したNSレコードを登録して、jpサーバーに `example.jp`の場所を教えてあげるわけですね。

# まとめ

思ったよりも長くなってしまいましたが、DNSを調べようとすると全然思ったように情報に辿り着けなくて本当に困りました。やはり命名を統一するのって本当に大事だなーと改めて思いました。

全体像を簡単に理解するために色々と端折ってるところとかもありますが、だいたいこんな感じなんじゃないかなーと思っており、全体を理解したら個別の事象の理解も深まった気がします。

もしこの辺り間違えてるよとかあったらぜひご指摘していただきたいです！
[Twitter](https://twitter.com/DYoko0701)とかもやってるのでぜひフォローしていただけると嬉しいです。