AWS Route53 を利用する前に DNS の基礎知識について理解する

## ドメイン名の基本
### ホスト名とは？
- サーバやクライアントにつけられた名前のことをホスト名と呼ぶ
- Mac の場合ターミナルから下記コマンドでホスト名を確認可能

```sh
$ scutil --get ComputerName
$ scutil --get LocalHostName
```

- しかし別の場所に同じホスト名が存在した場合、それらを区別することができないため、別の情報を付与する必要がある

### ドメイン名とは？
- 上述の通り、ホスト名だけではノードを一意に識別することはできないため、ホスト名に対して`どこの`という情報の修飾を付与することが必要
- この`どこの`にあたる修飾がドメイン名で、`.`区切りで`どこの`という情報を付与する
- 例えば、`www`というホスト名に対して、`example.co.jp` というドメイン名を付与
   - ここで後ろから見て、 `jp` はトップレベルドメイン、`co`はセカンドレベルドメイン、`example`はサードレベルドメインと呼びます。

### FQDN(完全修飾ドメイン名)とは?
- ドメイン名に付与していった結果、完全に修飾した名前を FQDN(完全修飾ドメイン名)と呼ぶ
- FQDNは `https://www.example.co.jp.` のように最後が `.` で終了するが、これはルートを表し、これ以上続くものがないということを示す('jp' のような認知されたトップレベルドメインの場合は最後に`.` をつけないことも多い)

以上をまとめると `https://www.example.co.jp.` という URL の場合、 `www` がホスト名、`example.co.jp` がドメイン名、`https://www.example.co.jp`が FQDN(完全修飾ドメイン名) となる。

### DNS(Domain Name System)
- FQDNに対応するIPアドレスなどの情報を取得する仕組み
- DNSから情報を取得することを名前解決(Name Resolution)と呼ぶ

名前解決するコマンド `nslookup`

```shell
$ nslookup www.google.co.jp
Server:		2404:1a8:7f01:b::3
Address:	2404:1a8:7f01:b::3#53

Non-authoritative answer:
Name:	www.google.co.jp
Address: 172.217.161.35
```

### ドメイン名の登録
- ローカルネットワークに閉じた場合、自分の好きなドメイン名を使用して良い
- インターネットの世界では、任意のドメイン名を利用するには登録が必要
- ドメイン名には種類があり、管理主体や属性によって誰でも登録できるものや特定の条件が存在するものがある
- トップレベルドメイン(TLD)の種類
   - 国別コードトップレベルドメイン (ccTLD)
      - 例１：`.jp`の場合、すでに登録されてなければ誰でも登録できる
      - 例２：`.co.jp`の場合、日本国内で登記を行っている会社のみ登録可
   - 分野別トップレベルドメイン (gTLD)
      - 例１：`.com`の場合、すでに登録されてなければ誰でも登録できる
      - 例２：`.gov`の場合、米国政府機関のみ登録可
   - https://www.iana.org/domains/root/db において、TLDのリストが公開されている

参考：[wikipedia - トップレベルドメイン](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3)

### ドメイン名登録の全体像
下記の用語をまず理解。

- レジストラント(登録者)
   - ドメイン名を登録し、使用するユーザ
- レジストラ(登録取次事業者)
   - レジストリと契約し、ドメイン名登録の窓口となる事業者のこと
   - `Amazon Registrar(Route53)`、`GMOインターネット(お名前.com)`など
   - レジストラによって取得可能なドメインに差がある(全てのレジストリと契約しているわけではないため)
- レジストリ(登録管理機関)
   - TLD を管理する主体
   - TLD のネームサーバ、WHOIS情報を提供する

### WHOIS データベース
- ドメイン名の情報を参照可能なデータベース
   - 登録者情報
   - ネームサーバ情報
   - ドメインの状態

- https://lookup.icann.org/lookup からドメイン名の情報を確認できる
   - qiita.com で検索すると AWS がレジストラとなっていることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/6e9b7886-1c69-75ff-8721-4a233550f7a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/d6066eb2-b4e3-5030-5ba4-c924e7738b35.png)

`whois` コマンドでも確認可。

```shell
$ whois qiita.com
```

## ネームサーバの基本
### ネームサーバ
- `.` を起点に全てのFQDNを探索できるように構成された分散データベース、およびそれを成すひとつひとつのサーバ
- 世界中からアクセスが集まり、ひとつのサーバのみで管理すると負荷が高いため`権限委譲(Delegation)`を行う
   - 権限委譲元を親ゾーン
   - 権限委譲先を子ゾーン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/db14a6c6-78da-4989-30da-588c49725f43.png)

### 権限委譲
- 親ゾーンのNSレコードに子ゾーンのネームサーバを FQDN で指し示すことで権限を委譲
   - 下記例でいうと、オレンジのレコード
- 子ゾーンのネームサーバの FQDN が、子ゾーンで管理されている場合、親ゾーンの返答にそのIPアドレスも含めて指し示す
   - 下記例でいうと、緑のレコードで、Glueレコードという

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/a96cd2f2-4614-8443-5742-948686547cb8.png)

### リソースレコード(RR)と RRSet 
- ネームサーバが保持する情報をリソースレコード(RR)という
- RR は 5つのフィールド(NAME、TTL、CLASS、TYPE、RDATA)を持ち、`NAME`, `CLASS`, `TYPE` の３つの組み合わせが問い合わせのキーになる
- `NAME`, `CLASS`, `TYPE`が同じで、`RDATA`が異なる RR の集合を RRSet と呼ぶ
- ネームサーバは問い合わせに対して、 RRSet 単位で応答する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/f4f85996-2ed7-ffff-c636-591dd11948b1.png)

- CLASS
   - 現在のインターネットは IN のみ使われる
- TYPE
   - 代表的なリソースレコードタイプ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/79d06118-1076-6fa7-6388-02d8006151bc.png)

### レコードタイプ
- SOA (State Of Authority)
   - ゾーンの管理主体であること、権威であることを宣言
      - ゾーンとは、ネームサーバがドメインを管理する範囲
- NS (Name Server)
   - ゾーンを管理するネームサーバの FQDN を指す
   - ゾーン自身と、その親ゾーンの両方に定義

```example.comゾーン
example.com. 3600 IN SOA ns.icann.org. noc.dns.icann.org.
                         2019101513 7200 3600 1209600 3600
```
- A/AAAA
   - FQDN に対する IPアドレスを応答する
   - A は IPv4
   - AAAA は IPv6

```A/AAAAレコード
www.example.com. 3600 IN A 192.0.2.3
www.example.com. 3600 IN AAAA 2001:0DB8::1
```

- CNAME レコード
   - CNAME レコードが存在する場合、名前解決を CNAME が指定する名前に置き換えて継続する
   - ホスト名に別名をつけるつける手段として使われる

```CNAMEレコード
info.example.com. 3600 IN CNAME www.example.com.
www.example.com. 3600 IN A 192.0.2.3
```

## 参考
- [【AWS Black Belt Online Seminar】 Amazon Route 53 Hosted Zone](https://www.youtube.com/watch?v=jFQswFqA9mA)