RFC 4592: The Role of Wildcards in the Domain Name System
こんにちは、まれいんです。
この記事は ひとりRFCの旅 Advent Calender 6日目の記事です。
今回はワイルドカードリソースレコードについてのRFC、RFC4592です。
https://tools.ietf.org/html/rfc4592
概要
ワイルドカードリソースレコードはRFC1034 Section 4.3.3で導入されました。
これはどちらかというと権威サーバ側で使われるものでドンピシャなリソースレコードがない場合に使われるデフォルト値のようなリソースレコードのことを指します。
このワイルドカードのおおよその目的はRFC1034でわかるのですが、詳細があいまいなため各種の実装でずれが生じている状態でした。 DNSSECの影響で仕様をはっきりさせたいこともあり、このRFCで詳細まで決めましょうというもののようです。
(ちなみにchapter 4にワイルドカードドメイン名を持つ一部のリソースレコード(SOA, NS, CNAME, DNAME...)についての考察がありますが、ここはスキップします。)
ワイルドカードリソースレコードとは
まずはワイルドカードについての復習をしましょう。
例えば example.com
のゾーンファイルが以下のようになっていたとします。
*.example.com A 86400 192.0.2.254 hoge.example.com A 86400 192.0.2.1
この時、Aレコードを解決結果は以下のようになります。
解決するドメイン名 | 結果 |
---|---|
hoge.example.com | 192.0.2.1 |
*.example.com | 192.0.2.254 (多分) |
bar.example.com | 192.0.2.254 |
foo.bar.example.com | 192.0.2.254 |
fuga.hoge.example.com | NXDOMAIN |
fuga.hoge.example.com
にはワイルドカードが適用されないことがポイントで、実在するドメインのサブドメインについてはワイルドカードは適用されないことになっています。RFC1034の該当部分は以下です。
Wildcard RRs do not apply: ... - When the query name or a name between the wildcard domain and the query name is know to exist. ...
何が悪かったのか
ではRFC1034だと何が悪かったのか?書いてあることをピックアップします。
sub.*.example
などのような、途中に*
が入るドメインがワイルドカードドメインとして不適切になってしまう*.example.com
というワイルドカードドメインがある場合、hoge.*.example.com
というドメイン名は*.example.com
のサブドメインのため適用外になることが分かりづらいfoo.bar.example.com
は存在するが、bar.example.com
は存在しない時、*.example.com
はhoge.bar.example.com
に適応できるかわかりづらい- ちなみに適用されません
用語
ここでいくつかの用語の定義をしましょう。
Empty non-terminals
あるドメイン名が、それ自身はリソースレコードを持っていないものの、サブドメインがリソースレコードを持っているとき、そのドメインを Empty non-terminals といいます。
foo.bar.example.com
と example.com
にはそれぞれリソースレコードが存在するが、bar.example.com
にはリソースレコードが存在しないとすると、この bar.example.com
がempty non-terminalです。
Closest Encloser
クエリ名の "Closest Encloser" とは、存在するドメイン名の中で(ラベル単位で)最長の後方一致するもののことをさします。 存在するものから選ばれるので、closest encloserは(存在すれば)存在するドメイン名となります。
当然、クエリ名が存在するドメイン名の時はそれ自身がClosest Encloserになります。
Source of Synthesis
クエリ名の "Source of Synthesis" とは、(存在するならば)*.<クエリ名のclosest encloser
のことを指します。
当然、存在しないこともあります。
適用の仕方
クエリ名に対応するレコードがなく、途中でゾーンカットされていないとき、source of synthesisがあればワイルドカードを適用します。 これによってどういうときにワイルドカードを使うかを定義します。
おそらくこれだけだとわかりづらいので、RFCの例を引用します。 以下のように定義されているexample.ゾーンを考えます。
$ORIGIN example. example. 3600 IN SOA <SOA RDATA> example. 3600 NS ns.example.com. example. 3600 NS ns.example.net. *.example. 3600 TXT "this is a wildcard" *.example. 3600 MX 10 host1.example. sub.*.example. 3600 TXT "this is not a wildcard" host1.example. 3600 A 192.0.2.1 _ssh._tcp.host1.example. 3600 SRV <SRV RDATA> _ssh._tcp.host2.example. 3600 SRV <SRV RDATA> subdel.example. 3600 NS ns.example.com. subdel.example. 3600 NS ns.example.net.
treeは以下のようになります。
| -------------example------------ / / \ \ / / \ \ / / \ \ * host1 host2 subdel | | | | | | sub _tcp _tcp | | | | _ssh _ssh
この時、closest encloserとsource of synthesisは以下のようになります。
QNAME | Closest Encloser | Source of Synthesis |
---|---|---|
host3.example. |
example. |
*.example. |
_telnet._tcp.host1.example. |
_tcp.host1.example. |
存在しない |
_dns._udp.host2.example. |
host2.example. |
存在しない |
_telnet._tcp.host3.example. |
example. |
*.example. |
_chat._udp.host3.example. |
example. |
*.example. |
foobar.*.example. |
*.example. |
存在しない |