今さら聞けないDNSの基礎知識

今回はDNSの基本的な仕組みを改めて確認しようと思い、下記書籍の内容を一部まとめました。
非常にわかりやすく、体系的に知識を習得できました。


<a target="_blank"  href="https://www.amazon.co.jp/gp/product/479739448X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=479739448X&linkCode=as2&tag=cloudblazerto-22&linkId=bf54952d190d1cc69da4b5ca1ae893d6"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=479739448X&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=cloudblazerto-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=cloudblazerto-22&l=am2&o=9&a=479739448X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


## DNSとは

### DNSにおける階層化と委任

ドメイン名に対応する形で管理範囲を階層化し、管理を委任することで管理を分散する。
委任によって管理を任された範囲を「ゾーン」と呼ぶ。

ゾーンを委任するためには、サブドメインを作ることから始める。
サブドメインは、委任元で作られる。
それぞれのゾーンの管理者は、「ネームサーバー」というサーバーで情報を管理する。

ネームサーバーに保存される情報は下記2つ。

- そのゾーンに存在するホストのドメイン名とIPアドレス
- 委任の情報
  - 委任先のネームサーバーの情報


親は子の委任の情報を管理し、委任先を案内する役割を持つ。


委任先をルートから順にたどり、最終的にドメインのIPアドレスを管理するネームサーバーにたどり着く仕組みが基本的な動作になる。

### DNSとレジストリの関係

ドメイン名とDNSによる階層構造を導入した場合、それぞれの階層を管理する管理者（レジストリ）が必要になる。

レジストリが担う責任は下記。

- 自分が委任されたゾーンを管理する
- ゾーンを委任した場合、そのゾーンを委任した人が誰かを管理する


## レジストリとは

### レジストリの役割

ドメイン名を使うためには、レジストリに対して「このドメイン名を使いたい」という登録申請を行う。

レジストリの主な役割は下記。

- 登録情報を蓄積し管理する登録簿「レジストリデーターベース」を運用する。
- Whoisサービスの提供
  - 自身の管理するドメイン名の情報をWhoisサービスで提供する。
- ネームサーバーの運用

### Whoisとその役割

Whoisは、ドメイン名やIPアドレスのレジストリが、管理する情報をインターネットに公開し、利用者が参照できるようにするサービス。

### レジストリ・レジストラモデル

ドメイン名の登録管理を、下記の通り分離する。

- ドメイン名の一元管理を行う役割を担うレジストリ
- ドメイン名登録者からの申請を取り次ぐレジストラ

登録されるドメイン名を一意に保ちつつ、価格やサービスにおける多様性を確保するため。

### ドメイン名を使えるようにする

登録したドメイン名を使ってWebサイトにアクセスできるようにするためには、ネームサーバーを登録する必要がある。

最近では、ネームサーバーを提供する事業者のサービスを利用することも一般的。

自分でネームサーバー（以下、NS）を運用する場合は下記。

- 自分のドメイン名を取り扱うNSをインターネット上で動かす
  - このNSはインターネットのどこからでもアクセスできるようにする必要がある
- 指定したドメイン名の情報をNSに設定する
- NSがインターネットから聞かれたことに答えられるか確認する


## 名前解決

階層構造取る場合に、子の情報を参照する際は、親が子に委任しているという情報を返す必要がある。

実際に階層構造をたどって名前解決すると、負荷と時間がかかる。
そこで、名前解決を担当する別サーバーを準備し、名前解決を代行する仕組みが考えられた。

一定時間、代行サーバーは名前解決の情報を保持する。
時間内に代行サーバーに要求がこれば、保持している情報を返す。


### 名前解決に必要なこと

委任元（親）が応答する委任先（子）のNS情報のことを、委任情報という。

正しい委任情報が登録されなければ、名前解決ができなくなってしまう。

## DNSの構成要素

1. 情報がほしい人
2. 名前解決をする人
3. 情報を提供する人

上記をそれぞれ、下記と呼ぶ。

1. スタブリゾルバー
2. フルリゾルバー、フルサービスリゾルバー
3. 権威サーバー


### スタブリゾルバー

PCやスマホの機器上で動作し、フルリゾルバーに名前解決を依頼する。
スタブリゾルバーからフルリゾルバーへ名前解決を依頼することを、「名前解決要求」という。
スタブには「末端」という意味がある。


### フルリゾルバー

主な役割は下記。

- 名前解決の実行
- 名前解決の際に得られた情報を蓄積する
  - しばらくの間蓄積する仕組みのことを、「キャッシュ」という

### 権威サーバー


権威サーバーは自分が委任を受けたゾーンの情報と、自分が委任しているゾーンの委任情報を保持する。
これまでNSとよんでいたサーバーが、権威サーバー。

自分が保持している情報のみを応答する。
ゾーン内の情報と、委任情報のみを応答する。

スタブリゾルバーやフルリゾルバーは問い合わせの際、知りたい情報の名前（ドメイン名）と種類（タイプ）を指定する。

権威サーバーはそのゾーンの設定内容（ゾーンデータ）を「リリースレコード」という形で保持する。
リソースレコードは、「ドメイン名」「タイプ」「クラス」という3種類の情報で構成される。

### リソースレコード

よく使われるリソースレコードのタイプは下記。

- A
  - IPv4アドレス
- AAAA
  - IPv6アドレス
- NS
  - そのゾーンの権威サーバーのホスト名
- MX
  - そのドメイン宛の電子メールの配送先と優先度

### 冗長化

権威サーバーは複数台置かれることが普通。
冗長性の向上と負荷分散を図るため。
同一ゾーン内のどの権威サーバーに問い合わせても、同じ応答を得ることができる。
この仕組を「ゾーン転送」と呼ぶ。

ゾーン転送では、ゾーンデータを持つ権威サーバーがコピー元となり、コピー先の権威サーバーにゾーンデータをコピーする。
コピー元となるサーバーを「プライマリサーバー」、コピー先となるサーバーを「セカンダリサーバー」と呼ぶ。

権威サーバーが複数ある場合、フルリゾルバーはどの権威サーバーにアクセスすべきだろうか。

RTT（Round Trip Time）が短い権威サーバーに優先的に問い合わせる。


### 正引きと逆引き

ドメイン名に対応するIPアドレスを検索することを、「正引き」と呼ぶ。
その逆は「逆引き」。


## リソースレコードの情報

### SOA

委任により分割されたゾーンの境目をゾーンカットといい、ゾーンカットの小ゾーン側では、ゾーンカットのドメイン名をゾーン頂点という。
`jp`が`example.jp`を委任している場合、`example.jp`というドメイン名はゾーン頂点になる。
ゾーン頂点には、SOA（Start of Authority）リソースレコードを設定する。
委任されたゾーンを管理する際に必要な情報を設定する。

### NS

委任に関する情報を設定する。
ゾーンカットの親側と、子側の双方のゾーンに設定する必要がある。

自分のゾーンのNSリソースレコードと、子側双方を設定する。
 
NSリソースレコードには、ゾーンの権威サーバーのホスト名を設定する。
ゾーンを管理する権威サーバーが複数ある場合、全てを列挙する。

権威サーバーについては、必要に応じてAレコードやAAAAレコードを登録する。

### MX

設定したドメイン名のメールを受け取れるようにするための情報も、そのゾーンの権威サーバーへ設定する。
MXレコードには、メールサーバーの優先順位が符号なしの数値で設定されている。リストの中で最も小さい値のメールサーバーから順に、メールの配送を試みる。