No.4942 投稿時間:2002年09月03日(Tue) 13:28 投稿者名:お困り君 URL:
お疲れさまです。初めて書き込みます。
BIND9.2.1のソース解析を行っていてどうしても解からない部分があります。
BINDが外部DNSサーバーと通信している個所を知りたいのですが、解かりますか?
(実際はリゾルバが絡むと思うのですが。)
早い話が、外部DNSサーバーからのDNSパケットの中身をBINDプログラムで参照したいのですが。。。
よろしくお願いします。
No.4959 投稿時間:2002年09月04日(Wed) 00:30 投稿者名:鷹の巣 URL:http://sakaguch.com/
> BIND9.2.1のソース解析を行っていてどうしても解からない部分があります。
>
> BINDが外部DNSサーバーと通信している個所を知りたいのですが、解かりますか?
> (実際はリゾルバが絡むと思うのですが。)
1.nslookupコマンド等を実行するクライアントソフトやブラウザやメール(SMTP)サーバーは、
DNSクライアント(Stub Resolver=直訳で切り株解析)と言います。
このDNSクライアントと名前解決を依頼されたDNSサーバー(Full-Service Resolver)間の通信は、
TCP53番のサービスポートが使用されます。
2.名前解決を依頼されたDNSサーバー(Full-Service Resolver)と上位DNSサーバー間の通信は、UDP53番のサービスポートが使用されます。
「BINDが外部DNSサーバーと通信している個所」というのは、項2を指すのでしょうか?
> 早い話が、外部DNSサーバーからのDNSパケットの中身をBINDプログラムで参照したいのですが。。。
何をされたいのか、ちょっと、目的がわかりませんが、BIND8の場合は、res_debug.cというファイル名の中にBINDのデバッグ出力時に
p_queryから呼び出されるfp_query(DNSパケットの内容を書き出すというルーチン)がありました。
# DNSパケットの解析は、C言語で書くより、文字列処理に適しているPerlのNet::DNSモジュールを使用する方が楽では?
DNSパケットの解析が出来ましたら、是非、ご公開願います。私にも教えて下さい。(リンクさせて下さいね。)
No.4961 投稿時間:2002年09月04日(Wed) 10:20 投稿者名:お困り君 URL:
>何をされたいのか、ちょっと、目的がわかりませんが、BIND8の場合は、res_debug.cというファイル名の中にBINDのデバッグ出力時に
>p_queryから呼び出されるfp_query(DNSパケットの内容を書き出すというルーチン)がありました。
>
># DNSパケットの解析は、C言語で書くより、文字列処理に適しているPerlのNet::DNSモジュールを使用する方が楽では?
>
>DNSパケットの解析が出来ましたら、是非、ご公開願います。私にも教えて下さい。(リンクさせて下さいね。)
有難う御座います。大変参考になりました。
ちなみにあまり細かいことは言えないのですが、BIND内で外部DNSサーバーから応答(再帰処理も含めて)を別プログラムに転送し、
そこでDNSパケットを解析して色々と処理を行うシステムを開発しています。
開発はC言語と一応決まっているので、DNSメッセージがテキスト形式に変換できればあとはひたすら文字検索(比較)になるのですが。。。
No.4996 投稿時間:2002年09月04日(Wed) 23:19 投稿者名:鷹の巣 URL:http://sakaguch.com/
> ちなみにあまり細かいことは言えないのですが、BIND内で外部DNSサーバーから応答(再帰処理も含めて)を別プログラムに転送し、
> そこでDNSパケットを解析して色々と処理を行うシステムを開発しています。
普通、自宅サーバーでは、UDPパケットでのDNS問い合わせに対して、最終的なIPアドレスを応答して、再帰はないのですが、
子DNSサーバーが存在することを前提にされている訳ですね。
DNSの仕組みやパケットのフォーマット内容が理解されていないとソースは、読めないと思いますが、パケットの内容は
RFC1035の原文(英語)
http://rfc.netvolante.jp/rfc/rfc1035.txt
RFC日本語版リストのRFC1035
http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
を先ずご一読願います。その上で、名前がres_で始まる各リゾルバルーチンが利用する_res構造体(resolv.hで定義)を理解して下さい。
●主なリゾルバライブラリルーチン
res_serach---gethostbynameから呼び出され、入力:ドメイン名、出力:ドメイン名のIPアドレス、res_queryを何度も使用する。
res_query---res_mkqueryを呼び出して、問い合わせパケットを作成し、res_sendでパケットを送り出す。
●主なネームサーバーライブラリルーチン(応答パケットの解析するルーチンを含む)
ns_init_parse---先ず最初におまじない。handleで指定されるデータ構造体を生成。
ns_msg_count---応答パケットのヘッダ部からレコード数を返す。
ns_parserr---応答レコードの情報を取り出して、rrに格納する。
ns_name_compress---ドメイン名の圧縮
ns_name_uncompress---ドメイン名の伸長
> 開発はC言語と一応決まっているので、DNSメッセージがテキスト形式に変換できればあとはひたすら文字検索(比較)になるのですが。。。
私も全部隅々まで、読んだ訳ではありませんし、綺麗いさっぱり忘れたので、間違っていると思います。
No.4965 投稿時間:2002年09月04日(Wed) 13:45 投稿者名:お困り君 URL:
あと、もし解かれば教えて頂きたいのがもう一つあるのですが。
BINDで外部DNSサーバーへ名前解決依頼を送信し、その結果が返ってきた時、
どのクライアントへ名前解決結果を返信するのかをどのように判断しているのでしょうか?
DNSメッセージヘッダ部のIDで管理しているのでしょうか?
よろしくお願いします。
No.4998 投稿時間:2002年09月04日(Wed) 23:37 投稿者名:鷹の巣 URL:http://sakaguch.com/
> あと、もし解かれば教えて頂きたいのがもう一つあるのですが。
>
> BINDで外部DNSサーバーへ名前解決依頼を送信し、その結果が返ってきた時、
> どのクライアントへ名前解決結果を返信するのかをどのように判断しているのでしょうか?
>
> DNSメッセージヘッダ部のIDで管理しているのでしょうか?
あまり、調べる時間がなかったのですが、こちら
http://x68000.q-e-d.net/~68user/net/
のPerl版の
echo サーバを作ってみよう (3) fork を使ったマルチスレッドサーバ
echo サーバを作ってみよう (4) select を使ったマルチスレッドサーバ
とC言語版の
C 言語で echo サーバを作ってみよう (2) select でタイムアウト機能を実装する
をご一読頂けますか。
ここにマルチスレッドで、クライアントの相手をする方法が記載されています。
多分、プロセスID番号で判断していると考えます。
# C 言語のメーリングリストでは、ネットワークプログラミングは、取り扱っていないでしょうか?
# ご存知の方がございましたら、教えて下さい。