逆引き設定に関する調査
SERVER
djbdns
djbdns とは、qmail の作者、D.J.Bernstein さんが作成したネームサーバです。
http://djbdns.jp.qmail.org/djbdns/ に掲げられていますけど、「安全、確実、高速、簡潔、設定も簡単な DNS ツール群」 が売り文句になっているようです。
今回は、とあるクラス C 未満の IP アドレスが割り当てられたネットワークにて、逆引きの設定をしようとしたときにうまく設定できなかったことが発端です。
とりあえず問い合わせてみると、サポート時間外だったために細かいことは聞けなかったのですけど、「JPNIC 推奨のルールに従って逆引きのゾーンを設定している」 とのこと。
時間が明けてから細かく聞いてもきっとよかったのでしょうけど、何もしないで聞くのもなんだか悪いので、少々しらべてみることにしました。
JPNIC の推奨ルール…?
逆引きの DNS ゾーンを登録する場合、DNS サーバに適切な (委譲された) ゾーンを登録する必要があります。このゾーンは委譲する側が決定するため、管理者によってゾーンの決め方が違うことがあるようです。
特に IP を 1 つとか 8 つとか、小規模ユーザ向けのサービスの場合は特に、個々のプロバイダが設定することになり、それゆえ、違った感じのゾーン名になることも多いとか、多くないとか…。
実際、自分の経験でも、"OCN エコノミー" から "OCN ADSL IP8" に変更してからというもの、同じような設定では逆引きできなくなってしまったのでした。
なにはともあれ、今回の環境では 「JPNIC 推奨のルールに従ってゾーンを登録している」 とのことだったので、ではその推奨ルールとはどういうものなのか、調べてみることにしました。
とりあえず、JPNIC さまのサイトを参照してみたところ…、と、人のことは言えないのですけど、相変わらずどこにどの文章があるのやら…。
注意深く探すより、とりあえず Google さまを利用して JPNIC 推奨のルールがどんなものなのか、調べてみることにしました。
すると、とりあえず無効な文書との注意書きがあるながら、http://www.nic.ad.jp/doc/jpnic-00022.html にそれっぽい文書が見つかりました。「Class C 未満のアドレス空間の割り当て (サブアロケーション)」 と呼んでいるようです…。
この文書は本来、サブアロケーションに関しての割り当てを正式に行うという告知のような感じですけど、その中で DNS に関するお話も載っていたので一応、目を通して見ます。
とりあえず、JPNIC 側の DNS には、Class C 全体に対応するネームサーバのみを割り当て、それより小さい部分は、各自のネームサーバにて登録せよ、という感じに見受けられます。これが、各プロバイダーで若干異なることになっているのでしょう。
その登録についてですけど、その方法についても触れられていました。これが JPNIC 推奨のルールでしょうか。もっとも、文章の冒頭に 「有効期限切れにつき無効」 と但し書きされていますのでなんともいえないですけど。
と、その前に、サブアロケーションの登録は次のように登録申請せよとのことでした。(申請するのはプロバイダの人)
a. [IPネットワークアドレス] 192.168.0.64/26
登録せよ、すなわち、JPNIC の whois で検索できるかもしれないですね。後々役に立つかもしれないのでメモしておきました。
そして肝心のネームサーバの設定方法です。どこにあるのか [参考文献1] に述べられている方式をもとに1つの例を挙げているとのことです。
たとえば 192.168.0.0 のサブアロケーションを行う場合、JPNIC には Class C 全体の 0.168.192.in-addr.arpa ゾーンに対応する NS レコードが登録されるそうです。そして…、そのサブアロケーションを行う側は、次のようなレコードを 0.168.192.in-addr.arpa データベース内に登録せよとの事です。
$ORGIN 0.168.192.in-addr.arpa.
@ IN SOA provider1-ns.provider1.ad.jp. hostmaster.provider1.ad.jp (...)
; For Organization A
00A IN NS ns.A.co.jp.
1 IN CNAME 1.00A.0.168.192.in-addr.arpa.
2 IN CNAME 2.00A.0.168.192.in-addr.arpa.
:
63 IN CNAME 63.00A.0.168.192.in-addr.arpa.
; For Organization B
00B IN NS ns.B.co.jp.
65 IN CNAME 65.00B.0.168.192.in-addr.arpa.
66 IN CNAME 66.00B.0.168.192.in-addr.arpa.
:
95 IN CNAME 95.00B.0.168.192.in-addr.arpa.
これは…、00A.0.168.192.in-addr.arpa. というゾーンを ns.A.co.jp というネームサーバへ委譲したうえで、"1" つまり 192.168.0.1 は 1.00A.0.168.192.in-addr.arpa. を参照せよ、"2" は…(略) という感じの設定でしょうか。
その上で ns.A.co.jp を所有している側 (Organization A) は、"00A.0.168.192.in-addr.arpa" というゾーンを ns.A.co.jp に登録して、次のようにレコードを登録すればいいとのことです。
$ORGIN 00A.0.168.192.in-addr.arpa.
@ IN SOA ns.A.co.jp. hostmaster.A.co.jp (...)
IN NS ns.A.co.jp.
IN PTR networkname.A.co.jp.
IN A 255.255.255.192
1 IN PTR host1.A.co.jp.
2 IN PTR host2.A.co.jp.
ここは基本的に普通、といいますか、今回はここでいう $ORIGIN の部分を知りたいのでした。なお、"IN A 255.255.255.192" のところは、とりあえずネットマスクが設定されているようです…。
あと、アドレス空間の目安が載っていました。役立つかもしれないので、一応まとめておきます。
IP の数 クラス C を 1 とした大きさ プレフィックス 4 1/64 /30 8 1/32 /29 16 1/16 /28 32 1/8 /27 64 1/4 /26 128 1/2 /25
なお、「この設定はあくまでも例であって、今後、よりよい方法を提案していただくことも推奨」 と書き加えられていました。提案していただくことも推奨…、ということは良いように変えてください、ということなのでしょうか。
とりあえず、現在もこれが推奨設定かは別として、大まかな仕組みはわかったような気がします。ただこの場合、00A とかそのあたりがどう設定されているのか、適切なものを当てるのが大変そうです。
実例を調べてみる
実際に、といってもどこどこの設定ではという紹介ではないですけど、「逆引き設定の仕方」 に出てくるゾーン名を探してみることにしました。
そうしたところ、以前自分でも OCN エコノミーで設定していたような、ネットワークアドレスを逆にした感じのが多いようなきがしました。たとえば、192.168.0.96/27 であれば "96.0.168.192.in-addr.arpa" のような感じです。
…ついでに一応、ネットマスクのレコード指定は無くても問題はないとのことです。
ただ、ほかにも "SUB96.0.168.192.in-addr.arpa" というゾーンが要求される場面もあったりと、当てるのはなかなか難しいかもしれないです。
あらためて、サブアロケーションについて調べる
とりあえず闇雲に進むまえに、せっかく今回のことがらを JPNIC では 「サブアロケーション」 と表現することがわかったので、それをキーワードにもう一度 JPNIC のサイトを検索してみることにしました。
すると /24より小さい割り当てに対する、ネームサーバーの逆引きの設定方法 という文書が、2003/05/12 という比較的あたらしい時期に更新された文書として公開されていました。
それには、192.168.0.0/24 を持っているプロバイダが、some-dom.co.jp [192.168.0.32/27] を切り分けて利用する、というような環境についてが書かれているようです。
このとき、プロバイダ側のネームサーバでは 192.168.0.0/24 の逆引きゾーンである "0.168.192.in-addr.arpa" を管理し、切り分けてもらった側が "32/27.0.168.192.in-addr.arpa" を管理する方法をとる、とのことです。
この 「方法をとる」 が仮定なのか規則なのか不安が残りますが…。
切り分けた側が運用する DNS サーバを ns.some-dom.co.jp [192.168.0.35] であるとしたとき、まずはプロバイダ側は次のような感じで "0.168.192.in-addr.arpa" ゾーンのデータを登録します。
$ORIGIN 0.168.192.in-addr.arpa
@ IN SOA ns.isp.ad.jp. hostmaster......
32/27 IN NS ns.some-dom.co.jp.
33 IN CNAME 33.32/27.0.168.192.in-addr.arpa.
34 IN CNAME 34.32/27.0.168.192.in-addr.arpa.
35 IN CNAME 35.32/27.0.168.192.in-addr.arpa.
:
62 IN CNAME 62.32/27.0.168.192.in-addr.arpa.
ゾーン名が変わった以外は、古い文書と特に変わりは無いようですね。
そして切り分けてもらった側は "32/27.0.168.192.in-addr.arpa" ゾーンのデータを登録します。
$ORIGIN 32/27.0.168.192.in-addr.arpa
@ IN SOA ns.some-dom.co.jp. hostmaster.some-dom.co.jp
IN NS ns.some-dom.co.jp.
33 IN PTR host1.some-dom.co.jp.
34 IN PTR host2.some-dom.co.jp.
35 IN PTR host3.some-dom.co.jp.
こちらも、特に変わった感じはないです。
とりあえずゾーン名は、プレフィックス付きのネットワークアドレス "192.168.0.32/27" を "." で区切って逆に並べたものにお約束の "in-addr.arpa" をつけて、"32/27.0.168.192.in-addr.arpa" とする、というのが JPNIC の推奨ルール… なのでしょうか。
NS レコードを探る
これまで調べた上で、NS レコードを使って委譲先のネームサーバを登録していることには変わりないようなので、もしかしたら NS レコードの一覧を調べれば、そこからゾーン名がわかるのではないでしょうか。
ということでちょっと実験してみることにしました。
確認には Windows XP Professional の "nslookup" コマンドを使用してみます。これを起動したら、次のような感じでまずは "addr.arpa" を管理しているネームサーバを調べてみようとしました。
> set type=soa
> in-addr.arpa.
すると、in-addr.arpa を管理しているのは a.root-servers.net というネームサーバであるようです。今度はここへ接続して、登録されているネームサーバの一覧を表示させて見ます…。
> server a.root-servers.net
> set type=ns
> ls in-addr.arpa.
とやってみると…、なにやら "Query refused" と言われてしまいました。どうやらこうやって調べることはできないようです。
そこで今度は、コマンドラインから次のような感じで手探りでやってみることにしました。なお、調べるゾーンは、IP 都合上プライベートアドレスで書きますけど、実際はグローバル IP です。
nslookup -type=soa 0.168.192.in-addr.arpa
こうしてみると、このゾーンを管理しているネームサーバを "primary name server = " にて知ることができました。
そうしたらとりあえずもう一度、今度はこのサーバを指定して ls でネームサーバ一覧を要求してみることにしました。けれど、やっぱりエラーとなってしまいます。
仕方ないので、手探りで次を探します。
まずは推奨であると思われる "32/27.0.168.192.in-addr.arpa" という NS レコードがあるかどうかのチェックです。
nslookup -type=ns 32/27.0.168.192.in-addr.arpa
このようにコマンドプロンプトから命令してみると、とりあえず、自分が管理しているネームサーバへ譲渡されているような感じが表示されました。
つまり、このゾーンを登録すれば、逆引きも正常に行えそうですね。
逆引き設定を行ってみる
今回は djbdns を使用していますので、それを前提としてお話を進めます。
登録するゾーンは "32/27.0.168.192.in-addr.arpa" で、それ用の PTR レコードをいくつか登録してみます。なお、ネームサーバは ns1.ez-net.jp と ns2.ez-net.jpであるとします。
# SOA レコードなどの登録
.32/27.0.168.192.in-addr.arpa::ns1.ez-net.jp
.32/27.0.168.192.in-addr.arpa::ns2.ez-net.jp
# 逆引きレコードの登録
^33.0/27.0.168.192.in-addr.arpa:host1.ez-net.jp
これで、192.168.0.33 から host1.ez-net.jp というホスト名を逆引きすることができるようになります。
実際にできるようになったかを確認する場合、nslookup を使って次のようにして確認できます。
> set type=ptr
> 192.168.0.33
Windows ならば次のような感じで簡単に調べることもできます。
ping -a 192.168.0.33
こうすると、"Pinging host1.ez-net.jp [192.168.0.33] with 32 bytes of data:" という感じのメッセージが表示され、192.168.0.33 のホスト名を参照することが、つまりは逆引きにより正常に取得できたことがわかります。
逆引き設定時の注意
djbdns の場合、"=" という記号をつかうことで A レコードと PTR レコードの両方を自動的に登録してくれるようになっています。ところがこれは、Class C 未満というか、クラスレスの場合は少々注意が必要です。
というのも、djbdns の場合、"=" をつけても自動的に生成される PTR レコードが適切なものにならないのです。これはもっとも、逆引きゾーンを djbdns が知るはずも無いので当然なのですけど。
なので、明示的に "^" を使って指定しましょう。