目次

多段CNAMEの名前解決

ふとした疑問から多段なCNAMEをもつホスト名を作成し、どこまで名前解決できるのか調べてみました。
100.99.98.97…example.jpなホストを99.98.97…example.jpにcnameを向けてそれを1まで重ねていき、どこまで名前解決できるか調べたものです。
ちなみに各DNSサーバソフトなどが多段CNAMEを名前解決できるからといって、多段CNAMEを全く推奨しません。CNAMEを使うこと自体できる限り避けるべき場合が多いです。
最近でもMicrosoftのサーバ群でCNAMEを向けられた先のNSサーバが応答しなくなり、一部のサービスにアクセスできないなどの要因の一部になったりしています1)
他にもZone Apex(example.jpなどNSレコードなどを書くべき領域)にCNAMEをふってしまう方法などを推奨したり求めたりするところもありますが、様々なトラブルの要因となるため、本来するべきではありません。2)

現在執筆中なので、内容が変わったりします。
2011/10中に書き終えたらいいな。

コンテンツサーバ編

BIND

zoneは83段重ねまでいける。
84段目以上は'ran out of space'といわれ設定できない。

NSD

PowerDNS

djbdns(tinydns)

リゾルバ編

BIND

通常は16段まで解決できる模様。
それ以上だと途中(16段)までCNAMEの解決結果しか返さないので、名前解決できない。
成功例

% dig 16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
; <<>> DiG 9.8.0-P2 <<>> 16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6247
;; flags: qr rd ra; QUERY: 1, ANSWER: 17, AUTHORITY: 1, ADDITIONAL: 0
 
;; QUESTION SECTION:
;16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. IN        A
 
;; ANSWER SECTION:
16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 9.8.7.6.5.4.3.2.1.ctest.example.jp.
9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME   8.7.6.5.4.3.2.1.ctest.example.jp.
8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN   CNAME   7.6.5.4.3.2.1.ctest.example.jp.
7.6.5.4.3.2.1.ctest.example.jp. 1800 IN     CNAME   6.5.4.3.2.1.ctest.example.jp.
6.5.4.3.2.1.ctest.example.jp. 1800  IN      CNAME   5.4.3.2.1.ctest.example.jp.
5.4.3.2.1.ctest.example.jp. 1800    IN      CNAME   4.3.2.1.ctest.example.jp.
4.3.2.1.ctest.example.jp.   1800    IN      CNAME   3.2.1.ctest.example.jp.
3.2.1.ctest.example.jp.     1800    IN      CNAME   2.1.ctest.example.jp.
2.1.ctest.example.jp.       1800    IN      CNAME   1.ctest.example.jp.
1.ctest.example.jp.         1800    IN      CNAME   ctest.example.jp.
ctest.example.jp.           1800    IN      A       192.168.1.1
 
;; AUTHORITY SECTION:
ctest.example.jp.           1800    IN      NS      ns.example.jp.
 
;; Query time: 65 msec
;; SERVER: ::#53(::)
;; WHEN: Fri Sep 30 14:02:29 2011
;; MSG SIZE  rcvd: 341

失敗例

% dig 17.16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
; <<>> DiG 9.8.0-P2 <<>> 17.16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47003
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 17, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;17.16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.        IN A
 
;; ANSWER SECTION:
17.16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
10.9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME 9.8.7.6.5.4.3.2.1.ctest.example.jp.
9.8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN CNAME   8.7.6.5.4.3.2.1.ctest.example.jp.
8.7.6.5.4.3.2.1.ctest.example.jp. 1800 IN   CNAME   7.6.5.4.3.2.1.ctest.example.jp.
7.6.5.4.3.2.1.ctest.example.jp. 1800 IN     CNAME   6.5.4.3.2.1.ctest.example.jp.
6.5.4.3.2.1.ctest.example.jp. 1800  IN      CNAME   5.4.3.2.1.ctest.example.jp.
5.4.3.2.1.ctest.example.jp. 1800    IN      CNAME   4.3.2.1.ctest.example.jp.
4.3.2.1.ctest.example.jp.   1800    IN      CNAME   3.2.1.ctest.example.jp.
3.2.1.ctest.example.jp.     1800    IN      CNAME   2.1.ctest.example.jp.
2.1.ctest.example.jp.       1800    IN      CNAME   1.ctest.example.jp.
1.ctest.example.jp.         1800    IN      CNAME   ctest.example.jp.
 
;; Query time: 9 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Sep 30 13:16:44 2011
;; MSG SIZE  rcvd: 310

備考

BIND付属のdigで調べるとき84段目を調べようとすると'ran out of space'と言われて名前解決できない。

% dig 84.83.82.81.80.79.78.77.76.75.74.73.72.71.70.69.68.67.66.65.64.63.62.61.60.59.58.57.56.55.54.53.52.51.50.49.48.47.46.45.44.43.42.41.40.39.38.37.36.35.34.33.32.31.30.29.28.27.26.25.24.23.22.21.20.19.18.17.16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.
dig: '84.83.82.81.80.79.78.77.76.75.74.73.72.71.70.69.68.67.66.65.64.63.62.61.60.59.58.57.56.55.54.53.52.51.50.49.48.47.46.45.44.43.42.41.40.39.38.37.36.35.34.33.32.31.30.29.28.27.26.25.24.23.22.21.20.19.18.17.16.15.14.13.12.11.10.9.8.7.6.5.4.3.2.1.ctest.example.jp.' is not a legal name (ran out of space)

PowerDNS Recursor

djbdns(dnscache)

Windows

Windows付属のnslookupでも試してみました。

WindowsXP

Windows Vista

Windows7

Windows 2003 Server

番外編

Google Public DNS

参考資料

DNS設定におけるよくある間違い & DNS設定チェックリスト(pdf) A.11(P.22)に多段CNAME数に関する記述あり。

2)
draft-sury-dnsext-cname-at-apex-00 - CNAME at the zone apexというのもありますが、現状はドラフトで止まっています。今後はどうなるか不明です。