2009-04-28 10 views
2

constrに2つのネームサーバーを設定してから、res_searchを使用してURIのIPアドレスを検索します。解決済みのネームサーバーを確認する

2つのネームサーバーのどちらが解決を行ったかを簡単に知る方法はありますか?私はres_searchにトレースを設定してstdoutをキャプチャできることを知っていますが、私の状況ではそれは不可能です。ネームサーバーのアドレスは結果のどこかにありますか?

+2

タイトルは私を奇妙に感じます! – dirkgently

+2

私は、OPがそれがポストのタイトルではなく彼の*タイトルであると考えていると思います。価値がある編集、私は思う... –

+0

私は投票に投票しました: "belongs on serverfault.com"。 –

答えて

1

res_search()の呼び出しの結果を調べるだけで、どのネームサーバーが結果を返すかを知る方法はありません。その情報は、上位レベルのUDPパケットヘッダーにのみ存在し、パケットが開封されてからlibresolvになっても使用できなくなります。

res_send_setrhook() 

または

_res.rhook = &funcptr; 

最初のパラメータ:

しかし、libresolvのバージョンに応じて、使用してリゾルバと「応答フック」を登録することでそれを行うことが可能であるように思われますフックコールバックに供給される応答は、応答を送信したサーバのstruct sockaddr *になります。以下のコードは、MacOS Xの10.5.6で動作します:

#include <stdlib.h> 
#include <stdio.h> 
#include <resolv.h> 
#include <netinet/in.h> 

res_sendhookact hook(const struct sockaddr *ns, 
     const u_char *query, 
     int querylen, 
     u_char *ans, 
     int anssiz, 
     int *resplen) 
{ 
    fprintf(stderr, "answer returned from %s\n", 
      inet_ntoa(((struct sockaddr_in *)ns)->sin_addr)); 

    return res_goahead; 
} 

main() { 
    res_init(); 
    _res.rhook = hook; 
    res_search(...); 
} 

ところで、それはそのと呼ばれる考えるものサーバーを依頼する(主に)可能です:

含む TXTレコードを返します
dig @server hostname.bind ch txt 

サーバーのホスト名(機能がDNSサーバーソフトウェアに存在し、無効にされていない限り)。

これは、特定の「DNS Anycast Cloud」のどのサーバが現時点であなたにサービスしているかを識別するのに便利です。

0

最も信頼できる方法は、パケットトレースを行うことです。さまざまな製品を扱うことから、私はプログラマーがその種の情報を記録するためのフックを見つけているのを見たことがありません。

+0

これらのプログラマーは十分に熱心に見ていません;-) – Alnitak

+0

ええ、これはDNS&BINDの第2版から少し馴染んでいます。たぶん、私の答えをマイナスにする時間です。パケットトレースは機能しますが。 :) – benc

関連する問題