tubo28's blog
つぼの 140 文字より長い文章置き場
About me

同じドメインをメールと Web の両方に使うと CNAME が使えなくなる

Last Modified:
Tags: dns

単一のドメインをメールと Web の両方に使うと、CNAME レコードが使えなくなる (RFC 1034, Section 3.6.2)。

CNAME (Canonical Name) レコードは、あるドメイン名に対するエイリアスを定義する。例えば、example.com の向け先として、外部サーバーのドメインを指定する場合などに使われる。

DNS の仕様における CNAME の制約はかなり強力である。 CNAME が設定されると、「このドメイン名に対する問い合わせは、 A であれ MX であれ TXT であれ、すべて指定した別名に丸投げし、その先で答えを探せ」という意味になってしまう。RFC 1034 では「CNAME を設定したドメイン名には、他のいかなるレコードも同時に存在させてはならない」という厳格なルールが定められている。

先日経験した失敗は

  1. foo.example.com で Web サービスを運用する
  2. foo.example.com でメールも運用するため、MX レコードを設定する
  3. foo.example.com を Vercel のような外部サービスで作り直したため CNAME レコードを設定したい -> MX レコードがあるためできない!!

というものだった。 この問題を回避するために、メールと Web を同じドメインで運用するのをやめる必要があった。例えば、メールは mail.example.com で運用し、Web は example.com でサーブするなどとすればいい。

もう一つの解決方法として、ALIAS レコード (ANAME レコードとも呼ばれる) を使う方法がある。

ALIAS レコードは RFC で標準化された仕様ではなく、一部の DNS プロバイダーが独自に実装した拡張機能である。仕組みとしては、DNS サーバーが問い合わせを受けた際に内部で CNAME のような名前解決を行い、最終的な A レコード (IP アドレス) をクライアントに返す。クライアント側からは通常の A レコードとして見えるため、CNAME の制約 (他のレコードとの共存不可) を回避できる。

これにより、foo.example.com に MX レコードを設定したまま、ALIAS レコードで Vercel などの外部サービスのドメインを指定することが可能になる。まるで私のようにメールと Web が衝突して困ったときのために作られた機能である (知らんけど)。試したことはない。

ただし、ALIAS レコードはすべての DNS プロバイダーでサポートされているわけではない。Cloudflare, AWS Route 53, Google Cloud DNS などが対応している。