前へ << UDP を使ってみよう (5) | DNS クライアントを作ってみよう (2) >> 次へ |
こういう名前解決を行うコマンドは nslookup・host・dig などが有名です。 また、これとは別に OS には resolver (リゾルバまたはレゾルバ) と呼ばれるライブラリが標準で実装されています。 具体的には res_init(3), res_query(3), res_send(3) などです。
これまで本ページで作ってきたプログラムでも gethostbyname(3) や inet_aton を使用して
use Socket; $iaddr = inet_aton("X68000.startshop.co.jp");というふうに名前解決を行っていました。 これらのライブラリ関数も内部で res_init(3), res_query(3), res_send(3) などを呼び出しています。
今回は gethostbyname(3) を使わず、res_*(3) も使わず、 全てを自分で行うプログラムを作ります。 実用に耐えるようなライブラリを作るつもりは全くありませんが、 まーさわりだけでも作ってみれば何か得るもんがあるんちゃうの? ということで。
Note: nslookup is deprecated and may be removed from future releases. Consider using the `dig' or `host' programs instead.つまり nslookup を保守している BIND のチーム自身が 「nslookup は将来はなくなるかもしれんよ。代わりに dig や host を使ってね」 と言っている始末。
そして djb 界隈では nslookupについての注意 だの、 BIND を通じて得た知識は疑ってかかりましょう だの、 BIND の呪縛 だの書かれています。
そして、当ページ管理人の環境では nslookup が全く使えないのも事実。
よって、当ページ管理人の環境では現在 nslookup を使うことはできません。
昔は IANA がプライベートアドレスの逆引きを提供していたというのは、もしかしたら記憶違いかも。 BLACKHOLE.ISI.EDUって何ですか?、 read-rfc1918-for-details.iana.netって何ですか? と勘違いしているかもしれません。
% dig www.jp.FreeBSD.org ; <<>> DiG 8.3 <<>> www.jp.FreeBSD.org ;; res options: init recurs defnam dnsrch ;; got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 2 ;; QUERY SECTION: ;; www.jp.FreeBSD.org, type = A, class = IN ;; ANSWER SECTION: www.jp.FreeBSD.org. 58m41s IN A 203.139.121.132 ;; AUTHORITY SECTION: jp.FreeBSD.org. 58m41s IN NS ns2.spnet.ne.jp. jp.FreeBSD.org. 58m41s IN NS castle.jp.FreeBSD.org. jp.FreeBSD.org. 58m41s IN NS ns.isoternet.org. ;; ADDITIONAL SECTION: castle.jp.FreeBSD.org. 39m40s IN A 210.226.20.15 castle.jp.FreeBSD.org. 58m41s IN AAAA 2001:218:422:1::15 ;; Total query time: 12 msec ;; FROM: localhost to SERVER: default -- 192.168.0.1 ;; WHEN: Sun Mar 23 04:24:17 2003 ;; MSG SIZE sent: 36 rcvd: 173うだうだ長いですが、とりあえず下線を引いた ANSWER SECTION を見てください。 あなたの求めている www.jp.FreeBSD.org の IP アドレスは 203.139.121.132 であることがわかります。
そしてあなたの投げた Query は
www.jp.FreeBSD.org, type = A, class = INとなっています。class=IN というのは Internet ということ、 type=A は「A というタイプを要求した」ということです。 そして、
www.jp.FreeBSD.org. 58m41s IN A 203.139.121.132この「A」は、A レコードを返したということです。
「IN は Internet だ」なんてのは即座に忘れても構いませんが、 正引きというのは「A というタイプを要求するということ」 というのはとても重要です。
本来は、どのタイプを要求するかをコマンドラインで指定します。つまり、
% dig www.jp.FreeBSD.org Aこういうことです。しかし、正引きは頻繁に行われますので、タイプ省略時には タイプ A と仮定するように dig は作られています。
まとめると、203.139.121.132 の逆引きというのは 132.121.139.203.in-addr.arpa のタイプ PTR を要求すること です。つまり、
% dig 132.121.139.203.in-addr.arpa ptrこうなります。と言っても、逆引きのたびに IP アドレスをひっくりかえすのは 面倒ですので、そういう場合は -x オプションを付けると dig が勝手に 203.139.121.132 → 132.121.139.203.in-addr.arpa の変換をしてくれます。
% dig -x 203.139.121.132 ptr (略) ;; QUERY SECTION: ;; 132.121.139.203.in-addr.arpa, type = PTR, class = IN (略) ;; ANSWER SECTION: 132.121.139.203.in-addr.arpa. 11h8m47s IN PTR updraft2.jp.freebsd.org. (略)てっきり www.jp.FreeBSD.org が返ってくるかと思ったら、 意外にも updraft2.jp.FreeBSD.org が返ってきました。 では updraft2 の A レコードを引いてみましょう。
% dig updraft2.jp.FreeBSD.org A (略) ;; QUERY SECTION: ;; updraft2.jp.freebsd.org, type = A, class = IN (略) ;; ANSWER SECTION: updraft2.jp.freebsd.org. 5m9s IN A 203.139.121.132 (略)updraft2 と www には同じ IP アドレス 203.139.121.132 が振られているようです。
% dig www.jp.freebsd.org AAAA (略) ;; QUERY SECTION: ;; www.jp.freebsd.org, type = AAAA, class = IN (略) ;; ANSWER SECTION: www.jp.freebsd.org. 11m37s IN AAAA 3ffe:501:185b:101:2a0:24ff:fe57:e561 (略)タイプ MX はメール受信用サーバを要求するためのものです。 MX は Mail eXchanger の略で、MX レコードを使うとメールアドレスを短く記述したり、 複数のホストに属するユーザのメールを一元管理することができます。
% dig jp.freebsd.org mx (略) ;; QUERY SECTION: ;; jp.freebsd.org, type = MX, class = IN (略) ;; ANSWER SECTION: jp.freebsd.org. 1H IN MX 10 mx.jp.freebsd.org. (略)jp.freebsd.org の MX レコードは mx.jp.freebsd.org であることがわかります。
つまり「ユーザ名@jp.FreeBSD.org」宛にメールを送る場合は、 mx.jp.freebsd.org の SMTP サーバに接続しなければならない、 ということです。
前へ << UDP を使ってみよう (5) | DNS クライアントを作ってみよう (2) >> 次へ |
ご意見・ご指摘は Twitter: @68user までお願いします。