メモ的ななにか

@Maleic1618

RFC 4592: The Role of Wildcards in the Domain Name System

こんにちは、まれいんです。

この記事は ひとりRFCの旅 Advent Calender 6日目の記事です。

qiita.com

今回はワイルドカードリソースレコードについての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.comhoge.bar.example.com に適応できるかわかりづらい
    • ちなみに適用されません

用語

ここでいくつかの用語の定義をしましょう。

Empty non-terminals

あるドメイン名が、それ自身はリソースレコードを持っていないものの、サブドメインがリソースレコードを持っているとき、そのドメインを Empty non-terminals といいます。

foo.bar.example.comexample.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. 存在しない