🐡

DNSとは? 全体像とDNSレコードの種類

2020/09/24に公開2

はじめに

AWSでインフラ構成を整えるにあたって、Route53をいじることはほぼ不可避です。
ですが、DNSとはなんぞや? Aレコード? MXレコード? など、意外と覚えなきゃいけない話が多かったので、情報の整理も含めて、全体像をまとめてみました。

DNSとは?

DNSの役割

DNSとは、Domain Name Systemの略であり、インターネット上でドメイン名を管理・運用するために開発されたシステムのことを指します。

例えば、「yahoo.co.jp」 というドメインに対して、

  • このドメインのコンテンツは◯◯にあるよ
  • このドメインのメールサーバは☓☓だよ

といった情報を管理、運用するためのシステムが、DNSとなります。

※DNSと言われると、「Domain Name Server」の略 だと思われている方がいらっしゃるのですが、正しくは、この管理システム全体のことを「Domain Name System」と呼び、そしてDNSの意味するところになります。 混在させないように注意しましょう。

そしてこのDNSは、大きくネームサーバフルリゾルバの2つに分けることができます。

ネームサーバ

ネームサーバとは、名前と電話番号を持つ電話帳のように、ドメインとIPアドレスを紐付ける台帳を持ったサーバのことで、「◯◯ドメインの情報を教えて!」という問い合わせに対して、自身が持ち合わせている台帳を元に情報を返却することが主な役割となります。

このネームサーバに、「◯◯ドメインの情報を教えて!」 と尋ねると、

  • ◯◯というドメインなら、☓☓ネームサーバに情報が格納されているよ

といった具合に、自身の保持する台帳にその情報が記載されていないので、次にどこに情報を聞きに行けばよいか教えてくれることもあれば、

  • ◯◯というドメインなら、このIPアドレスと紐付けられているよ

といった具合に、自身の台帳に情報が記載しているので、情報をそのまま教えてくれる場合があります。

※このネームサーバは、権威DNSサーバコンテンツDNSサーバなどと呼ばれることもありますので、合わせて覚えておきましょう。

フルリゾルバ

先程ネームサーバの紹介の際に、「◯◯ドメインの情報を教えて!」と尋ねると ... といった説明がありましたが、このように各ネームサーバに情報を尋ねにいってくれるのが、フルリゾルバの役割となります。

フルリゾルバは、各ネームサーバに「◯◯ドメインの情報を教えてください!」と聞いて回りながら、「あそこに聞いて!」 とたらい回しにされることを何度か繰り返します(笑) 
そして最終的に「◯◯というドメインなら、このIPアドレスと紐付けられているよ」と返答してくれるネームサーバに行き着くまで、この作業を繰り返すのです。(この辺りは少し細かい話になるので、本稿では割愛します)

また、このフルリゾルバは、一度確認したIPとドメインの対応を、一定期間自身の中にキャッシュすることにより、同じドメインに対して再度ネームサーバに確認しにいくという手順を省いています。
このため、別名をDNSキャッシュサーバと呼ばれます。

※この時、どれくらいの時間キャッシュをさせておくかを定めた時間を**TTL(Time To Live)**と呼び、各ネームサーバ側で設定がなされていますので、合わせて覚えておきましょう。

このようにして、ドメイン名とIPのヒモ付を記録するネームサーバと、各ネームサーバに対して今欲しい情報を尋ねて回るフルリゾルバがセットとなって、DNSというシステムが形成されているのですね。

Route53とは?

Route53とは、このDNSのネームサーバを自身で管理するために提供されるAWS上のサービスであり、自身が管理するドメインに対して、

  • このドメインのIPはこれですよ
  • このドメインのメールサーバはこれですよ

といった情報を、自身の手で追加していくことが出来るものとなります。

ゾーンファイルとは

ゾーンファイルとは、今までに何度か出てきているドメインとIPの対応表のことを指しています。ネームサーバの説明で言うところの「台帳」がこれにあたります。

そしてこの対応表の中に、「◯◯のIPアドレスは☓☓」「◯◯のメールサーバは☓☓」といった詳細情報を設定していくこととなります。

Route53では、こちらのボタンからドメイン毎のゾーンファイルを作成出来ます。

DNSレコードとは?

先程、ゾーンファイにはドメインとIPのヒモ付を書いている とありましたが、この対応一つ一つをDNSレコードと呼びます。

Route53では、先程のゾーンファイルを作成した上で、「Create Record Set」というボタンをクリックすることで新しく追加が可能となり、実際の情報は画面右側のフォームから入力する形となります。

ここまで来て、やっとRoute53を使用して何を設定していくのかが見えてきたのではないでしょうか?

DNSレコードの種類

ここからはRoute53設定に関する詳細の話です。

これから、先程お話したDNSレコードを設定していくのですが、
単純に「◯◯のIPアドレスは☓☓です」と設定する以外にも、様々な役割を持ったDNSレコードが存在し、それらを使い分けながら設定を施していかなけなりません。
ですので、それぞれのレコードの役割を見ていきましょう。

SOAレコード

ドメインの管理情報を示すレコードで、Route53ではドメインを登録した作成したタイミングで自動でレコードが作成されています。

このSOAレコードの中には、

  • SOAレコードを作成したホスト
  • リフレッシュ時間
  • キャッシュ時間

などの情報が含まれているのですが、細かい情報となってしまうため、詳しくはこちらをご確認ください

NSレコード

ドメインのネームサーバを指定しているレコードとなり、Route53で作成した場合は、AWSのネームサーバが自動で設定されています。

この情報を変更してしまうと、フルリゾルバがいつまで立ってもドメインの情報が格納されたネームサーバを発見できなくなってしまうので、下手に編集しないようにしましょう。

digコマンドを使用する場合、
dig ドメイン名 ns +shortでドメインに紐づくネームサーバの情報を確認可能です。

補足: ZONE APEX

ZONE APEXとは、サブドメインを含まないドメイン名のことを指します。
では、なぜ今このZONE APEXの話を持ち出したかと言うと、SOAレコード、NSレコードに関しては、ZONE APEXの場合設定が必須となっているからです。(その為、ドメインを登録した時点で自動で作成されていたのですね)

ここも合わせて覚えておくようにしましょう。

Aレコード

ドメインとIPアドレスの対応を指定するためのレコードで、
「yahoo.co.jp は、54.13.222.222 のサーバを見に行ってください」といった具合に指定をします。

digコマンドでAレコードを調べる場合は、
dig ドメイン名 a +shortで検索が可能です。

このAレコードはIPv4形式のIPアドレスに対応したレコードとなりますが、
IPv6形式に対応した同種のレコードとして、**AAAAレコード (IPv6 アドレスレコード)**も存在します。合わせて覚えておきましょう。

MXレコード

受信用のメールサーバを指定するためのレコードです。

dig ドメイン名 mx +short
でドメインに紐づくメールサーバを確認することが出来ます。

また、このdigコマンドを叩いた際に、

10 メールサーバ名.com
5 メールサーバ名.com

といった形で、頭に数字がついて情報が返却されるかと思います。
この数字はプリファレンス値といって、メールサーバが複数台ある場合の優先度を示しているので、合わせて覚えておくようにしましょう。

TXTレコード

ドメインから送信を許可するメールサーバを指定するためのレコードです。

この送信許可設定はSPFレコードと呼ばれており、
送信許可の設定をするためには、「TXTレコードにSPFレコードを設定する」というなんともややこしい状況なのですが、歴史的背景など色々あるようですね(笑)

「TXTレコードで送信許可するメールサーバを指定」と覚えておけば、ひとまず問題は無いでしょう。

AWSサービスの中にはSEMと呼ばれるメール送信サービスがあるので、
実際AWSを利用して環境を整えている場合はこのSEMのメールサーバを指定するケースが多いように思います。

digコマンドで調べる場合は、
dig ドメイン名 txt +shortで確認してみてください。

CNAMEレコード

ドメイン名の別名を指定するためのレコードです。

例えば、hoge.jpというドメインに対して

  • CNAMEでfuga.jpが指定されている
  • fuga.jpには、Aレコードで11.11.11.11というIPアドレスが設定されている

となった際に、hoge.jp → fuga.jp → 11.11.11.11という経路を辿って、最終的には11.11.11.11サーバのコンテンツを取得することが可能となるのです。
(この時のfuga.jpをcanonical name(正式名)、hoge.jpを**aliases(別名)**と呼びます)

上記のような場合、digコマンドでaレコードを調べると、CNAMEとAレコードの両方が返ってきます。
CNAMEのみ調べたい場合は
dig ドメイン名 cname +short といったコマンドを使用してみてください。

CNAMEと他レコードの共存

一旦そのドメインに対してCNAMEを設定すると、Aレコードのみではなく、MXレコードもTXTレコードもNSレコードも、全てCNAMEで設定した先の情報を見にいくこととなります。
つまり、

■ hoge.jpの設定
CNAME: fuga.jp
A: 11.11.11.11
MX: 22.22.22.22

■ fuga.jpの設定
A: 33.33.33.33
MX: 44.44.44.44

となっていた場合、hoge.jpのAレコードは33.33.33.33が、MXレコードは44.44.44.44が使用されることとなります。
このような設定による混乱を防ぐために、Route53では、一旦CNAMEを設定すると、他のレコードがセット出来ないような設定となっています。

ZONE APEXとCNAME

ZONE APEX(前述)に対しては、CNAMEが設定出来ません。
なぜなら、ZONE APEXは「SOAレコードとNSレコードの設定が必須」なのに対し、CNAMEを設定した場合「他のレコードの設定が不可」となり、両者が矛盾してしまうからです。

ですが、これはZONE APEXに対してCDNの登録が出来ない ということであり、不便ですよね。
これに対しRoute53は、Aliasレコードという別名機能を使用することで、これを解決しているのです。

PRTレコード

Aレコードの逆で、IPアドレスからドメインを参照するためのレコードです。

dig -x IPアドレス +short
でIPアドレスに対応するドメインを確認することが出来ます。

まとめ

Route53の画面上で、それぞれがどんな設定をしているかが何となく見えてきたのではないでしょうか?
この記事が、皆様の理解の一助となれば幸いです!

Discussion

volibearvolibear

AWSサービスの中にはSEMと呼ばれるメール送信サービスがあるので、
実際AWSを利用して環境を整えている場合はこのSEMのメールサーバを指定するケースが多いように思います。

SEMではなくSESかと思いますが、どうでしょうか?