<DNS>IPアドレスと名前解決の関係について

#名前解決とは
端的にいうと、
**「IPアドレス(MACアドレスも含む)をドメイン名に変換したり、ドメイン名をIPアドレスに変換したりする」**ことをいう。

IPアドレスは、`192.168.0.2`こんなやつで、**コンピュータ側が認識できるネットワーク上の住所。**
※こちらの記事もご覧下さい：[<IPアドレス入門>IPv4とIPv6の違いについて](https://qiita.com/ichi_zamurai/items/8b1fd68ff834106ef380)
※ちなみに、MACアドレスとはこんなやつ。`FE-F8-AE-33-00-D2` ←適当です。

ドメイン名は、`ichi_zamurai.com`みたいなやつで、
**IPアドレスに紐づける人間側がわかりやすく管理できる住所の名前**


つまり、
`〇〇町1-1-1(192.168.0.1) -> 田中さん家(tanaka.com)`
みたいなイメージか。

たしかに、IPアドレス自体は、ネットワークエンジニアとかめっちゃ細かい人とかだったら管理できるかもだけど、
流石に一般人では、やっぱり具体的な名前がわかりやすいですねえ。




#DNS(Domain Name System)
DNS（Domain Name System）とは、
**IPアドレスとドメイン名をいい感じで変換してくれる`仕組み・システム`**のことで、
その変換の処理を、生き甲斐かつ本業にしているのが、**`DNSサーバー`**。

##DNSサーバーには大まかに2種類ある

###1.フルサービスリゾルバ（DNSキャッシュサーバー）
まず手元のパソコンが**最初に問い合わせる**のが、`フルサービスリゾルバ`。
`DNSキャッシュサーバー`と、その名の通り、IPアドレスとドメインの変換をするキャッシュのレコードがあれば、
それを使って、名前解決してくれます。

もしキャッシュに、変換情報がなければ、
`フルサービスリゾルバ`が頑張って、`権威DNSサーバー`の方に問い合わせに行きます。（こわいな〜こわいな〜）
※一度、権威に問い合わせたらもう一回聞くのが怖いので、ちゃんとキャッシュにカンペ用のメモをつけます。


###2.権威DNSサーバ（DNSコンテンツサーバー）
`フルサービスリゾルバ`が、キャッシュを持っていなくて、名前解決できなかった時に、
モノホンの情報をもっている`権威DNSサーバー`に問い合わせて、名前解決してもらいます。

DNSコンテンツサーバーと、その名の通り、いっぱいコンテンツを持っていますが、
管理している**エリアは範囲が決められています。**

その情報が書かれているファイルは、いわゆる`ゾーンファイル`と言われていますが、
その名前解決に使える情報が書かれていて、
宝の持ち腐れにならないように、
権威を奮って、フルサービスリゾルバに優しく答えを教えてあげます。


###ゾーンファイルの中身は？
ゾーンファイルには、

```
【ドメイン名】 IN A 【IPアドレス】
【ドメイン名】 IN AAAA 【IPアドレス】
```
みたいに書かれています。
例えば、

```
ns1.exmaple.com. IN AAAA 0:0:0:ffff::c000:0201
```
みたいな。

###流れを解説
名前解決の問い合わせの流れは、
`パソコン（ブラウザ）=>DNSキャッシュサーバ=>DNSコンテンツサーバ`

DNSでは、ドメイン情報を階層的に管理していて、
ドメイン解決する時にネームサーバーに問い合わせする流れは、
ホスト.ドメインをひっくり返して、
`com.ichi_zamurai.www`
という流れ。
`com`が上位ドメインにあたり、最初に問い合わせ。分からないときは、下位ドメイン`ichi_zamurai`NSレコードに示されたサーバに問い合わせ…
という感じで、プロセスを繰り返していくシステムらしい。


てな感じで、仕組みがわかったところで




#DNSレコードの種類
DNSレコードとは、ゾーンファイルに書かれた詳細データの単位、つまり「レコード」のことを言います。
種類としては、以下の表の通りです。
いっぱいあるので一部だけの紹介になります〜


| 種類 | 説明 | 例 |
|:-:|:--|:--|
| Aレコード | IPv4でドメイン名(FQDN)とIPアドレスを紐づけるレコード | www.ichi_zamurai.com IN A 192.168.1.10 |
| AAAAレコード | IPv6でドメイン名（FQDN）とIPアドレスを紐づけるレコード | www.ichi_zamurai.com IN AAAA 0:0:0:ffff::c000:0201 |
| CNAMEレコード | ドメイン名(正規ホスト)のエイリアス（別名）を紐づけるレコード。<br>特定のドメイン名(FQDN)を別のものに転送する時などに利用。 | mobile.ichi_zamurai.com. IN CNAME www.ichi_zamurai.com. |
| MXレコード | ドメイン宛のメール送信先（メールサーバ）のドメイン名(FQDN)を紐づけるレコード。<br><br>「～@ichi_zamurai.com」宛のメールは「mail.ichi_zamurai.com」へ送信してって意味。<br><br>「10」は任意の整数で、優先度をで表したもの。同じドメインにサーバを複数設定したとき、小さい値から優先的に配送をやってくれる | ichi_zamurai.com IN MX 10 mail.ichi_zamurai.com. |
| NSレコード | ドメインのゾーン情報を管理するDNSサーバを定義するレコード<br>複数の権威DNSサーバがあれば、同じドメインに対してサーバの数だけNSレコードを列挙 | ichi_zamurai.com IN NS ns1.ichi_zamurai.com.<br>ichi_zamurai.com IN NS ns2.ichi_zamurai.com. |
| TXT（SPF）レコード | ホスト名の付加情報を自由に定義するレコード。<br><br>DNSを拡張してプロトコルや仕組みを実装する際、必要な情報の定義などに使われることが多い。いわゆる人間用のメモみたいな<br><br>SPFやDKIMなどのメール送信元認証・確認などの技術でも使われる | www.ichi_zamurai.com IN TXT "Please Dont Touch Me"<br>ichi_zamurai.com. IN TXT "v=spf1 ip4:198.51.100.1 ~all"<br>意味：「198.51.100.1」から送られたメールは正規のもので、それ以外からのは不正だよ | 
|SRVレコード | 負荷分散サービスの提供/冗長性の確保/サービスポート番号の通知を可能にするレコード<br>提供しているホスト名や下位プロトコル（UDPかTCPか）、ポート番号などを任意に定義することができる | ichi_zamurai.comドメインのFTPサービスはftp.ichi_zamurai.comのTCPの21番ポートで提供してるよみたいな |
| DSレコード | サブドメインでDNSSEC(DNS Security Extension)を利用するためのレコード| DNSクライアントがサーバへ問い合わせを行なう際に、サーバからの応答が悪意の第三者によって差し替えや改竄が行われていないことを検証するなど応答が正当なものであることを確認する方式を定めた規格  |
| PTRレコード | 	IPアドレスに対するドメイン名 | 192.168.1.10 IN PTR www.ichi_zamurai.com.|
| HINFOレコード | 	ホストの追加情報リソース、ハードウェア・ソフトウェア（OS）情報を記述するレコード| ichi_zamurai.com. IN HINFO SonyL700 Linux-Kernel2.4 |
| SOAレコード | 	権威DNSサーバが管理しているゾーン情報が書いてある行 | @     IN SOA 【DNSサーバのドメイン名】 【連絡先】 (<br>【シリアル番号】<br>【更新チェックの間隔】<br>【リトライ間隔】<br>【問い合わせ諦めるぜ期間】<br>【ネガティブキャッシュの有効期限】<br>)|

###<補足>
- `FQDN`とは`Fully Qualified Domain Name`の略で、`ホスト名`+`ドメイン名`のこと。
    - 「`.`」がついているのは`FQDN`であることを意味する。
    - 例：`www`+`.`+`ichizamurai.com`みたいな。
- `CNAMEレコード`：ドメイン名(FQDN)は、**`Aレコード`が登録されている必要がある**。※特定のファイルやサブディレクトリは指定不可
    - ホスト名なしのCNAMEレコードは登録できない。
    - CNAMEレコードで定義された別名は、**`MXレコー`ドや`NSレコード`を設定できない**
- MXレコード、NSレコードを設定するには、ドメイン名(FQDN)は、**`Aレコード`が登録されている必要がある**
- `IN`は`IN/OUT`ではなく、**`Internet`**のIN！！

#まとめ

名前解決はちゃんとされましたが、頭の中では解決されておりません。

以上、
ありがとうございました。