DNSまわりまとめ

# DNS(Domain Name System)とは
DNSは通信のプロトコルです。
ドメイン名とIPアドレスを結びつけるシステムのことを言います。

ドメイン名からIPアドレスに変換（正引き）
example.com → 192.168.xxx.xxx

IPアドレスからドメイン名に変換（逆引き）
192.168.xxx.xxx → example.com

のような仕事をしてくれています。

代表的なDNSマネージドサービスとしては
Route 53、Cloud DNSなどがあります。

# DNSサーバとは
DNSを提供するサーバのことです。
つまりドメインとIPアドレスを紐付けて教えてくれるサーバです。

DNSサーバには大きく分けるとネームサーバと権威DNSサーバの2種類があります。
## ネームサーバ
ネームサーバまたの名をDNSキャッシュサーバ、またの名をフルサービスリゾルバというものです。
このDNSサーバはキャッシュというファイルを持っています。
このキャッシュには過去に問い合わせがあったドメイン、IPを記録しています。

ネームサーバの仕事としては問い合わせがあったら
自分が持っているキャッシュを確認します。
そこで問い合わせ内容のドメインのIPがあればIPを返します。
IPがない場合は権威DNSサーバに仕事を依頼します。
PCからまず問い合わせを受けるDNSサーバ,別の表現をすれば
お名前ドットコムなどのドメインレジストラ管理画面で設定しているのがネームサーバです。

## 権威DNSサーバ
トップレベルドメイン(.comや.orgなど)ごとに担当が決まっていてゾーンファイルという
ドメインとIPアドレスを管理しているゾーンファイルを持っているサーバを権威DNSのサーバと呼びます。
問い合わせがあった際にはゾーンファイルから該当のドメインが見つかればその情報を返します。
担当が違う場合つまりexample.comというアドレスのIPを問い合わせされた場合.orgを管理している
権威DNSサーバの場合.comを管理している権威サーバに仕事を流します。
また無効な値で問い合わせされた際はエラーを返します。

# ゾーンファイルとは
権威DNSサーバがつかうドメインとIPアドレスの対応表のことです。

# DNSが使うポート
DNSはデフォルトでは５３番のポートを使用します。

# DNSレコード
ゾーンファイルに記載されているのがDNSレコードでIPv4、IPv6のアドレスを指定できたりサブドメインを指定できたりします。

| レコード名 | 解説 |
|:-|:-|
| Aレコード  | ホスト名（ドメイン名）からIPアドレスを探す（正引き）時に使われます。IPv4を使用します。|
| PTRレコード | IPアドレスからホスト名（ドメイン名）を探す（逆引き）時に使われます。ポインターリソースレコードと呼ばれます。|
| AAAAレコード  |  IPv６を使用する際に使われます。ホスト名（ドメイン名）からIPアドレスを探す（正引き）時に使われます。|
| SOAレコード | ドメインのDNSサーバの名前や管理者のメールアドレスなどのドメイン管理情報を参照する時に使われます。キャッシュ有効時間（TTL）なども指定できます。|
| NSレコード | 特定のドメインに対しての上位や下位のネームサーバーを指定しています。権威DNSサーバを探す時に使われます。|
| MXレコード  | メール送信先を探す時に使われます。メール送信先のホスト名（ドメイン名）はAレコードで定義されていて、メールサーバのIPはここから取得して使われています。|
| CNAMEレコード  | ドメインやホスト名（ドメイン名）の別名（エイリアス）をつける時に使われます。サブドメイン、www付きのドメインなどはCNAMEで指定します。|
| TXTレコード  | ホストに関連付けるテキスト情報が記載されています。例としてドメイン所有の認証、SPFやDKMなどのメールセキュリティなどに使用されます。|
| SPFレコード  | SPFとは送信ドメイン認証技術でこれを使って送信可能な送信元ドメインを指定しています。こうすることでなりすましメールを防ぐことができます。|

### Aliasレコード
これはAWS独自のレコードでRoute 53からAWSサービスのエンドポイントを指定する時に使用することができます。AWSサービスとはELB、S3、CloudFrontなどのサービスで、通常CNAMEで指定するような場面でこのAliasが使用できます。メリットとしてCNAMEは「ドメイン　→　CNAMEレコードのドメイン名　→　IPアドレス」という流れで名前解決するのに対して、Aliasレコードは「ドメイン　→　IPアドレス」という名前解決ができパフォーマンスの向上が狙えます。

# スタブリゾルバ
OSの中のプログラムでドメインの解決を担当しています。実態はソケットライブラリの一部です。

# ネームサーバと権威DNSサーバの違い
| 機能・特徴 | ネームサーバ | 権威DNSサーバ |
|:-:|:-:|:-:|
|  参照するファイル | キャッシュファイル  | ゾーンファイル  |
| 担当する範囲 |  特に決まっていない | トップレベルドメインごと  |
|  キャッシュ機能 | ある  | ない  |
| 無効な値が渡された時  |  他に投げる | エラーを返す  |

# ウェブサイト表示の流れ
## １．hostsファイルを見る
macOSなどのLinux系OSであれば/etc/hostsという形でファイルがありテキストエディタなどで開くことができます。OS内に装備されているスタブリゾルバはまずこのhostsファイルを見に行きます。

※【hostsファイルの具体的な使用例】ローカル開発環境を構築した際などはこのhostsファイルを自分で書き換えて自分のPC内でサーバを構築しそこへアクセスするといったような使われ方もします。

## ２．キャッシュサーバに聞きに行く
前述のフルサービスリゾルバに聞きに行きます。ここはもうPCの外インターネット上です。キャッシュがあればここからIPをもらえます。キャッシュがなければ３へ。

:::note info
この時フルサービスリゾルバのアドレスはどうやって知るんだ？という疑問が出てきます。これは公共無線LANであればDHCPサーバ、家庭のLANであればISPから借りているルータから自動的に割り当てられるという動きになるようです。会社であればPCのDNSアドレスに設定されているIPで社内LAN内に独自のDNSサーバを組んでいたりもするようです。またこの時フルサービスリゾルバのIPだけではなく、複数の権威DNSサーバのアドレスも受け取ることもあるようでこの辺りは状況によってケースバイケースのようでした。
:::

## ３．権威DNSサーバに聞きに行く
権威DNSサーバではトップレベルドメイン（.comや.netなど）ごとに管理しています。『example.comのIPが知りたい』という問い合わせが.net担当の権威DNSサーバに来た場合『担当がちがうので.com担当の権威DNSサーバ』にいって下さいと紹介を受けます。また問い合わせ内容がメチャクチャな場合はエラーを返します。

## ４．IPのサーバへコンテンツをもらいに行く
IPが帰ってきたらそのサーバへコンテンツをもらいに行きます。そして受け取ったデータをブラウザが組み立てて表示してくれています。

### 余談
ただもっと細かく言えば特に最近のウェブアプリなどはここから先もCDNがあったりロードバランサがあったり、ウェブサーバ、DBサーバなどがスケーリングしながら動いていることも増えてきています。ほぼ数秒で表示されるサイトも結構色々なプロセスを経て表示されているんですね。

#### DNSの問い合わせはUDPで行われる
DNSの問い合わせ、応答の通信はUDPでおこわなれます。ただ、UDPのメッセージ長は512バイト以下に制限されているのでIPv6などでそれを大きく超える可能性が高い場合、EDNS0というものを使用してTCPで通信がやり直される。

# レジストラ提供のDNSのメリット・デメリット
## メリット
- 無料で提供されることが多い
- 管理画面から設定可能で前提知識が少なくすむ
- あらかじめ2代以上の冗長化構成が提供されていることが多い

## デメリット
- TTLの最小値が設定出来ない
- 知識がない担当者が設定すると余計な設定が増えゾーンファイルが汚れる事がある
- ↑に伴って存在しないドメインなどが登録されることがある

# マネージドDNSと自前DNSサーバ
自前DNSサーバの最大の利点は設定を自由にできるというものですが
同時に管理、維持、構築コストはかなりかかります。
そこで最近ではマネージドDNSが重宝されています。
Route 53、Cloud DNSなどクラウドサービスが代表的ですが
これらのメリットとして前述の自由度の高さはそのままに
コストの大幅な削減があります。
さらにこれまでになかったメリットとしてterraformなどを利用した
Infrastructure as Codeが導入しやすいというものがあります。
これはDNSサーバの設定をプログラム化しさらにGit管理することで
オペレーションミスを削減し、バージョン管理することで
経緯を記録し、確認、再発防止に役立てることができます。

# 参考情報
以下のコンテンツのおかげでDNSの理解が深められました。感謝です。
### 書籍
Linuxで動かしながら学ぶTCP/IPネットワーク入門
Software-Design-2020年11月号
Amazon Web Services パターン別構築・運用ガイド
マスタリングTCP/IP入門編
### webサイト
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1287.html)
[レコードの種類9つ紹介！dnsの概要](https://www.fenet.jp/infla/column/server/%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%A8%AE%E9%A1%9E9%E3%81%A4%E7%B4%B9%E4%BB%8B%EF%BC%81dns%E3%81%AE%E6%A6%82%E8%A6%81%E3%82%84%E7%89%B9%E5%BE%B4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)