CNAMEの間違った使い方

カテゴリ
ブックマーク数
このエントリーを含むはてなブックマーク はてなブックマーク - CNAMEの間違った使い方
このエントリーをはてなブックマークに追加
情報環境技術研究室の永井です。 今日はDNSのCNAMEの間違った使い方のお話です。
その間違った使い方がうちのサービスで使用されているかもっ!?

DNSって?

Domain Name System(ドメイン ネーム システム、DNS)はインターネットを使った階層的な分散型データベースシステムである。
1983年に情報科学研究所 (ISI) のポール・モカペトリスとジョン・ポステルにより開発された。
Wikipediaより一部抜粋
http://ja.wikipedia.org/wiki/Domain_Name_System

例えば、ライブドアのポータルサイトといえば「http://www.livedoor.com/」ですが、実際には「http://125.6.172.15/」というIPアドレスがインターネット上の住所になります。でも、こんな数字の羅列を一々覚えていられないので、DNSという名前を変換する仕組みを「名前解決」といいまして、これを利用して覚えやすい名前で公開しています。

レコード

ドメインを公開する時に、”レコード”というものを設定します。これは「www.livedoor.com は 125.6.172.15 だよ」という内容を設定しておきます。 レコードを設定することで「http://www.livedoor.com/」をブラウザに入力するとページが表示されるわけです。

少し細く解説すると、ドメインをIPアドレスに変更するレコードを”Aレコード”と呼びます。DNSサーバで一般的なBINDではこのようなAレコードを設定します。

www.livedoor.com. IN A 125.6.172.15

CNAME

CNAME(レコード)とは、別名の設定をするためのレコードです。別名の設定というのは「http://www.livedoor.jp/(JP)」にアクセスしたら、 「http://www.livedoor.com/(COM)」にアクセスする設定のことです。

ブラウザで見ている人は「http://www.livedoor.jp/(JP)」となりますが、 PC内部では名前解決で「http://www.livedoor.com/(COM)」であることが判明し、そこから「http://125.6.172.15/」にたどり着くようになっています。

BINDでは次のようなCNAMEレコードを設定します。

www.livedoor.jp. IN CNAME www.livedoor.com.

CNAMEを便利に使う

ドメインを公開するときにはレコードを設定しますが、数が多い時は設定の手間を減らしたいと思うはずです。

ケース1:同じAレコードが多数あって変更が面倒
aaa.livedoor.com -> www.livedoor.com
bbb.livedoor.com -> www.livedoor.com
ccc.livedoor.com -> www.livedoor.com
...

ケース2:別の人が管理しているドメインにレコードを設定したい
data-hotel.livedoor.jp -> data-hotel.ne.jp

このようなケースではCNAMEを設定することで、いろんな手間が省けて楽になります。

CNAMEの落とし穴

ここまでは知っている人もいますね。

ところがっ!

一見便利にも見えるCNAMEの性質ってご存知ですか?

2.4 CNAME records

A CNAME record is not allowed to coexist with any other data. In other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you can't also have an MX record for suzy.podunk.edu, or an A record, or even a TXT record. Especially do not try to combine CNAMEs and NS records like this!:

CNAMEレコードは他のどんなデータとも一緒に存在することが許されていません。
言い換えれば、もし suzy.podunk.xx が sue.podunk.xx の別名の場合、suzy.podunk.xx に MX レコードを持たせることはできません。A レコードも、 TXT レコードさえも持たせることはできません。特に、次のように CNAME と NS レコードを一緒にしてはいけません !

以下より一部抜粋

Common DNS Operational and Configuration Errors
(DNSの運用と設定においてよくある間違い)
http://www.ietf.org/rfc/rfc1912.txt

日本語訳
http://web.archive.org/web/20071206031551/http://bonz.squares.net/~dais/misc/rfc1912j.html

”CNAMEを設定したときは、他の全てのレコードを設定してはならない”

簡単に言えば、こういうことです。

詳細

DNSでドメインのレコードを設定するとき、次のレコードが必要になります。
livedoor.com. IN SOA ldns01.data-hotel.net. hostmaster.data-hotel.net. 2010112601 10800 3600 604800 3600
livedoor.com. IN NS ldns01.data-hotel.net.
livedoor.com. IN NS ldns02.data-hotel.net.
livedoor.com. IN NS ldns03.data-hotel.net.
livedoor.com. IN NS ldns04.data-hotel.net.
livedoor.com. IN NS ns5.livedoor.com.
livedoor.com. IN NS ns6.livedoor.com.

この時、livedoor.comのCNAMEを設定したらどうなるでしょうか?

livedoor.com. IN CNAME www.livedoor.com.
www.livedoor.com IN A 125.6.172.15

”CNAMEを設定したときは、他の全てのレコードを設定してはならない”

ならば

”CNAMEを設定したときは、他の全てのレコードを無視してもよい”(MAY)
”CNAMEを設定したときは、他の全てのレコードを無視するべき”(SHOULD)
”CNAMEを設定したときは、他の全てのレコードを無視しなければならない”(MUST)

このような解釈が可能となり、その答えはDNSソフトウェアの設計者に依存します。

さらなる詳細

DNS権威サーバ(コンテンツサーバ)が応答する内容が次の通りだとします。
;; ANSWER SECTION:
livedoor.com. 3600 IN CNAME www.livedoor.com.
www.livedoor.com 3600 IN A 125.6.172.15

;; AUTHORITY SECTION:
livedoor.com. 3600 IN NS ns5.livedoor.com.
livedoor.com. 3600 IN NS ns6.livedoor.com.

;; ADDITIONAL SECTION:
ns5.livedoor.com. 3600 IN A 203.104.103.115
ns5.livedoor.com. 3600 IN AAAA 2407:3000:6c::53
ns6.livedoor.com. 3600 IN A 203.104.103.116
ns6.livedoor.com. 3600 IN AAAA 2407:3000:6c::35
DNSフルリゾルバ(キャッシュサーバ)が解釈可能なパターンは次の通りです。

パターン1
 livedoor.comのCNAMEレコードはwww.livedoor.comである
 ならば、livedoor.comのNSレコードはwww.livedoor.comである
 ならば、www.livedoor.comに問い合わせることでlivedoor.comのAレコードを解決できるはず

パターン2
 livedoor.comのCNAMEレコードはwww.livedoor.comである
 ならば、livedoor.comのNSレコードはwww.livedoor.comである
 しかし、NSレコードがns5.livedoor.com、ns6.livedoor.comである回答が存在する
 ならば、回答を信用してNSレコードはns5.livedoor.com、ns6.livedoor.comである
 ならば、ns5.livedoor.com、ns6.livedoor.comに問い合わせることでlivedoor.comのAレコードを解決できるはず

(応答にAレコードが含まれているので信用するパターンは、パターン2に含みます)

どちらのパターンになるかは実装依存ですが、現在判明している挙動は以下のとおりです。

BIND パターン2
djbdns パターン2
unbound パターン2
Windows Server 2008 R2 パターン1

影響

もし間違えてCNAMEと他のレコードを設定してしまうと、 正しく名前解決できなくなります。 すなわち、ブラウザでアクセスできない、 メールが届かないといった問題が起こるようになります。

解決方法

CNAMEを設定するときに、他のレコードを登録しないようにしましょう。特に、NSレコードと同じにならないように注意が必要です。この設定の多くは、djbdns(tinydns)でみられます。djbdnsは設定内容に問題があってもエラー扱いとはならず、他のレコードも含めて問題に気が付きにくいという欠点を持ちます。また、djbdnsではCNAMEは使用可能であるものの推奨していません。その為か、CNAMEの扱いがいい加減という説もあります。

見直しのすすめ

ライブドアドメインではこれまでdjbdnsを使用していましたが、今年の11月1日にNSDというソフトウェアにリニューアルしまして、新機能と同時にこのCNAME問題に対応しました。サービスで使用しているドメインのうち、ネームサーバが

ns1.domain.livedoor.com
ns2.domain.livedoor.com

のものは正しく稼動しています。もし他のネームサーバを使用していて、CNAMEを設定しているドメインがあれば、今一度再確認することをオススメします。
もしかしたら、その設定間違っているかもしれませんよっ!?