DNS　学習

# DNS
Domain Name System

「IPアドレス」と「ドメイン名」を変換（**名前解決**）することができる、ネットワーク上に存在するリソースを識別するための **分散型システム**。

中央集権型ではないため、1 台のサーバが故障しても別のサーバによってシステム全体が稼働し続ける。

:::note info
DNS の目的は　**ドメイン名**　と　**IPアドレス**　の変換
:::

## IP アドレス

ネットワーク上のデータ配達プロトコル（**IP**）において、住所として使用される情報。

1 台のコンピュータが用途別に複数の IP アドレスを持つこともある。

ネットワーク上の住所として重複が許されない一方で、IPv4 では **32bit**、IPv6 では **128 bit** と決まっていて、発行可能な数に限りがある。以降の説明ではIPv4を扱う。

IPv4（version 4） では、割り当てることができるアドレスの数が 43 億個程度であり、世界中でネットワークに接続する機器が爆発的に増えたことで枯渇問題が発生し、128 bitのサイズの IP アドレス IPv6（version 6） が登場した。

IPv4 と IPv6 には互換性がない。

現在は、IPv6 に移行する過程にあり、さまざまな工夫のもとで両者が共存している状態にある。

IP アドレスを 2 進数で表現すると、

```plaintext:2 進数表現の IP アドレス
11000110 00110011 01100100 00000001
```
のようになるが、ただこれでは扱いづらいため、一般的には 8 bit ごとにドットで区切り

```plaintext:10 進数表現の IP アドレス
198.51.100.1
```

のように 10 進数で表現する。

## ドメイン名

ドメインという用語は文脈によってさまざまな意味を持つが、ここでは **インターネット上で、特定の組織・ネットワーク・個人を識別するための名前** を指す。

IP アドレスと同様に、インターネット上の住所として例えられることが多く `www.example.com` などの形式で表現される。

ドメインは DNS によって特定の IP アドレスと紐づけられているため、DNS に対して「ドメイン名」で問い合わせをすれば、紐づく「IPアドレス」が回答される。

例えばユーザが「Googleのサイトにアクセスしたい」というときに、Google の Web サーバの IP アドレスを知らなかったとしても `google.com` というドメイン名さえ知っていれば、アクセスに必要な IP アドレスは DNS が名前解決してくれる。

サービスを運用する側にとっても、IP アドレスが変わった時にユーザに周知されたドメイン名を変更することなく紐づく IP アドレスだけを変更することができる（`google.com` はそのまま使い続けることができる）。

また、ドメインは **階層構造** を持っている。

+ トップレベルドメイン（TLD、Top Level Domain）、
+ セカンドレベルドメイン（SLD、2LD、Second Level Domain、2nd Level Domain）
+ ・・・

![DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069520/c4d64c90-3c9d-6ff1-7734-fd9970b75fe1.png)

各階層のそれぞれのドメインを管理するサーバを **DNSサーバ** と呼び、最上位のDNS
サーバを **ルートDNSサーバ** と言う（TLD が最上位ではない）。

TLD は日本であれば `jp`、アメリカであれば `us` など。また `com`、`org` などもここに含まれる。（com＝Commercial、商用の。org＝Organization、組織。）

SLD には、`co.jp`、`or.jp`、`go.jp`、`ne.jp`、`ac.jp` などが含まれる。（co＝Corporation、企業。or＝Organization、組織。go＝Government、政府。ac＝Academic、教育機関。）

一つのドメイン名に対して複数の IP アドレスを紐づけることもできる（[DNSラウンドロビン](##-DNSラウンドロビン)）。

また、一台のサーバに複数のドメイン名をつけることもできる（[仮想ホスト](##-仮想ホスト)）。

## FQDN

ドメイン名の中でも、**ホスト名を含む特別なドメイン名** を **FQDN**（Full Qualified Domain Name）と呼ぶ。

完全修飾ドメイン名とも呼ばれる。

ホスト名は、個々のコンピュータを識別するために付けられる名前。

FQDN であることを明示したい場合は `www.example.co.jp.` のように末尾にドット `.` をつけることがある。

慣習的に、Web サーバには `www`、DNS サーバには `ns`（Name Server）、メールサーバには`mx`（Mail Exchanger） などのホスト名が使われる。

「ドメイン名があれば IP アドレスがわかるのに、なぜホスト名なんて必要なの？」と思うが、特に一台のサーバが複数のサービスを提供するような場合、情報がドメイン名だけだとホストまでしかわからない。ドメイン名までが同じであっても FQDN に含まれるホスト名が異なることで、各サービスを識別することができる（[仮想ホスト](#仮想ホスト)）。

例えば `example.co.jp` を運用するサーバが 「Web サーバ」と「メールサーバ」の2つのサービスを提供する場合、`www.example.co.jp` なのか、`mx.example.co.jp` なのかで両者のサービスを区別できる（ドメイン部分は同じ）。

また `www.co.jp`、`www.co.us` などのように異なるドメイン間で同じホスト名が利用できるのもメリットとして挙げられる。

## ネットワークアドレス / ホストアドレス

IPアドレスは **ネットワーク部** と **ホスト部** から構成される。

IP アドレスという言葉は、基本的には特定のコンピュータを指して使われるが、ルーティングなどの文脈では、スイッチングハブやルータによって分割されたセグメント、またはネットワーク全体を指すことがある。この時の IP アドレスはネットワークアドレスと呼ばれる。

![IPアドレス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069520/88176a1f-5dd8-8851-e3e8-7dc0444911b2.png)

## ネームサーバ

ドメイン名、IPアドレスの対応情報を管理するサーバは **DNSサーバ** または **ネームサーバ** と呼ばれる。

## ゾーン

ネームサーバは複数のドメイン名を管理することかできる。

一つのネームサーバが管理する複数のドメイン名を **ドメイン領域** と呼び、これを**ゾーン**と言う。

## リゾルバ

DNS サーバに対して、IP アドレスの問い合わせを行うクライアント側のソフトウェアを **リゾルバ** という。

通常リゾルバは OS に標準で搭載されているため、開発者がソフトウェアとしてインストールしたり直接操作したりとリゾルバを意識する機会はあまりない。

![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069520/7ee6173a-38eb-4308-ff86-d4d071200909.png)

## プライマリDNSサーバ・セカンダリDNSサーバ

DNS サーバは可用性を高めることを目的として通常は２台以上設置される。

通常時に機能するものは **プライマリDNSサーバ** と呼ばれ、異常発生時などにバックアップとして機能するものは **セカンダリDNSサーバ** と呼ばれる。

DNS サーバが保持する設定ファイルをゾーンファイルと呼ぶため、プライマリ DNS サーバからセカンダリ DNS サーバへの同期は **ゾーン転送** と呼ばれる。

## コンテンツDNSサーバ / キャッシュDNSサーバ

DNS サーバには **コンテンツDNSサーバ** と **キャッシュDNSサーバ** がある。

コンテンツ DNS サーバは **権威DNSサーバ** とも呼ばれる。

コンテンツ DNS サーバは自身でドメイン名・IPアドレスの紐付け情報を管理するのに対して、キャッシュ DNS サーバはコンテンツ DNS サーバに対して問い合わせた結果を一時保管するのみ。

またキャッシュ DNS サーバの保持する情報は一定時間が経過すると削除される。キャッシュ DNS サーバを使用することによって、同じ問い合わせに対してキャッシュから高速回答することができる。

キャッシュ DNS サーバは、自身がキャッシュを保持していない情報についてはクライアントに代わって権威サーバに問い合わせをすることから **フルサービスリゾルバ** とも呼ばれる。

権威 DNS サーバは自身が知らない情報は「知らない」としか回答しないのに対して、フルサービスリゾルバは、自身が知らない情報を他の権威DNSサーバに問い合わせて解決してくれる。

権威 DNS サーバは、自身が管理するゾーン内の情報だけではなく下位の権威 DNS サーバの情報など、他のゾーンに関する情報も保持している。

例えば `www.example.co.jp` というドメイン名（FQDN）があるとき、リゾルバは自身の端末に設定された DNS サーバ（フルサービスリゾルバ）に問い合わせを行う。

リゾルバ　:　「*`www.example.co.jp`のIPアドレスを教えて*」

フルサービスリゾルバは、`www.example.co.jp`のIPアドレスを保持していない時、まずルートDNSサーバに問い合わせを行う。

フルサービスリゾルバ　:　「*`www.example.co.jp`のIPアドレスを教えて*」

ルートDNSサーバは`www.example.co.jp`のIPアドレスを知らない。ただし、`jp`ドメインを管理している下位の権威サーバは知っている。そこで、TLDである`jp`を管理する権威DNSサーバのIPアドレスを回答する。

ルートDNSサーバ　:　*「私は`www.example.co.jp`を知らないから`jp`に聞いてください」*

フルサービスリゾルバは`jp`を管理する権威DNSサーバに対して、ルートDNSへの問い合わせと同じ問い合わせを行う。これを反復問い合わせと呼ぶ。

フルサービスリゾルバ　:　*「`www.example.co.jp`のIPアドレスを教えて」*

`www.example.co.jp`は`jp`のゾーンでもないため、`jp`もIPアドレスを知らない。そこで`jp`の権威DNSサーバは、下位の`co.jp`を管理する権威DNSサーバのIPアドレスを回答する。

DNSサーバ（`jp`）　:　*「私は`www.example.co.jp`を知らないから`co.jp`に聞いてください」*

フルサービスリゾルバは`co.jp`を管理する権威DNSサーバのIPアドレスに再度、反復問い合わせを行う。

フルサービスリゾルバ　:　*「`www.example.co.jp`のIPアドレスを教えて」*

しかし、`co.jp`を管理する権威DNSサーバのゾーンにも`www.example.co.jp`は含まれていないため、さらに下位の`example.co.jp`の権威DNSサーバのIPアドレスが回答される。

DNSサーバ（`co.jp`）　:　*「私は`www.example.co.jp`を知らないから`example.co.jp`に聞いてください」*

フルサービスリゾルバは、`example.co.jp`を管理する権威DNSサーバに対して、再度問い合わせを行う。

フルサービスリゾルバ　:　*「`www.example.co.jp`のIPアドレスを教えて」*

`www.example.co.jp`は`example.co.jp`を管理する権威DNSサーバのゾーン範囲内になるため、ここでようやく`www.example.co.jp`に紐づくIPアドレスが回答される。

フルサービスリゾルバは、リゾルバに対して`www.example.co.jp`に紐づくIPアドレスを回答して名前解決が終了する。

DNSサーバ（`example.co.jp`）　:　*「`www.example.co.jp`のIPアドレスは`198.51.100.1`です」*

これらの流れの中で権威 DNS サーバは自身のゾーン内のドメインに紐づく IP アドレスのみではなく、下位の権威 DNS サーバの IP アドレスも保持していて、ゾーン同士が連携しているように見える点がポイント。

![DNS_resolve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069520/9ffbc496-5c28-0f34-273b-be392cc1c676.png)

:::note info
コンテンツDNSサーバ　＝　権威サーバ
キャッシュDNSサーバ　＝　フルサービスリゾルバ
:::

# リソースレコード

DNS は IP アドレスとドメイン名を変換する役割を持つが、実態としては複数のサーバによって構成される分散型のシステムであり大量のドメイン名・IPアドレス情報を管理する分散型データベースとみなすこともできる。

DNS サーバには権威 DNS サーバとフルサービスリゾルバの２種類があり、権威 DNS サーバはフルサービスリゾルバからの問い合わせを自身の管理する情報から回答する。

このとき、それぞれの権威 DNS サーバで管理されている情報は **リソースレコード** と呼ばれる。

リソースレコードは、DNSサーバの設定ファイル（**ゾーンファイル**）などに記載される。リソースレコードにはいくつかの種類がある。

## Aレコード
Address Record
ホスト名に対応するIPv4アドレス。

```shell
www IN A 198.51.100.0
```

上記は `www` というホストが IPv4 アドレス `198.51.100.0` であることを示す。

## AAAAレコード
IPv6 Address Record
ホスト名に対応する IPv6 アドレス。

```
www IN AAAA 2001:db8::1
```

上記は `www` というホストが IPv6 アドレス `2001:db8::1` であることを示す。

## CNAMEレコード
Canonical Name Record

ホスト名にエイリアス（別名）を指定することで、１つのホスト名に複数のドメイン名を紐づける。（canonical=標準的、正規の）

```
www.example.com. IN CNAME example.com.
```

上記は `www.example.com.` への問い合わせは `example.com.` への問い合わせと同じ扱いということを示している。

## MXレコード
Mail Exchanger Record

メール送信において、宛先メールアドレスのドメインと紐づくメールサーバおよび優先度を指定する。

```
example.com. IN MX 10 mail.example.com.
```

上記は `example.com` ドメイン宛のメールは、優先度 `10` の `mail.example.com.` サーバに転送されることを示している。

## NSレコード
Name Server Record

そのドメインから見た、下位のドメインの権威サーバ。

```
example.com. IN NS ns1.otherdns.com.
example.com. IN NS ns2.otherdns.com.
```

上記は `example.com` の下位には `ns1.otherdns.com.`、`ns2.otherdns.com.` という権威サーバがいることを示している。

## PTRレコード
Pointer Record

逆引きルックアップのために使用される。IPアドレスからホスト名への逆引き情報を提供する。

## SOAレコード
Start Of Authority Record

そのDNSサーバが管理する領域(ゾーン)に関する情報。

```
example.com. IN SOA ns1.example.com. admin.example.com. (
    2024041301 ; シリアル番号
    3600       ; リフレッシュ間隔
    600        ; リトライ間隔
    604800     ; 有効期限
    86400      ; 最小TTL
)
```

上記は `example.com.` ドメインは `ns1.example.com.` が権威サーバであり、`admin.example.com.` が管理者メールであることを表している。その他の数値はゾーン管理のパラメータ。

# DNSラウンドロビン
複数の DNS サーバが同じドメイン名を共有し、各 DNS サーバに対して負荷を分散するための仕組み。

例えば１台の DNS サーバの A レコードに対して、X と Yの２台分の DNS サーバの IP アドレスを設定しておくと、１回目の問い合わせは X に、２回目の問い合わせは Y に、といった具合に、処理を分散させることができる。

ロードバランサーなどの負荷分散装置を使用せずに、容易に負荷分散が実現できる反面、問い合わせを割り振る際に、割り振り先の処理能力（スペック）や、負荷状況を考慮することはできない。

# 仮想ホスト
1台のサーバで仮想的に複数のドメイン名を運用すること。サーバソフトウェアの機能として提供され、主にメールサーバ、Web サーバで利用される。

1台のサーバで運用されるドメイン名に、異なるホスト名をつけることを仮想ホストと言う事もある。

## IPアドレスベースの仮想ホスト
ドメインごとに IP アドレスを設定する方式。1 台のサーバが複数の IP アドレスを持つことになる。

## ドメイン名ベースの仮想ホスト
1つの IP アドレスに複数のドメイン名、ホスト名を割り当てることで、1台のサーバがそれぞれのドメインに紐づく複数のサービスを提供する。

# 参考
・<a href="https://amzn.asia/d/dc9cd0c" target="_blank" rel="noopener noreferrer">ネスペの基礎力 -プラス20点の午後対策 (情報処理技術者試験)</a>
・<a href="https://amzn.asia/d/iGj5hkM" target="_blank" rel="noopener noreferrer">ストーリーで学ぶネットワークの基本</a>
・<a href="https://amzn.asia/d/59iv96H" target="_blank" rel="noopener noreferrer">ネットワークスペシャリスト試験に出るところだけを厳選! 左門至峰による ネスペ教科書 改訂第2版</a>