DNSレコードの最後のドット「.」は大事


概要

DNSのCNAMEレコードにおいて、最後のドットを省略して設定したことで少しハマった。
最後のドットはドメインの終端を示す記号として重要だということがわかったので、不要に省略するのはやめたほうが良さそう。

環境

  • バリュードメインでドメインを取得した
  • Office365を独自ドメインで利用している
  • Office365のNSにてドメインを管理している

経緯

独自ドメインを使ってGCPでWEBページを公開したいと考え、サブドメイン(www)の管理をGCPのCloudDNSに移管しようと考えた。
しかしながら、Office365のドメイン管理ではサブドメインの管理を他NSにできるNSレコードは追加できないことがわかった。
よって、Office365のNSからバリュードメインのNSに切り替えることとし、バリュードメインのNSに必要なDNSレコードを追加しようとした。

実施した手順

Office365のExchangeサービスを利用するにあたり、必要なDNSレコードは以下の通りだとOffice365のページには書いてある。

種類 優先度 ホスト名 ポイント先のアドレスまたは値 TTL アクション
MX 0 @ example-com.mail.protection.outlook.com 1時間
TXT - @ v=spf1 include:spf.protection.outlook.com -all 1時間
CNAME - autodiscover autodiscover.outlook.com 1時間

この通りに設定しようとして、バリュードメインのNSのDNSレコード設定にて以下の様に記述した。

mx example-com.mail.protection.outlook.com. 0
txt @ v=spf1 include:spf.protection.outlook.com -all
cname autodiscover autodiscover.outlook.com

課題

しかしながら、Office365側でDNSレコードの設定が正しいか確認するとCNAMEでエラーが出てしまう。
どうやらCNAMEが期待されたとおりに設定されていないようだ。

期待値
CNAME autodiscover autodiscover.outlook.com
現実の設定
CNAME autodiscover autodiscover.outlook.com.example.com

「CNAMEはサブドメインのエイリアスを貼るようなものだが、他のドメインへのエイリアスは貼れないのか?」と一瞬思ったが、どうやら違いそう。

原因

一言で言えば、上記の記述だとCNAMEのポイント先が以下のどちらなのか曖昧なので、下の設定をされてしまったからだということがわかった。

  • autodiscover.outlook.com
  • autodiscover.outlook.com.example.com

CNAMEはCNAME AAA BBBのように記述するが、これは「AAAというサブドメインの問い合わせが来たら、BBBと同じ処理をするよ」という意味だ。
ここがポイントなのだが、BBBは同じドメインのサブドメインを指定することもできるし、他のドメインを指定することもできる。
(例:example.comにアクセスするとexample.netと同じサーバーから応答をさせる場合など)

ここで、BBBにドット「.」が含まれる場合を考える。
CNAMEはCNAME aaa bbb.comという設定をすることになるが、これはDNSサーバーからすると
「aaa.example.comはbbb.comを示す」のか「aaa.example.comはbbb.com.example.comを示す」のか判断がつかないようだ。
(こうしたケースでDNSサーバーがどっちの挙動を示すのが正しいのかは詳しく調べてはいない。)

解決方法

CNAMEのレコードの終端にドット「.」を記述すれば良い。レコードの終端のドットはドメインの終端を示すようだ。
つまり、CNAME aaa bbb.com.と記述することで、「aaa.example.comはbbb.comを示す」ことが確定する。

参考文献1からの引用+改変だが、以下のように整理できる。

    CNAME("foo", "bar)        // 良い (bar.example.comと解釈される)
    CNAME("foo", "bar.com.")  // 良い (bar.comで確定する)
    CNAME("foo", "bar.com")   // ダメ (曖昧、今回ハマったパターン)
    CNAME("foo", "meta.xyz")  // ダメ (同じく曖昧、meta.xyz.example.comかも?)

結論

必要な場合は、DNSレコードの終端にはドットをつけよう。
今まで「なんでDNSのレコードの終端にドットが付いてることあるんだろ」と気にはなっていたが、放置していたのが良くなかった。
Office365の設定例のページにもドットを入れておいてほしい。

参考文献