# Domain Name System

ドメインの階層構造
**Domain Name System**（ドメイン・ネーム・システム、**DNS**）とは、コンピュータネットワーク上のホスト名や電子メールのアドレスに使われるドメイン名と、IPアドレスとの対応づけ（正引き、逆引き）を管理するために使用されているシステムである。後述の通りインターネットのシステムとして開発されているが、インターネットに限定したシステムではなく、それ以外のネットワークでも応用できる。

1983年に、インターネットを使った階層的な分散型データベースシステムとして、Information Sciences Institute（ISI）のポール・モカペトリスとジョン・ポステルにより開発された。

インターネットに接続されているすべてのコンピュータ（ノード）は、IPアドレスを持っている。インターネット上のコンピュータにアクセスするためには、そのコンピュータの IPアドレスを知る必要がある。しかし、IPアドレスは0から255までの数値を4つ組み合わせ（IPv4の場合）で表現されるため、人間には記憶しにくい。そのため、IPアドレスを文字列で扱うことができるような機構として、インターネットドメイン名が考案された。そして、ドメイン名からIPアドレスを引き出す機能（正引き）が、DNSの代表的な機能である。このほか、ドメイン名に関連するメールサーバ情報なども取り扱っている。

## 動作

DNSは、ホスト名（たとえば`ja.wikipedia.org`）の入力に対して、DNSサーバと呼ばれるコンピュータを参照し、そのホストが持つIP アドレス（たとえば`130.94.122.197`）に変換する、またはその逆の変換を行うシステムである。喩えるならば、DNSは「（決して重複しないよう制限されて名付けられた前提での）氏名」から電話番号を自動で調べる電話帳である。

たとえば、ウェブブラウザにURIを入力してネットワークにアクセスする際、ブラウザはURIを解析して、アクセスすべきWebサーバのホスト名を取り出し、後述のリゾルバAPIに渡す。リゾルバAPI（通常はOS内部での働き）は、Webサーバのホスト名をDNSサーバに問い合わせて返ってきたIPアドレスにより、ホスト名をIPアドレスに変換してブラウザに返す。ブラウザは、得られたIPアドレスを使用して、Webサーバとの通信を開始する。このようにしてブラウザはインターネットにアクセスする。

ホスト名から、そのホストにアクセスするためのIPアドレスを得ることを、ホスト名の「**名前解決**」（resolve）と呼び、これを行うためのクライアント側のしくみやプログラムを「**リゾルバ**」（resolver）または「**ネームリゾルバ**」という。

DNSに格納されている情報を「**レコード**」（DNSレコード、リソースレコード）と呼ぶ。レコードは格納する情報によって種類が分類分けされている。レコードの種類は「DNSレコードタイプの一覧」を参照。

この情報は、インターネット上のいくつものコンピュータ（DNSサーバ）に分散して格納されている。インターネットには莫大な数のコンピュータが接続されており、これらのホスト名と IPアドレスは日々更新されつづけているため、インターネット上の**すべての**ホスト名を一台のコンピュータで集中管理することは現実的ではなかった。そのためインターネット上のコンピュータをある単位で区分けして、それぞれのグループがもつデータをグループごとのコンピュータに別々に管理させるようにした。これが DNS の基本的なアイデアである。このグループを**ドメイン**と呼ぶ。各グループには英数字とハイフン（ `-` ）からなるラベル（ドメイン名）がつけられており、異なるドメインの情報は異なるコンピュータに格納される。

今でこそDNSはホスト名とIPアドレスの対応づけに使用されるのがほとんどだが、もともとは電子メールの配送方法やコンピュータの機種名を登録するなどといった用途も考えられていた。

ドメイン名で構成される空間はドメイン名空間と呼ばれるが、これは階層構造をなしている。たとえば`ja.wikipedia.org`というホスト名は`ja`、`wikipedia`、`org`という3つの階層に区切ることができる。`ja.wikipedia.org`というホストは`wikipedia.org`ドメインに所属しており、このドメインはさらに`org`ドメインに所属している。階層構造の頂点には`.`で表されるルートドメインがただ一つあり、そこから`.com`、`.org`、`.jp` などの各トップレベルドメイン（TLD）が分かれている。さらに、TLDも子ドメインを持つことができ、セカンドレベルドメイン（SLD）と呼ばれる。

各ドメインはゾーンと呼ばれる管轄に分けて管理されている。ゾーンはドメイン名前空間上のある一部分に相当し、それぞれのゾーンは独立したDNSコンテンツサーバと呼ばれるコンピュータによって管理されている（ドメイン名の委譲）。DNSコンテンツサーバは、管理しているゾーンのホスト名とIPアドレスの組を記述したデータベースを持っており、クライアントマシン（あるいはDNSキャッシュサーバ）からの要求に応じて、あるホスト名に対応するIPアドレスを返す。DNSクライアントはルートサーバからいくつものDNSサーバをたどっていき、最終的なホスト名のIPアドレスを得る（DNSの再帰検索）。

### DNSサーバの役割

→「DNSサーバ」および「ルートサーバ」も参照
www.wikipedia.orgを名前解決する流れ
具体的な例として、`ja.wikipedia.org`というホスト名の IPアドレスを検索することを考えると、再帰検索は、トップレベルドメインをルートサーバに問い合わせることからはじまる。`ja.wikipedia.org`というホスト名は`wikipedia.org`ドメインに属し、また`wikipedia.org`ドメインは`org`ドメインに属するため、クライアントは最初に`org`ドメインのDNSサーバ（ネームサーバ）のIPアドレスを得なければならない。

まず、クライアントは適当なルートサーバをひとつ選ぶ。ここでは `A.ROOT-SERVERS.NET`（`198.41.0.4`）とする。現在、ルートサーバに登録されている`org`ドメインのネームサーバは9つあり、そのうちのひとつは`a7.nstld.com`（`192.5.6.36`）である。

つぎにクライアントは、このネームサーバに`wikipedia.org`ドメインのネームサーバの IPアドレスを問い合わせる。するとそのネームサーバのホスト名は`dns34.register.com`（`216.21.226.87`）であることがわかる。

最後に、このネームサーバに`ja.wikipedia.org`のIPアドレスを問い合わせる。するとこのサーバは最終的な答`130.94.122.197`を返す。こうして目的とするホスト名のIPアドレスを検索できる。

### 権威サーバとキャッシュサーバ

DNSはデータを分散して保持する多数の権威DNSサーバと、キャッシュサーバからなる。authoritativeネームサーバ（「権威DNSサーバ」、「権威あるDNS」とも）は自らが担当する一定の範囲のドメイン名の名前解決を内部のデータベースを使って行い、その結果のIPアドレスを送り返す。キャッシュDNSサーバは権威DNSサーバの回答結果を一定期間保存して代わりに回答する機能を持ち、権威DNSサーバの負荷を分散する。

## DNS over HTTPS (DoH) / DNS over TLS (DoT)

→詳細は「DNS over HTTPS」および「DNS over TLS」を参照
DNS over HTTPS (DoH)は、リゾルバとのDNSクエリのやり取りをHTTPS上で行うことで、セキュリティとプライバシーを向上させる。これは RFC 8484 で定義され、MIMEタイプとして`application/dns-message`を使う。

DNS over TLS(DoT)は、TLSプロトコルを介してリゾルバとのDNSクエリをやり取りする。効果はDoHと同様である。

## 存在意義

DNSは、ほとんどのインターネット利用者が普段意識していない透過的なシステムだが、その役割は非常に重要である。あるドメインを管理しているDNSサーバが停止してしまうと、そのドメイン内のホストを示すURLやメールアドレスの名前解決などができなくなり、ネットワークが利用者とつながっていてもそのドメイン内のサーバ類には事実上アクセスできなくなる。そのため、重要なDNSサーバは二重化されていることが多い。

またDNS偽装を行うと、情報を容易に盗聴・偽装することができてしまう。情報レコードの不正な書き換えを防止するため、コンテンツサーバのマスタ（プライマリ）はインターネット（外部）から隠匿し、インターネットには特定のマスタのコピー（ゾーン転送）を受け取るスレーブ（セカンダリ）を公開するなどの構成を組んで、防衛手段を講じる。

## 関連語句

* DNSサーバ
	+ Dynamic Domain Name System（ダイナミックDNS、DDNS）
	+ リゾルバ
	+ djbdns - DNSサーバ用ソフトウェア。
	+ BIND
	+ unbound - オープンソースのDNSキャッシュサーバ
	+ DNSルートゾーン
	+ DNSゾーン転送
	+ DNSレコードタイプの一覧
		- MXレコード
		- SRVレコード
		- Glue Record
	+ DNSBL（DNSブラックリスト）
	+ DNSラウンドロビン
	+ EDNS0 (extension mechanisms for DNS version 0)
* ドメイン名
	+ トップレベルドメイン (TLD)
	+ 国際化ドメイン名
	+ Fully Qualified Domain Name（FQDN）
* 地域インターネットレジストリ
	+ レジストラ
* TCP/IP
* 名前解決
	+ 正引き
	+ 逆引き
* ディレクトリ・サービス
* DNS偽装
* 誕生日攻撃
* DNS-Pinning (DNSリバインディング (DNS rebinding) )
* DNS Security Extensions (DNSSEC)
* エニーキャスト

## 関連プロトコル

* STD0013
	+ RFC 1034 : DOMAIN NAMES - CONCEPTS AND FACILITIES
	+ RFC 1035 : DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION
* RFC 8310: Usage Profiles for DNS over TLS and DNS over DTLS - TLS（TCPを使用）およびDTLS（UDPを使用）上でDNSメッセージのやり取りを行うプロトコルの規定。セキュリティやプライバシー保護の向上を意図している。
* RFC 8484: DNS Queries over HTTPS - HTTPS上でDNSメッセージのやり取りを行うプロトコルの規定。使用するHTTPのバージョンとしてはHTTP/2が推奨されている。こちらも、セキュリティやプライバシー保護の向上を意図している。
* マルチキャストDNS - mDNS とも表現される
* LLMNR - Link Local Multicast Name Resolution

* 日本DNSオペレーターズグループ | 権威DNSサービス調査