DNSサーバ

**DNSサーバ**（ディーエヌエスサーバ）は、コンピュータ・ネットワークにおいて、Domain Name System（DNS）の「名前解決」機能が実装されたサーバである。

## 概要
インターネットでの通信に際し、URLの中やメールアドレスの中などでの相手先は、IPアドレスが直接指定されることはまず無く、ドメイン名などといった「名前」が使われている。そういった名前から、IPアドレスなどを得る「解決」を行うシステムがDomain Name System（DNS）である。

あるコンピューターが他のコンピュータとインターネットプロトコル（IP）を介して通信する際には、通信の相手となるコンピュータに付与されたIPアドレスを知る必要がある。一方、URLなどには（IPアドレスを、直接指定することもできるが）、もっぱらドメイン名を使って対象を記述する。ドメイン名から、IPアドレスなどといった必要な情報を得る（名前を解決する）ために、ネットワーク上で情報を提供する仕組みがDomain Name Systemであり、それを担う各サーバがDNSサーバである。

## DNSの仕組み
DNSによる名前解決には、以下の3種類の構成要素によって成り立っている。その内、DNSサーバは分散型データベースの1ノードとして機能しており、「**DNSコンテンツサーバ**」と「**DNSキャッシュサーバ**」の2種類に分類される。

* **DNSクライアント（スタブリゾルバ）**: PCやスマートフォンのこと。
* '''DNSキャッシュサーバ''': 問い合わせを代行してくれるサーバ。
* '''DNSコンテンツサーバ''': ドメイン名の情報を持つ「持ち主」のサーバ。

### 名前解決の流れ

# **DNSクライアント**（PC）が、設定された**DNSキャッシュサーバ**に「www.wikipedia.orgのIPアドレスは？」と問い合わせる（**再帰的問い合わせ**）。
# DNSキャッシュサーバは、まずルートサーバに尋ねる。
# ルートサーバから「.org」を管理するサーバを教わる。
# 「.org」のサーバから「wikipedia.org」を管理する**DNSコンテンツサーバ**を教わる。
# 「wikipedia.org」のDNSコンテンツサーバに尋ね、最終的なIPアドレスを受け取る（ここまでのキャッシュサーバの動きが**反復問い合わせ**）。
# キャッシュサーバは結果をPCに返し、一定期間その情報をキャッシュ（保存）する。

## DNSコンテンツサーバ
DNSコンテンツサーバの役割は、Domain Name Systemにおいて、ドメインの管理情報、すなわち、自ゾーンの管理するサーバのリソースレコード(RR)と、ドメインの委任に関する情報を保持し、問い合わせ要求があったときに応答することである。コンテンツサーバはドメインの持ち主が管理することもできるが、多くの場合、プロバイダやレンタルサーバ業者などが提供しているものを利用する。

### 役割と機能

* 自らが「ゾーン」（ドメイン名空間、例: `wikipedia.org`）を管理し、情報を世界に公開する。
* 独自のドメイン名をドメインレジストラで登録するときに、「そのドメイン名を管理するDNSサーバ」として指定する。
* 外部からの反復問い合わせに応答し、自身の持つ情報、あるいは「知らない」という情報（委任情報）を返す。
**社内ネットワーク専用で使用され、一般に公開しないゾーンを管理するものもある。この場合、ドメインレジストラへの登録の必要はない。
** 「**権威DNSサーバ**」と呼ばれることもある。コンテンツサーバは上記のような役割のサーバ全般の総称であるのに対し、権威DNSサーバは、例えば「wikipedia.orgドメインの（wikipedia.orgドメインが管理・委譲している情報を持っている（それに関して権威がある））権威DNSサーバ」といったように、個々のドメインとの関係を意味する。

### リソースレコード(RR)
DNSコンテンツサーバは、「ゾーン情報」（ゾーンファイル）内の**リソースレコード**（資源レコード）と呼ばれるデータ内で、以下のような情報を管理する。
* Aレコード：名前に対するIPv4アドレス

* AAAAレコード：名前に対するIPv6アドレス
*MXレコード：メールサーバーのホスト名の完全修飾ドメイン名（FQDN）

* NSレコード：そのゾーンを管理するDNSコンテンツサーバ名
* CNAMEレコード：その名前に対する別名（エイリアス）
* PTRレコード：IPアドレスに対応するドメイン名。逆引き用である。（例： 198.51.100.234 というIPアドレスを逆引きするには 234.100.51.198.in-addr.arpa という名前のPTRレコードを問い合わせればよい）

* SOAレコード：ゾーンそのものの情報

* TXTレコード：テキスト情報、汎用性が高い。
** **[[SPF]] (Sender Policy Framework)** - ドメインのメール送信を許可するサーバーのIPアドレスなどを記述
** **[[DKIM]] (DomainKeys Identified Mail)** - 公開鍵を記述し、なりすましを防止する
****[[DMARC]]レコード** - DMARCのバージョン、認証に失敗したメールのポリシー、集計レポートの送信先などのタグと値を記述
**BIMI（Brand Indicators for Message Identification）レコード - バージョン番号、ロゴのURL、PMCのURLを登録することで、メールにロゴを表示できる。
**GoogleやAWSなどのサービスにおけるドメイン所有権

* DNSKEYレコード/RRSIGレコード：応答の正当性を保証するDNSSECの電子署名情報
### プライマリサーバとセカンダリサーバ
DNSでは、安定した名前解決のため、複数のサーバで運用されるのが一般的である。コンテンツサーバには、「プライマリサーバ」と「セカンダリサーバ」の分類があり、マスタとスレーブの関係にある。

#### プライマリサーバ
ゾーン情報（オリジナル）を管理し、自らのゾーン情報に関する問い合わせに回答したり、セカンダリサーバへ配信したりする。Windows Server同梱のDNSサービスにある動作モード「Active Directory統合ゾーン」は、プライマリサーバとしての役割に機能拡張がされたものである。
;セカンダリサーバ
プライマリサーバから受け取った情報を保持し、担当するゾーンに関する問い合わせに回答する。自らはゾーン情報を管理しない。

#### DNSゾーン転送
プライマリサーバからセカンダリサーバーへ、「**ゾーン情報**」（ゾーンファイル）を同期する仕組み。「**[[DNSゾーン転送]]**」とも言う。
### セキュリティ
DNSサーバが応答不能になれば、管理しているゾーン内のコンピューターが提供しているサービスを利用できなくなり、誤った情報を回答するとクライアントコンピューターは意図していないノードにアクセスしてしまうことになる。

健全な利用環境を確保するために、DNSサーバのリソースレコードの改ざん（DNSスプーフィング）やDoS攻撃を防ぐよう、DNSサーバソフトウエアおよびOSの設定やセキュリティ更新プログラムの適用、コンテンツサーバの多重化（セカンダリサーバを公開し、プライマリサーバは非公開とするなど）、ファイアウォールや侵入検知システムの導入などにより対策を講じる必要がある。

#### DNSSEC
電子署名を用いてDNSの応答が改ざんされていないことを保証する「DNSSEC」機能が提供されている。
#### KSKロールオーバー問題
DNSSECにおいて、電子署名の正当性検証に使われる最上位の暗号鍵である「ルートゾーンKSK」を更新する際に、EDNSによるIPフラグメンテーションが発生するほどのサイズの応答データが発生するが、通信設定が対応できていないDNSで通信ができず、DNSSECによる正当性検証ができなくなり、インターネットの利用に問題が発生する。

これは、「ルートゾーンKSK」が2016年まで更新されてこなかったために問題になっていなかったが、2016年10月から2018年3月にかけて、 順次変更を行うことになったために顕在化した問題である。特に2017/09/19、2017/12/20、2018/01/11から始まる更新では、IPフラグメンテーションが発生しない1280bytesを超える1414～1424Bytesの応答データが発生するために、問題が発生する。

基本的には、DNSの運用責任者がソフトウェアのアップデートや設定変更で対応すべきものであるが、一般消費者向けのルータに内蔵されているDNS Proxyでも問題が発生する可能性があり、インターネットの利用に問題が発生する場合がある。

## DNSキャッシュサーバ
DNSキャッシュサーバは、**DNSクライアント**（ウェブブラウザなど、ドメイン名を利用する何らかのアプリケーション等）から**再帰的問い合わせ**によって依頼を受け、反復問い合わせを行い、解決プロセスを代行するサーバである。結果を再利用できるよう、一定期間自らキャッシュする。

「フルリゾルバ」「フルサービスリゾルバ」「キャッシュDNSサーバ」とも呼ばれる。

DNSキャッシュサーバーでは、分散システムであることが多い。システムの各所で情報の一貫性（Consistency）を保つことが極めて重要となる。

### 再帰的問い合わせと反復問い合わせ
キャッシュサーバは、再帰的問い合わせと反復問い合わせ（非再帰的問い合わせ）の2種類の問い合わせを使い分けて名前解決を行う。

#### 再帰的問い合わせ
名前解決がされたのであれば、その完全な結果を、できなかった場合は「存在しない」とするやはり完全な結果を求める問い合わせである。ユーザのパーソナルコンピュータなどといった端末から、DNSキャッシュサーバに対して送られる。

#### 反復問い合わせ
反復問い合わせとも。この問い合わせを受けたDNSコンテンツサーバは、自分自身が持っている情報であればそれを、委任している情報であればそのこと（委任情報）を返す。DNSキャッシュサーバはその内容に応じて次々と問い合わせを反復する（一般的にはルートサーバから順にドメインツリーをたどる）。

典型的で単純な例で説明すると、ユーザプログラムからlibcの `gethostbyname` (3) を通して、/etc/resolv.conf で設定されたDNSキャッシュサーバへの問い合わせが「再帰的問い合わせ」で、キャッシュサーバが行う、DNSコンテンツサーバ群への繰返しの問い合わせが「反復問い合わせ」である。

### DNSキャッシュサーバへの接続
ほとんどの場合、キャッシュサーバは接続プロバイダなどによって用意されており、「インターネットを利用するための機器の設定」にその設定が含まれている。あるいは、DHCPを利用してIPアドレス等と一緒に自動的に設定してしまうことが多い。

ネットワーク内に、キャッシュサーバを用意し、そちらを使うこともできる。

受けた問い合わせを単に上位のDNSサーバーに転送（フォワード）するだけのものも存在する。これは一般に**DNSフォワーダ**と呼ばれ、プロキシに近い動作原理を持つ。情報の一貫性が優先される場合、DNSフォワーダのようなキャッシュをもたない動作のほうが、システム全体の情報の不整合の防止という観点で有利であるとされることがある。

* WindowsやmacOS、iOSやAndroidをはじめとする、ネットワーク通信可能なオペレーティングシステムには、ネットワーク関連の設定に「DNSサーバ」のIPアドレスを指定する項目がある。一般に gethostbyname(3) といったようなライブラリ関数による処理の中で、これらの設定に従い、DNSキャッシュサーバへの問い合わせ等が行われる。

* 応答がない場合に備え、優先（プライマリ）と代替（セカンダリ）の2つを設定できる。これにより、DNSキャッシュサーバの可用性を高める。これは**コンテンツサーバのプライマリ/セカンダリとは全く異なる概念**であるので、混同しないように注意したい。（#プライマリサーバとセカンダリサーバ）。

## 実装と運用
代表的なDNSサーバソフトウエアは次のものがある。DNSコンテンツサーバとDNSキャッシュサーバが別々になっているものもあれば、両方機能を搭載するものもある。
* BIND
* djbdns - コンテンツサーバであるtinydnsとキャッシュサーバであるdnscacheからなる
* Dnsmasq
* Microsoft DNS Server
* NSD
* Unbound
* Knot DNS
* PowerDNS
* Yadifa
*XACK DNS - 国産のDNS製品

### 注意
BINDなどに代表されるDNSサーバソフトウェアの多くでは、1台でコンテンツサーバとキャッシュサーバの両方の機能を設定できる。このため、設定を誤ると、セキュリティ上のリスクを抱えてしまうことが指摘されている。

**オープンリゾルバ**

DNSキャッシュサーバに不適切な設定をすることで、DNSキャッシュサーバが誰からの再帰検索要求に対しても応じてしまう状態になることがある。これを「**オープンリゾルバ**」という。オープンリゾルバのDNSキャッシュサーバは、攻撃者に利用され、DNSamp攻撃やその他攻撃の踏み台にされる。点検用にオープンリゾルバであるかを確認するサイトがある。

https://www.v3.openresolver.jp/

## 脚注

### 注釈

### 出典


## 外部リンク
* 情報処理推進機構：DNSキャッシュポイズニングの脆弱性に関する注意喚起
* 日本DNSオペレーターズグループ
* JP DNS Web Page

## 関連項目
* Domain Name System
* DNSレコードタイプの一覧
** MXレコード
** CNAMEレコード
* ダイナミックドメインネームシステム
* リゾルバ
* DNSルートゾーン
* DNS over HTTPS
* DNSゾーン転送
* DNS64
* DNSSEC

### パブリックなDNSキャッシュサーバ
*Quad9
* 1.1.1.1
* OpenDNS
* Google Public DNS
*Yandex.DNS

### DNSをターゲットとしたエクスプロイト

* DNSスプーフィング
* DNS増幅攻撃
* DNSハイジャック