🥰

新入社員「DNSってなんですか?」→ これ、どこまで答えられますか?????????

2023/04/28に公開
1

はじめに

「DNSって何ですか?」

   

エンジニア・プログラマの皆さんは会社の同僚や後輩などにこの質問をされたらどこまで回答できますか?

大体の人は、「Domain Name System(ドメイン・ネーム・システム)の略称で、IPアドレスとドメインの紐付けをおこn.....」

みたいな回答になってしまうと思います。
特に自分のような、フロントエンド周りが主領域のエンジニアにとってはDNSの理解はかなり後回しになってしまうかなと思います。

今回は、そんなあまり業務でDNSに携わらない方々に向けて、DNSの最低限知っておきたい基礎知識をやさしくお届けできたらなと思います。

※タイトルではめちゃくちゃ煽りましたが、本記事は割と基礎的な内容になっています。ご安心を。

DNSとは

まずは、DNSとはなんぞやというところから入っていきたいと思います。

DNSとは、冒頭にも登場しましたが、Domain Name Systemの略称で、ブラウザがインターネットリソースにアクセスできるようにドメイン名とIPアドレスとの名前解決を行います。

要するに、DNSはドメイン名をIPアドレスに変換して、ブラウザがインターネットリソースをロードできるようにします。

IPアドレスとは

TCP/IPの通信によるコンピュータネットワークに属するコンピュータ(要するにインターネットに繋がれたデバイスなど)は全て一意に特定できるIPアドレスがあり、このIPアドレスを使ってインターネットの大海原から他のマシンがそのデバイスを特定します。

DNSの仕組み

ここまでで、DNSは「ドメイン名(ホスト名)とIPアドレスで名前解決(変換・紐付け)を行うもの」とざっくり認識できたかと思います。

その上で、具体的にどのような仕組みなのかについて触れていきたいと思います。

ドメイン階層構造

まず上記のDNSの説明でも多々登場した「ドメイン」ですが、このドメインは頻繁に変化しうるため、「IPアドレスとドメイン名の紐付け表」のような感じで、一括管理することができません。

そこで、ドメインはTLD(トップレベルドメイン)、SLD(セカンドレベルドメイン)、、、と階層構造に管理されています。

そこで、各階層の名前ごとにその名前を持つドメインを管理するデータベースが設けられており、このデータベースを管理するサーバは、DNSサーバと呼ばれて世界中に分散している構成になっています。

DNS、すなわちドメインネームシステムはインターネットを使った階層的な分散型データベースシステムのことです。

引用: https://lpi.or.jp/lpic_all/linux/network/network07.shtml

上記の図のように、最上位にルートドメイン(.)が存在し、その直下に各階層ごとにドメインが階層構造になっています。

ルートドメインの直下にあるドメイン群はTLD(トップレベルドメイン)と呼ばれます。
TLDには、jpcomorgなどといったドメインが管理されています。

ルートサーバではjpcomなど、一番上位のドメイン名のDNSサーバがインターネット上のどの位置にあるか(つまり、どのIPアドレスなのか)を管理します。

ドメイン名がどのように構成されるかというと、、、、

ドメイン名 = ルートドメイン + 下位のドメイン + ホスト名

といった感じで構成されています。
例えば、ドメイン名www.lpi.or.jp.は、上記の公式をもとに紐解いていくと「.」(ルートドメイン)に各ドメイン(「jp」,「or」,「lpi」)とホスト名「www」を連結させたものということになります。

名前解決に必要な4つのサーバ

各階層の名前ごとにその名前を持つドメインを管理するデータベースが設けられており、このデータベースを管理するサーバは、DNSサーバと呼ばれて世界中に分散している構成

上記で、DNSサーバについて軽く紹介しました。
ドメイン名の名前解決までに、いくつかのサーバが関係しているわけですが、どんなサーバがどのように絡んでいるかを紹介します。

ドメイン名の名前解決には大まかに以下の4種類のサーバが絡んでいます。

  1. DNSリカーシブリゾルバ
  2. ルートネームサーバ
  3. TLDネームサーバ
  4. 権威ネームサーバ

DNSの名前解決の一連は以下のようになっています。

引用: https://www.cloudflare.com/ja-jp/learning/dns/what-is-dns/

DNSリカーシブリゾルバ

DNSリカーシブリゾルバは、クライアント(例:Webブラウザ)からのドメイン名解決のリクエストを受け取り、ドメイン名に対応するIPアドレスを取得するために、DNS階層を横断してクエリを行うサーバです。リカーシブリゾルバは、通常、インターネットサービスプロバイダ(ISP)や企業ネットワーク内のDNSサーバによって提供されます。

リカーシブリゾルバの主な機能は以下の通りです。

  • クライアントからのDNSリクエストを受け取る。
  • 自身のキャッシュを確認し、以前に解決したドメイン名の情報があれば、キャッシュからIPアドレスを返す
  • キャッシュに情報がない場合、ルートネームサーバから始めて、TLDネームサーバ、ドメインのネームサーバと順に問い合わせを行い、最終的にドメイン名に対応するIPアドレスを取得する。
  • 取得したIPアドレスをクライアントに返す。

権威ネームサーバ

権威ネームサーバとは、少し難しいものに見えますが、特定のドメインの正確なDNSの情報を管理していて、そのドメインに対してクエリが来たものに対して返答をするネームサーバです。
要するに、DNSの階層構造の名前解決を全てたどり完全なドメインを管理するネームサーバで、階層構造の一番下に位置します。

権威ネームサーバは、最終的にリクエストしているWebブラウザがWebサイトやその他のWebリソースにアクセスするために必要なIPアドレスに到達するようにします。

TLDネームサーバ

※TLDネームサーバというものが厳密に存在しているわけではなく、トップレベルのドメインを管理するデータベースを管理するサーバのことを便宜上TLDネームサーバと呼ばせていただきます。

TLD(Top-Level Domain)ネームサーバは、インターネット上のドメイン名システム(DNS)において、トップレベルドメインの情報を管理するネームサーバのことです。TLDネームサーバは、各トップレベルドメイン(例:.com.org.net.jp など)に関連付けられており、そのドメイン内のセカンドレベルドメイン(例:example.com)のネームサーバ情報を提供します。

インターネット上でドメイン名をIPアドレスに変換する際、DNSリゾルバは最初にルートネームサーバに問い合わせを行い、TLDネームサーバのアドレス情報を取得します。その後、TLDネームサーバに問い合わせを行い、対象のセカンドレベルドメインのネームサーバ情報を取得します。最後に、そのネームサーバに問い合わせを行い、ドメイン名に対応するIPアドレスを取得します。

ドメイン名がIPアドレスに変換されるまでのプロセス

example.comというドメイン名を例に、ドメイン名が名前解決され、IPアドレスに変換されるまでのプロセス見ていこうと思います。

  1. クライアント(例:Webブラウザ)が、特定のドメイン名(例:example.com)にアクセスしようとします。
  2. クライアントは、設定されたDNSリゾルバ(通常はISPが提供)にドメイン名の問い合わせを行います。
  3. DNSリゾルバは、最初に自身のキャッシュを確認します。以前に問い合わせたことがあり、キャッシュに情報がある場合は、そのIPアドレスをクライアントに返します。キャッシュに情報がない場合は、次の手順に進みます。
  4. DNSリゾルバは、ルートネームサーバに問い合わせを行い、対象のTLD(例:.com)のネームサーバ情報(アドレス情報など)を取得します。
  5. 次に、DNSリゾルバは、取得したTLDネームサーバ(例:.comのネームサーバ)に問い合わせを行い、対象のセカンドレベルドメイン(例:example.com)のネームサーバ情報(アドレス情報など)を取得します。
  6. DNSリゾルバは、取得したセカンドレベルドメインのネームサーバ(例:example.comのネームサーバ)に問い合わせを行い、ドメイン名に対応するIPアドレスを取得します。
  7. DNSリゾルバは、取得したIPアドレスをクライアントに返します。
  8. クライアントは、取得したIPアドレスに対して接続を開始し、Webサーバからコンテンツを取得して表示します。

この一連のプロセスは、DNS(Domain Name System)と呼ばれる階層的な分散データベースシステムによってサポートされており、ドメイン名をIPアドレスに効率的かつ迅速に変換することができます。

DNSのキャッシング

クライアントからのリクエストに対する迅速な名前解決のために、DNSにはいくつかのキャッシングが存在します。

DNSには、大きく分けて下記の二種類のキャッシングが存在します。

  1. DMSサーバ自身のキャッシュ
  2. ブラウザによるDNSレコードキャッシュ

DNSサーバ自身のキャッシュ

DNSサーバは過去のDNS情報をキャッシュに保存しておくことで、同じ問い合わせに対しては、上位(権威のある)のDNS に問い合わせを行う必要なく、キャッシュに保存された情報から回答することができます

特定のドメインを管理せず、キャッシュによる回答のみ専用に行うDNSサーバはキャッシュサーバと呼ばれ、ドメイン(ゾーン)を管理するサーバはゾーンサーバと呼ばれます。

ブラウザのDNSキャッシュ

最新のWebブラウザ(chrome等)では、デフォルトでDNSレコードを一定時間キャッシュすることができます。
DNSキャッシュがWebブラウザに近いほど、キャッシュをチェックしてIPアドレスに正しいリクエストを行うために必要な処理ステップが少なくなり、応答までの速度が上がります。

DNSレコードの要求が行われると、要求されたレコードを最初にチェックする場所はブラウザのキャッシュになります。

Chromeでは、chrome://net-internals/#dns から、DNSキャッシュのステータスを見ることができます。

DNSのゾーンについて

DNSゾーンは、ドメイン名システム(DNS)において、DNSデータを管理する単位ないしは範囲です。
ゾーンは、あるドメインの管理権限が与えられた組織や個人が、そのドメインのDNS情報(ドメイン名、サブドメイン名、IPアドレスなど)を管理するために使用します。ゾーンは、一般的にゾーンファイルとして表現され、DNSサーバーによって使用されます。

DNSゾーンは、次のような要素で構成されます。

  • ゾーンの起点となるドメイン名(例:example.com)。
  • そのドメイン名に関連するサブドメイン名(例:www.example.com, mail.example.com)。
  • 各ドメイン名とサブドメイン名に関連するリソースレコード。リソースレコードには、Aレコード(IPv4アドレス)、AAAAレコード(IPv6アドレス)、CNAMEレコード(別名)、MXレコード(メールサーバー情報)、TXTレコード(テキスト情報)などがあります。
  • SOA(Start of Authority)レコード。ゾーンの権威情報を示すレコードで、ゾーンの管理者情報やゾーンファイルのシリアル番号、リフレッシュ間隔、再試行間隔、キャッシュの有効期限などの情報を含みます。
  • NS(Name Server)レコード。そのゾーンを管理するネームサーバの情報を示すレコードです。

DNSゾーンの管理は、通常、ドメイン登録業者やDNSホスティングサービスによって行われます。ドメイン所有者は、これらのサービスを通じて、自分のドメインに関連するDNS情報を更新したり、新しいサブドメインを追加したりできます。このように、DNSゾーンは、インターネット上でドメイン名とIPアドレスの対応関係を管理するための重要な概念です。

DNSレコードについて

DNS周りのお話になるとよく登場するのが、このDNSレコードですね。
最後に今までの話を踏まえた上で、このDNSレコードについてみていこうと思います。

DNSレコードとは

DNSレコード(ゾーンファイル)は、権威DNSサーバー内に存在し、そのドメイン名に関連付けられたIPアドレスや、ドメインに対するリクエストを処理する方法など、ドメインに関する情報の提供を指示するものです。これらのレコードは、DNSシンタックスとして知られる方法で書かれた一連のテキストファイルから構成されます。DNSシンタックスは、何を行うべきかDNSサーバーに伝えるためのコマンドとして使用される文字列です。

引用: https://www.cloudflare.com/ja-jp/learning/dns/dns-records/

権威ネームサーバは、ドメイン名とIPアドレスの対応情報を管理するサーバで、DNSシステム内で最も重要な役割を担っています。権威ネームサーバは、ドメイン名をクライアントから受け取り、そのドメイン名に関連付けられた情報を提供します。この情報には、ドメイン名に対応するIPアドレスや、メールサーバ(MXレコード)などの情報が含まれます。

権威ネームサーバは、特定のドメイン名の管理者が設定し、そのドメイン名に関する情報を管理します。つまり、各ドメイン名には、そのドメイン名を管理する権威ネームサーバが割り当てられています。また、権威ネームサーバは各ドメイン名に対してDNSレコードを管理し、その情報を提供する役割を担っています。つまり、クライアントがドメイン名に対応するIPアドレスを取得するためには、最初にそのドメイン名を管理する権威ネームサーバに問い合わせる必要があります。

DNSレコードは、ドメイン名とIPアドレスの対応関係を示す情報を含むデータのことです。DNSレコードは、権威ネームサーバによって管理され、以下のようなタイプがあります。

DNSレコードの種類

網羅はできておりませんが、一般的なDNSレコードは以下の通りです。

レコード名 説明
Aレコード メインのIPアドレスを保持するレコード
AAAAレコード ドメインに対するIPv6アドレスを保有するレコード(IPv4アドレスを列挙するAレコードとは対照的)
CNAMEレコード あるドメインまたはサブドメインを別のドメインに転送するがIPアドレスは提供しない
MXレコード メールサーバーにメールを送信する
TXTレコード 管理者がレコードにテキストメモを登録できるようにする
NSレコード DNSエントリのネームサーバーを格納する
SOAレコード ドメインに関する管理情報を格納する
SRVレコード 特定のサービスのポートを指定する
PTRレコード リバースルックアップ(逆引き)でドメイン名を提供する

まだまだ他にも、DNAME、LOC、NSECなどのレコードはありますが、上げすぎるとキリがないので割愛させていただきます。

詳しくはこちらをご参照いただければと思います。

まとめ

DNSについて完全に理解して、これで新入社員にいつ質問されても大丈夫になったと思います。
ただしまだ触れられていない部分もあるので、digコマンドで挙動レベルで確認したり、書籍を購入することをおすすめします。

参考情報

https://zenn.dev/haruka_o/articles/82b415bd777ca8
https://www.cloudflare.com/ja-jp/learning/dns/what-is-dns/
http://manabu.quu.cc/up/6/e62026.htm
https://baremail.jp/blog/2019/10/25/347/
https://lpi.or.jp/lpic_all/linux/network/network07.shtml
https://www.forcia.com/blog/002369.html
https://zenn.dev/tetsuya/articles/fc6621a352418f44d2ad
https://www.nic.ad.jp/ja/newsletter/No22/080.html

Discussion

msy.msy.

[ 2023/04/30 ]
ありがたいご指摘をいくつかいただいたため、幾点か追記・修正の方をいたしました。
誤った情報を掲載して、大変申し訳ございませんでした。