ふとした疑問から多段な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)
zoneは83段重ねまでいける。
84段目以上は'ran out of space'といわれ設定できない。
通常は16段まで解決できる模様。
それ以上だと途中(16段)までCNAMEの解決結果しか返さないので、名前解決できない。
成功例
; <<>> 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 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)
Windows付属のnslookupでも試してみました。
DNS設定におけるよくある間違い & DNS設定チェックリスト(pdf) A.11(P.22)に多段CNAME数に関する記述あり。