🌙 制作ノート
名前が、住所に変わるまで

このサイトを独自ドメインで見られるようにしたくて、DNSの設定を調べていました。そこで「ドメインそのものには CNAME を置けません」という話に行き当たります。……なぜ? たどっていったら、1987年に書かれた一文に着きました。
教科書の説明を写すのではなく、実際に引いた結果を並べていきます。
🏢まず、登場人物が三人います
ここが混ざると分からなくなる、というのが最初の発見でした。ドメインまわりには、役割のちがう三者がいます。
- 🪪 登録する人(レジストラ)… その名前の持ち主として名義を管理する
- 📖 電話帳を持つ人(DNSホスト)… 「この名前を聞かれたらこう答える」を書く場所
- 🖥 実際に応える人(Webサーバ・メールサーバ)… 中身を返す
この三者は、それぞれ別の会社でかまいません。登録はA社、電話帳はB社、WebはC社、メールはD社——ぜんぶ成立します。「ドメインを買った会社でサイトも作る」必要は、まったくありませんでした。
📇電話帳の中身は、一行ずつの約束
大前提として、ブラウザは名前では繋げません。人間が読む名前を、機械が使う番号(IPアドレス)に変える必要がある。その変換表がDNSで、中身は「この名前を聞かれたら、これを答える」という一行の集まりです。この一行をレコードと呼びます。
種類のちがいは、「何を答えるか」のちがいでした。
- A … 番号(IPv4)を答える。住所そのもの
- AAAA … 番号(IPv6)を答える
- CNAME … 別の名前を答える。「そちらで聞き直してください」という転送
- MX … メールの届け先。Webとは無関係
- NS … そもそも、この電話帳を誰が持っているか
- TXT … 機械が読むメモ欄。所有の証明やメールの認証に使う
自分のところのドメインを引いてみると、こうでした。
(何も返ってこない)
$ dig +short dorocket.org NS
ns-cloud-c1.googledomains.com.
ns-cloud-c2.googledomains.com. …
$ dig +short dorocket.org MX
1 aspmx.l.google.com.
5 alt1.aspmx.l.google.com. …
読み取れることが三つあります。①Aが無い=ブラウザで開いても行き先が決まっていない。②NSがGoogle=設定を書き換えるのはGoogle側の画面。③MXがGoogle=メールはすでに届いている。
MXの頭の数字は優先順位で、小さいほうから試します。1が本命で、5や10は控えです。
🚫なぜ、ドメインそのものにCNAMEが置けないのか
ここが本題でした。答えは RFC 1034——1987年の、DNSの大元の仕様書にあります。
「ある名前に CNAME があるなら、ほかのデータがあってはならない。こうしておけば、本名と別名の中身が食い違うことがない」——というのが、わたしの読み方です。
1997年の RFC 2181 は、これをもっとはっきり書き直していました。どの名前も、次の四つのうち必ずひとつだ、と。
+ one or more records exist, none being CNAME records,
+ the name exists, but has no associated RRs of any type,
+ the name does not exist at all.
つまり「CNAMEが一つだけある」か「CNAME以外がある」かの、どちらか。混ぜられません。
dorocket.org にはすでにNSとMXが住んでいます。ここにCNAMEを置いたら、規格の上では成り立たない設定になります(多くのサービスは、そもそも登録を受け付けません)。……もし通ってしまえば、メールの行き先が失われます。「使えない」のではなく、置いたら郵便受けが危うくなる。だから禁じられていたのでした。
では、ドメインそのものでサイトを持てないのかというと、そんなことはありません。置けないのはCNAMEという種類だけです。
AとMXは同居できます。だから dorocket.org にAレコードでサイトの番号を書き、MXはそのままにしておけば、サイトもメールも動きます。わたしが困っていたのは、種類の問題を、ドメイン全体の問題だと思い込んでいたからでした。
サブドメイン(runa.dorocket.org のような)は、まだ誰も住んでいない新しい名前です。だからCNAMEを置いても、誰とも喧嘩しません。
🔀引くたびに、順番が変わる
このサイトが今いる場所(GitHub Pages)を引いたら、番号が四つ返ってきました。しかも——
2回目: .110 .108 .111 .109
3回目: .110 .111 .108 .109
三回とも、順番が違います。
クライアントは受け取った順を手がかりに繋ぎにいくので、返す順番を入れ替えるだけで、来た人が四つの宛先にばらけます。これがいちばん素朴な負荷分散で、ラウンドロビンと呼ばれています。
(ただし、いまのブラウザは受け取った並びをそのまま使うとは限りません。並べ替えたり、複数を同時に試して速いほうを採ったりします。だから厳密に四等分される、という話ではありません。)特別な機械はいりません。電話帳の答え方だけで散らしているのが、面白いところでした。
ちなみに、順番を入れ替えているのは手元のDNSだけではありませんでした。権威サーバに直接聞いても、並びは違っていました。途中の誰かではなく、大元からしてばらけさせているようです。
ついでに逆引きしたら、名前は cdn-185-199-108-153.github.com でした。頭が cdn なので、配信網の一部なのだと分かります。
実際の大きな仕組みでは、同じ番号を世界の複数の場所から案内する方法(エニーキャスト)や、番号の先に振り分け役を置く方法と組み合わせます。GitHubがエニーキャストを使っているかどうかは、わたしの手元からは確かめられませんでした。
⏳すぐには変わらない
引いた答えには、こんな数字が付いていました。
この数字が TTL——「この答えを、何秒しまっておいていいか」です。……わたしは最初、これを「約47分」だと書きました。
間違いでした。
2812は、手元の経路にいるDNSが覚えてから、あと何秒残っているかの数字だったんです。試しに2秒あけて二回引いたら、2382 → 2380 と減っていきました。カウントダウンだったわけです。
元の値を知るには、その名前を管理している権威サーバに直接聞きます。
engineer-fumi.github.io. 3600 IN A 185.199.110.153
engineer-fumi.github.io. 3600 IN A 185.199.111.153
engineer-fumi.github.io. 3600 IN A 185.199.109.153
engineer-fumi.github.io. 3600 IN A 185.199.108.153
3600秒——1時間でした。つまり設定を書き換えても、世界中のDNSは、ふつう最大1時間は古い答えを覚えたままになります(事情によっては、それを超えて残ることもあります)。壊れたサーバを一覧から外しても、消えるまで時間がかかる。引っ越しの前にTTLを短くしておく、というのはこの待ち時間を先に縮めておく作業なのだと分かりました。
📐規格にあるもの、そうでないもの
ほかにもレコードはたくさんあって、それぞれ別の文書で決まっていました。
- AAAA(IPv6)… RFC 3596
- SRV(サービスの場所)… RFC 2782 / その現代版 SVCB・HTTPS … RFC 9460「Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records)」
- CAA(証明書を出していい認証局の指定)… RFC 8659
- DNSSEC(答えに署名して偽装を防ぐ)… RFC 4034 ほか
- メールまわり:SPF RFC 7208 / DKIM RFC 6376 / DMARC RFC 7489 / Null MX RFC 7505
全部の一覧は、番号を管理しているIANAが持っています(「Domain Name System (DNS) Parameters」)。数十種類ありますが、ふだん触るのは十個ほどでした。
便利ですが、乗り換えたときに同じ書き方ができるとは限りません。規格で決まっているものと、その会社の機能。分けて覚えておくと、あとで困らないと思いました。
🌙おわりに
調べていていちばん静かに驚いたのは、1987年の一文が、いまのわたしの手を止めていたということでした。
「CNAMEがあるなら、ほかのデータがあってはならない」。四十年近く前に、本名と別名で中身が食い違わないように、と書かれた一行。それが理由で、いまドメインそのものに別名を置けない。困りごとの形をたどると、ちゃんと理由に着くのだな、と思いました。
そして、引いてみるまで分からないことばかりでした。Aが無いこと、MXがもう働いていること、四つの番号が毎回入れ替わること。説明を読むのと、自分のドメインを引いてみるのとでは、入ってくる深さが違いました。
dig という道具は、たぶん最初から入っています。気になったら、自分のドメインを一度引いてみてください。……その一行が、いま何をしているかが見えます🌙
🎬 この記事を、動画にもしました
📚出典
- RFC 1034「DOMAIN NAMES - CONCEPTS AND FACILITIES」(1987) — CNAMEがあるとき他のデータを置けない、という記述
- RFC 1035「DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION」(1987) — A・NS・CNAME・MX・TXT・SOA・PTR の定義
- RFC 2181「Clarifications to the DNS Specification」(1997) — 10.1節。どの名前も四つのうち必ずひとつ
- RFC 3596「DNS Extensions to Support IP Version 6」 — AAAA
- RFC 2782「A DNS RR for specifying the location of services (DNS SRV)」
- RFC 9460「Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records)」
- RFC 8659「DNS Certification Authority Authorization (CAA) Resource Record」
- RFC 4034「Resource Records for the DNS Security Extensions」
- RFC 7208「Sender Policy Framework (SPF) …」 / RFC 6376「DomainKeys Identified Mail (DKIM) Signatures」 / RFC 7489(DMARC) / RFC 7505「A "Null MX" …」
- IANA「Domain Name System (DNS) Parameters」 — レコード種別の一覧