みんな使ってるDNSの仕組み知ってる？(基礎編)

みなさんお疲れ様です。23卒の翔太です。
今回はみなさん一度は聞いたことがあるDNSについて、あまりに無知だな〜と感じたので、お勉強してみました。
間違っていたらご指摘お願いいたします！

# DNSとは何か？
DNS(Domain Name System)とは、「名前解決」を行うシステムです。
「名前解決」とは、ドメイン名とIPアドレスの対応を管理し、利用者からの要求に応じてドメイン名に対応するIPアドレスを探し出すことができることを言います。

次章からは、DNSの機能について説明していく上で必要な知識について説明していきたいと思います。

# DNSが作られた背景と必要な前提知識
### IPアドレスのわかりにくさとその対処法
インターネットでは、「通信したい相手の指定」と「通信してきた相手の判別」に**IPアドレス**(通信相手を識別するためのアドレスで、通信プロトコルの一種)を用います。
現在使われているIPアドレスは、「IPv4」と「IPv6」の2種類があり、以下のような形式で書かれます。
・IPv4アドレスの例：192.0.2.1
・IPv6アドレスの例：2001:db8::1

上記の例を見てわかるように、IPアドレスを人間が覚えたり間違えないように使うことは容易ではありません。

そこで考え出されたのが、「**名前とIPアドレスの対応付け**」です。

人が覚えやすく使いやすい名前で相手を指定できるように名前とIPアドレスを紐づけることで、IPアドレスの使いにくさに対処したのです。


### 階層化と委任
名前とIPアドレスの対応付けは、インターネットが始まった当初は「HOSTS.TXT」というテキストファイルにインターネットに接続しているすべてのホストのIPアドレスと名前(ホスト名)の対応を記載して管理していました。
簡単に言えば、一つの組織がIPアドレスと名前(ホスト名)の対応表の情報を集中管理していたわけです。

しかし、インターネットの普及で接続されるホスト数が激増し、一つの組織で集中管理が難しくなりました。

そこで考え出されたのが、「**階層化と委任**」です。
階層化と委任という考え方は、会社規模で組織を管理する際に使われます。
もし小さな会社であれば、社長がすべての社員を管理する(集中管理)ことができるでしょう。
ただ、会社の規模が大きくなればなるほど社長一人で管理するのは難しくなります。

そのため、以下の図のように、
業務の種類ごとに部門を作り、それぞれの部門の役割を決め、組織体制を明確にします。
これを「**階層化**」と言います。
また、それぞれの部門長(管理者)を決め、部門長に管理を任せることを「**委任**」と言います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/c413e24b-7fb3-6ff5-bbd3-9e866a9705a5.png)

このような階層化と委任の仕組みを使って、ホストのIPアドレスと名前を管理しようというのが今回のアイデアで、**分散管理**の考え方につながります。

### 分散管理
インターネットでは、「**名前空間（各要素に一意の異なる名前を付けなければならない範囲）**」と呼ばれる1つの空間を全体で共有しています。そこで、名前空間の一部を分割し、切り出した名前空間を信頼できる他者に委任するという仕組みが採用されました。

委任した側ではその名前空間を誰に委任したかという情報のみを管理し、その名前空間の管理の責任は、委任された側が持つことにまります。

このような形をとることで、管理する名前空間とその責任を複数の管理者に分割した**分散管理**が可能になりました。

また、委任によって管理を任された範囲を「**ゾーン**」と言い、委任した人と委任された人は「**親**」と「**子**」の関係になります。

そして、それぞれのゾーンの管理者は「**ネームサーバー**」と呼ばれるサーバーで情報を管理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/fce3d613-45fb-78c9-a300-a16dfd3b0e9b.png)


上記図のように、名前空間を分割、委任(階層化と委任)することで、それぞれの管理者の負担を軽減で切るようになりました。
また、管理範囲が大きくなればその範囲を必要に応じて分割し、新しい管理者に委任すればよくなったことで、組織の成長や変化にも柔軟に対応することができるというわけです。


### 名前を一意にするための仕組み(ツリー構造)
インターネットが始まった当初は、一つの組織がIPアドレスと名前(ホスト名)の対応表の情報を集中管理していたと説明しましたね。
このメリットは、一元管理することで、名前空間全体の名前が**一意**に決まるというところです。
そして、現在は管理負荷を下げるために分散管理を行なっているということも話しましたね。
ただ、この分散管理を何も考えずに行うと、集中管理のメリットである名前空間全体の名前が一意性を保てない可能性があります。
そこで、分散管理でもこのメリットを失わないように、階層化と委任による管理の仕組みは、管理の頂点を1つにする形で設計されました。
このような1つの頂点から枝分かれする構造を「**ツリー構造**」言います。
ツリー構造では、枝分かれした先のそれぞれの階層で名前が重複しないように管理することで、名前空間全体の名前が一意に決まることを保証できます。

### ドメイン名の構成
インターネットではツリー構造で分割されたそれぞれの名前空間の範囲を「**ドメイン**」、その範囲を識別するためにつけられた名前を「**ドメイン名**」と言います。

ドメイン名は、以下のようにURLやメールアドレスの一部として使われるもので、インターネットのホストを特定するための**識別子**として使えるようになります。

例えば、以下の図の「jprs.co.jp」や「example.jp」と書かれた部分がドメイン名になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/a45a0951-d7e6-9ab6-af1c-82b8c1068373.png)

ドメイン名は、文字列を「.(ドット)」で繋げた形で構成されます。
それぞれの文字列を「**ラベル**」と言います。
実は、ドメイン名の最後にも「.」がついているのですが、省略されています。
この省略された「.」は「**ルート**」を表しており、ルートを起点に右側から順番に、以下のように呼ばれています。
・**TLD**(Top Level Domain、トップレベルドメイン、ティーエルディー)
・**2LD**(2nd Level Domain、セカンドレベルドメイン)
・**3LD**(3nd Level Domain、サードレベルドメイン)

ドメイン名は以下の図のように階層構造になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/5806a737-6fb0-4205-eb03-8e87f2c6c16b.png)

階層構造の導入により、「ツリー構造とは」でも説明した通り、その階層での名前空間のみを一意にすれば良くなり、それぞれの階層における名前付けの自由度が上がります。
例えば、以下の図のように、階層構造の導入前は「www」という名前は1台でしか使えませんが、階層構造を導入することで複数の課で「www」という名前を使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/e8e77b13-f70b-aa09-8f11-803c89a3bfef.png)


### サブドメインについて
ある名前空間(名前空間1)の範囲が別の名前空間(名前空間2)の範囲に含まれている場合、名前空間1は名前空間2の**サブドメイン**と呼ばれます。
例えば、ドメイン名がwww.example.jp.だとすると、以下の図のようにwwwはexampleのサブドメインで、wwwとexampleはjpのサブドメインということになります。
サブドメインは、そのドメインの管理者が自由に作ることができます。
そのため、サブドメインを作っても他者には委任しないといったケースも存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/dc84bbfe-4b1b-c2e5-abe3-a1f6ba7a828a.png)

### ドメイン名を使えるようにするために生まれたDNS
DNS(Domain Name System)は、「名前解決」を行うシステムだと最初に説明しました。
ただその背景には、以下のような成り立ちがあったということがお分かりいただけましたか？

・人が覚えやすい名前にするための対策として、「**名前とIPアドレスの対応付け**」の実施
・ホスト数増加による集中管理の難化の対策として、「**階層化と委任とツリー構造によるドメインの分散管理**」の実施


それでは実際にどのようにDNSの仕組みが成り立っているのか次章から見ていきたいと思います。


## DNS
では、どのようにしてDNSの仕組みを作り、どのような手順で名前解決を行なっているのでしょうか？以下の順にて説明していこうと思います。
1. ドメイン名の登録管理の仕組みと管理体制
2. DNSの名前解決
3. DNSの構成要素と具体的な動作


### 1. ドメイン名の登録管理の仕組みと管理体制
インターネットでは分散管理が基本です。DNSも階層化と委任によって、それぞれの組織による分散管理を行なっています。
しかし、インターネットに接続されたホストを識別するためのIPアドレスやドメイン名といった識別子については、利用者が混乱しないように例外として、統一的・一元的に管理される必要があります。
その役割を担って、インターネット上の番号や名前の割り当てを行なってくれる組織のことを「**レジストリ**」と言います。

また登録したドメイン名には有効期限が設定され、その**ライフサイクル**に則って運用する必要がありますが、この登録済みのドメイン名の登録情報の更新や有効期限の更新、廃止などもレジストリが管理します。

簡単に言うと、インターネット上でドメインを参照するには、その参照元となるデータベースへの登録・管理が必要ですよね？
実際にドメイン名を使えるように登録申請を受理して、データベースに登録、登録後の情報の管理を行なってくれる組織が「**レジストリ**」です。

レジストリの主な役割は以下の6つになります。
1. レジストリデータベースの管理
    そのドメイン名を登録するために必要となる以下の図のような**登録情報**を蓄積し、管理する「**レジストリデータベース**」を運用します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/e3608ad4-ba9a-5c81-ab32-af61052495df.png)

    
2. ポリシにー基づいた登録規則の策定
    レジストリは、自分が登録管理するドメイン名のポリシーを定めます。
    そして、そのポリシーを実現するための登録規則や細則などを決めて、利用者に周知します。
    ドメイン名のポリシーというのは、各TLDに存在しているそれぞれのレジストリがTLDを管理し、定めている管理のポリシーや登録規則のことです。
    TLDでは、大きく以下の2種類に分けられます。
    ・国や地域ごとに割り当てられる：
    　ccTLD(Country Code Top Level Domain)
     　例：.jp(日本)、.cn(中国)
     
    ・国や地域によらない：
    　gTLD(Generic Top Level Domain)
     　例：.com、.net
     
2. 登録申請の受付
    レジストリは、登録者からドメイン名の登録申請を受け付けうます。登録されたドメイン名を規則に基づいて審査し、受け付けた情報をレジストリデータベースに登録します。
    
2. Whoisサービスの提供
    レジストリは、自身の管理するドメイン名の情報を**Whois**サービスで提供します。
    Whoisサービスとは、ドメイン名やIPアドレスのレジストリが管理する登録・割り当て情報をインターネットに公開し、利用者が参照できるようにするサービスのことです。
2. ネームサーバーの運用
    管理対象となるドメイン名をインターネット上で利用可能にするネームサーバーを管理・運用します。レジストリのネームサーバーでは、登録者が登録した委任の情報が管理されます。
2. 情報発信・教育啓発活動
    インターネット全体の円滑な運用を目的として、多くのレジストリがインターネットにおけるポリシーやガバナンス、技術などの各分野における情報発信や教育活動などを行なっています。

レジストリは上記の主な役割は6つあると説明しました。
ただし、現在の主要なTLD(.jp、.com、.netなど)では、「**レジストリ・レジストラモデル**」が採用されています。
    レジストリ・レジストラモデルとは、ドメイン名の登録管理を以下のような2つの役割に分離して行います。
    ・ドメイン名登録者からの申請を取り次ぐ役割を担う**レジストラ**(役割1~4)
    ・ドメイン名の一元管理を行う役割を担う**レジストリ**(役割5~6)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/bbc521ce-81bc-bc6e-b2aa-92be2409d541.png)

役割を分割する理由は、ドメイン名の登録について、登録されるドメイン名を一意に保ちつつ、価格やサービス面における多様性を確保するためです。
そのため、1つのTLDに対してレジストリは1つですが、レジストラは通常、複数存在し、それぞれが**独自のサービスメニューや価格を設定**している。
登録者はその中で**自分に合ったレジストラからドメイン登録を申請**できます。
また、レジストラ・レジストリモデルには、レジストラを介して登録したドメイン名を別の登録者に再販する「**リセラ**」も存在します。
簡単に言ってしまえば、リセラは登録車とレジストラの中間業者で、ドメインの登録代行業者です。
そのため。登録者からするとドメイン登録時の取引先がレジストラとリセラの場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/26c87df4-81dc-8d1b-462e-12615e862e89.png)

ここまでで、ドメインがどのように登録されているのかはわかりました。
では、実際にドメイン登録と使えるようになるまでに登録者が行う作業は何なのか、登録者、レジストラ、レジストリ視点で全体の流れについて説明していきたいと思います。



#### ドメイン登録の手順
ドメイン登録の流れは以下の図の流れです。

〇登録者が行うこと
1. ドメイン名が登録可能かどうかを調べる
        [Whoisサービスサイト](https://whois.jprs.jp/)からドメイン名が登録済みかどうかを以下画像のように調べてください。「該当するデータがありません。」と結果が出た場合のみ、そのドメイン名を登録することができます。
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/8e1743e5-2891-6464-70be-076892a71fb7.png)
 2. ドメイン名を申請可能な事業者を選ぶ
    次に、登録したいドメイン名を申請可能な事業者を選びます。
    今回登録しようとしているのは、jpドメイン名です。
        「1. ドメイン名の登録管理の仕組みと管理体制」で述べたように、jpドメインはレジストリ・レジストラモデルを使用しているため、複数の事業者が取り扱っています。そのため、その事業者の中から価格やサービス内容などを比較し、自分のニーズに合った事業者(レジストラ)を選びます。
3. 提出すべき書類を揃える
        ドメイン名を登録する場合、登録者の連絡先や電話番号などの情報が必要となります。また、ドメイン名の種類によっては登録のための要件を満たしていることを証明する必要がある場合があります。

〇レジストラが行うこと
1. 申請内容を確認する
    まず申請された内容を確認します。
1. レジストリデータベースへの登録を申請する
    申請内容を確認したら、レジストリデータベースへ登録するための申請をレジストリに提出します。

〇レジストリが行うこと
1. レジストラから登録申請を受け付けたレジストリは、その内容を確認します。
1. 内容を登録要件を満たしている場合、レジストリデータベースに登録します。これによって、ドメイン名の登録が完了します。
1. ドメイン名の登録が完了したら、レジストリからレジストラへの登録完了通知を返し、その通知を受け、レジストラは登録者にドメイン名登録完了通知を送ります。

これでドメイン名登録までの流れはばっちりですね！
今度は、登録後にドメイン名を使えるように必要なことを登録者、レジストラ、レジストリ視点で全体の流れについて説明していきたいと思います。

#### ドメイン名が使えるようになるまでの手順
ここまでで登録はできましたが、ただ登録しても「**そのドメイン名のWebサイトにWebブラウザでアクセスすることはできません**」。
いくつかの手順が必要となります。今回は「example.jp」を登録して、ドメイン名を使えるようにする手順を説明します。
〇登録者が行うこと
1. 自分のドメイン名を取り扱うネームサーバーをインターネット上で動かす
    ドメイン名を使えるようにするためには、そのドメイン名の情報を取り扱う「ネームサーバー」をインターネット上で動かす必要があります。
    このネームサーバーは、**インターネット上のどこからでもアクセスできるようにしなければいけません**。
1. 登録したドメイン名に関する情報を1で動かしたネームサーバーに設定する
    1のネームサーバーに、登録したドメイン名(example.jp)の情報を設定します。
    これにより、以下の図の例のように、example.jpを使えるようにするために必要な「example.jpのIPアドレスは192.0.2.10」という情報が、ネームサーバーに設定されることになります。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/64b22504-17bc-3abb-5ad0-a5887a4d6d30.png)    
3. ネームサーバーがインターネットから聞かれたことに答えられるか確認する
    ネームサーバーはインターネットからアクセスされます。設定した情報をきちんと答えられるかどうか、具体的には「example.jp」のIPアドレスは？と聞かれたときに、「example.jpのIPアドレスは、192.0.2.10です」と答えられる必要があります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/28e67884-8955-0ce4-858b-f63bb352c42a.png)
4. ネームサーバーの準備が完了したら、ドメイン名登録の際に申請した事業者(レジストラ)に、ネームサーバー情報の設定を申請します。

〇レジストラが行うこと
申請者からの申請を受け付けたレジストラは、レジストリデータベースへネームサーバー情報を設定するための申請を、レジストリに提出します。

〇レジストリが行うこと
レジストラからの申請を受け付けたレジストリは、ネームサーバー情報をレジストリデータベースに登録し、レジストリの管理するネームサーバーにその情報を設定します。
今回は、レジストリが管理するjpゾーンのネームサーバーに設定することになります。
これによって、レジストリと登録者の関係がDNSにおける親子関係になります。
ここまでの手順が完了すると、実際にWebサーバーを立ち上げて、そのドメイン名のWebサイトにWebブラウザでアクセスできるかを確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/c74980a6-0749-2f01-1fae-e442d309b1a6.png)


ここまでで、実際にドメイン名を使えるようにする方法はわかりました！
では、次はDNSの名前解決がどのような手順で行われているのか、について説明していきたいと思います。

### 2. DNSの名前解決
DNSの名前解決は、基本的に「**問い合わせ**」と「**応答**」の繰り返しで実行されています。
そして、名前解決には以下の3つの約束事があり、この約束事に従って名前解決を行います。
1. 問い合わせの応答は、常に1対1で対応する
1. 情報を知りたい人は、知りたい情報の名前と種類(タイプ)を指定して問い合わせる
1. 情報を提供する人は受け取った問い合わせに対し、自分が持っている情報を応答する

そして、忘れてはならないのが、名前解決を行う際は、**ルートを頂点として、階層構造を順番にたどることで目的の情報を入手**しています。

具体的な動作の例で示してみましょう。例として「example.jpの名前解決」を行います。
以下の図では、以下の手順でルートからTLD、2LDの順にドメインに名前解決を行い、目的のIPアドレスを取得しています。
①問い合わせ
    まず階層構造の頂点のルートのネームサーバーに知りたい情報(example.jpのIPアドレス)と種類を指定して問い合わせを行います。
②応答
    ルートはjpを委任しているため、委任先の情報(jpのネームサーバー情報)を応答します。
③問い合わせ
    先ほど応答で送られてきた委任先の情報(jpのネームサーバー情報)に知りたい情報(example.jpのIPアドレス)と種類を指定して問い合わせを行います。

④応答
    jpはexample.jpを委任しているため、委任先の情報(example.jpのネームサーバー情報)を応答します。

⑤問い合わせ
    先ほど応答で送られてきた委任先の情報(example.jpのネームサーバー情報)に知りたい情報(example.jpのIPアドレス)と種類を指定して問い合わせを行います

⑥応答
    example.jpのネームサーバーはexample.jpのIPアドレスを知っているため、IPアドレスを応答する。

これが、DNSによる名前解決の基本的な流れになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/6e634b60-3cbb-4ba8-c8c5-8bec03f4b4a3.png)

ただし、これでは、名前解決を行う際に何度もルートから順に問い合わせと応答を繰り返さなければなりません。
それでは、とても非効率だということで、情報が欲しい人(今回はAさん)の代わりに名前解決を行い、一定時間その情報を保っておく機能を持つ「**キャッシュ**」が使われるようになりました。

キャッシュは、名前解決を行った後、一定期間保っている情報を他の情報の欲しい人(例えばBさん)から要求された場合にも即座に蓄えているその情報を使って応答することができるため、非常に名前解決時間の短縮に役立ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/57ca258f-d3f0-1f93-eb63-241c76f54939.png)


ただし、DNSが運用しているうちに、名前解決が失敗したとき再アクセスが行われる可能性があるため、キャッシュのみでは不十分だということに気づきました。
そこで、目的のリソースレコードが存在しなかった場合もキャッシュする「ネガティブキャッシュ」が実装され、同じ内容の2回目以降の名前解決要求には「その問い合わせに対応するソースレコードはありませんでした」とレコードも返すことができるようになりました。


### 3. DNSの構成要素と具体的な動作
「2. DNSの名前解決」における役割分担は以下の3種類になります。
1. 情報が欲しい人
1. 情報が欲しい人からの依頼を受けて、名前解決をする人(キャッシュ)
1. 情報を提供する人(ネームサーバー)

上記3種類がそのまま、DNSの基本の構成要素となります。DNSではこの構成要素に対して、以下の名前が割り当てられています。
1. スタブリゾルバー
1. フルリゾルバー
1. 権威サーバー

つまり、もうすでにみなさんDNSの仕組みについて知っているといっても過言ではないということです。
「2. DNSの名前解決」で解説した以下の図を簡易的にかつ、キャッシュを加え、DNSの構成要素として、図にして表すと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/da61857e-3ce4-e332-ae8f-4817724907d9.png)


以下の図のように置き換えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/71b37b84-3d15-362e-7b7c-953c65049ecd.png)

最後に、権威サーバーのドメイン名やホスト名の設定情報である「**リソースレコード**」の構成について説明したいと思います。
リソースレコードでは複数の設定がまとめられています。
例えば、jprs.jpのIPv4アドレスを名前解決したときの、jprs.jpの権威サーバーが返す応答の一部だと、以下のような構成になってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/da643717-a9e9-d1dc-99a2-c2863c497eba.png)

それぞれのリソースレコードの意味は以下の表のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/18e3909d-5c19-4a3c-63ad-f113c019b2de.png)

また、リソースレコードの中でもよく使われるリソースレコードのタイプは以下の図の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005551/88fdf8e9-5bc0-57c9-b28c-2b7ae8c4f692.png)


## おわりに
DNSの基本的な仕組みについて理解できましたでしょうか？
今回はDNSの仕組みについて基本的な内容しか取り上げることができませんでした。
そのため、次の内容では、「**みんな使ってるDNSの仕組み知ってる？(実践編)**」と題しまして、実際にDNSサーバーを構築していこうと思っておりますので、また機会がありましたら見てやってください！



参考文献
・使える力が身につくDNSがよくわかる教科書
・https://www.value-domain.com/media/registry-registrar/#