DNSを完全に理解する

この記事は[Ateam Hikkoshi Samurai Inc. & Ateam Connect Inc.（エイチーム引越し侍、エイチームコネクト） Advent Calendar 2019](https://qiita.com/advent-calendar/2019/hikkoshi) 16日目の記事です。

## はじめに
今年、いくつかのサービスのサーバ移管をやらせていただく機会があったのですが、
いざ設定時に（本当の意味での）「DNSなんもわからん・・・・」となったので、
DNSについて完全に理解するために学んだことまとめてみました。

## そもそもDNSとは？
DNSとはDomain Name Systemの略で、ドメイン名とIPアドレスの対応を管理して、要求に応じてドメイン名に対応するIPアドレスを返してあげるシステムのことです。（名前解決）

### ゾーンと委任
DNSでは、ドメイン名に対応するかたちで管理範囲を階層化し、
**委任**することで管理を分散しています。
委任によって管理を任された範囲を**ゾーン**と呼びます。
そして、ゾーン管理者は**ネームサーバ**で情報を管理しています。
ネームサーバで管理しているのは下記の2つの情報です。

- そのゾーンに存在するホストのドメイン名とIPアドレス
- 委任先のネームサーバの情報
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93882/9def9247-7250-1228-cbc9-36c49154c7c9.png)


## 名前解決
名前解決するためには以下の3者が登場します。

- スタブリゾルバー　: ドメイン情報が欲しい人
- フルリゾルバー : ドメイン情報が欲しい人からの依頼を受けて、名前解決する人
- 権威サーバー : ドメイン情報を提供する人(ネームサーバ)

例として、webブラウザがhoge.jpにアクセスする場合だと、この3者は以下のような流れで名前解決を行います。

1. 
webブラウザがhoge.jpにアクセスしようとすると、スタブリゾルバーが呼び出されます。
スタブリゾルバーはフルリゾルバーに「私の代わりに名前解決をして、hoge.jpのIPアドレスを教えて下さい。」と名前解決要求をします。

1. 
フルリゾルバーは名前解決要求を受け付けたら、
ルートサーバ（ルートゾーンの権威サーバ）にIPアドレスを問い合わせます。

1. 
ルートサーバは委任情報を渡し、フルリゾルバーは委任情報をキャッシュします。
委任情報をたどって、IPアドレスを持っているサーバまでたどり着いたらそれを受け取って、キャッシュします。

1. 
フルリゾルバーはIPアドレスをスタブリゾルバーに返し、スタブリゾルバーはwebブラウザに返します。

1. 
IPアドレスを受け取ったwebブラウザはそのIPアドレスを指定してwebサーバーへアクセスして、ページが表示されます。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93882/32cbb75f-c1ee-b1f1-de64-e5158b91cceb.png)

## リソースレコード
権威サーバはゾーンの設定情報を**リソースレコード**というかたちで持っています。

### リソースレコードの構成
digコマンドを打つとこのようなかたちで結果が帰ってきます。
` hoge.jp.  300  IN  A  0.0.0.0`
左から、ドメイン名、TTL、クラス、タイプ、データです。
それぞれの意味は下記のとおりです。

- TTL: キャッシュしてもいい時間。秒単位。
- クラス：ネットワークの種類。「IN」はインターネットの意味。
- タイプ：情報の種類。詳細は後ほど

### リソースレコードのタイプ
#### SOAリソースレコード
ゾーンの管理に関する基本的な情報をもっています。
委任により分割されたゾーンの頂点には、このSOAリソースレコードを設定します。
SOAに設定されるゾーンの情報は、下記のようなものがあります。

- MNAME: ゾーンのプライマリサーバのホスト名
- RNAME: ゾーンの管理者のメールアドレス
- REFRESH: ゾーンデータの更新を自発的に始めるまでの時間
- RETRY: ゾーンデータの更新が失敗したときに再更新を試みるまでの時間

などなど・・・

#### NSリソースレコード 
委任に関する情報を持っています。
NSリソースレコードは委任した側（親）と委任される側（子）と両方で設定が必要です。

#### Aリソースレコード 
ドメイン名に対するIPv4の情報をもっています。
webサーバでの利用だけでなく、IPアドレスを設定する場合必ず使われます。
IPv6の場合は、AAAAリソースレコードを設定する必要があります。

#### MXリソースレコード 
メール配送に関する情報をもっています。
具体的には、そのドメイン名を宛先とするメールの配送先のメールサーバのホスト名一覧を、優先度をつけて設定します。
メールサーバーのホスト名が、自分の管理するゾーン内である場合、メールサーバのIPアドレス(Aリソースレコード)も一緒に設定します。

#### CNAMEリソースレコード 
ドメイン名の正式名を指定するためのリソースレコードで、ホスト名に別名をつける手段として使われます。
具体的にはCDNなど、外部のサービスを自分の運営するサービスで使うときなどに利用します。

#### TXTリソースレコード
任意の文字列を設定することができます。
SPFと呼ばれる、なりすましメール対策のための送信ドメイン認証で使う情報の設定などもこちらで行うことができます。

## まとめ
正直これだけではまだまだ完全理解とはいかないと思いますが、
Route53などで設定するときの参考にはなるとおもいますので、よろしければご活用ください。

## お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](http://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](http://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)よりお問い合わせ下さい。
あるいは、[Qiita Jobs](https://jobs.qiita.com/)の[引越し侍Webエンジニアチーム](https://jobs.qiita.com/employers/a-hikkoshi/development_teams/173)、[自社サービスWebエンジニア／インフラからサービス改善まで！]()、[求む！引越し侍大規模リプレイスにおけるフロントエンドのリードエンジニア募集！](https://jobs.qiita.com/postings/317)の記事をみて、興味が出てきた方は是非Qiita Jobsのチャットでメッセージをください。

## 明日

明日は新卒1年目の @m-otsuka 氏の記事です！
GoogleNaturalLanguageAPIについての記事を書いてくれるらしいです！
乞うご期待！！！！！！:muscle: