2012年8月8日 星期三

在 Java 上使用 dnsjava 查詢 DNS

參考資料:
1、dnsjava

雖然原本想直接用 JNDI 來實作 DNS 的部份,但受限到有些東西實在不知道該如何下手
所以目前還是先用 dnsjava 來實作~。

這裡的第一個例子先從如何用一個網域名稱查詢該域名的 IP 開始:
package tw.org.iii.cosa.dns;

import org.xbill.DNS.*;

public class DnsMain {
  public static void main(String[] args) {
    try {
      System.out.println("Start querying DNS.");
      Lookup lookUpAgent = new Lookup("yahoo.com", Type.ANY);

      // Print the DNS server used by dnsjava
      String[] resolvers = ResolverConfig.getCurrentConfig().servers();
      for(int i=0 ; i<resolvers.length ; i++) {
        System.out.println("Resolver's default: " + resolvers[i]);
      }
      
      // Send DNS query
      lookUpAgent.run();
      Record [] records = lookUpAgent.getAnswers();
      for(int i=0 ; i<records.length ; i++) {
        System.out.println("Records: " + records[i]);
      }
      System.out.println("Searching complete.");
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

第 9 行先宣告一個 Lookup 的物件,Lookup 物件是 dnsjava 中用來送 DNS query 的類別
在初始化時同時也指定了查詢的內容,這裡是要查 yahoo.com,查詢所有的 DNS 記錄(包含 A、MX 等)
然後因為 Lookup 預設會取系統設定的 DNS Server 來作為發送的對象
所以在第 11~15 行先印一下它使用的 DNS Server。
第 18 行執行發送 DNS query,,並且在 19 行透過 getAnswers() 取得 DNS Server 的回應。
(實際上 run() 本身就會回應 String[] 來表示 DNS 查詢的回應,不過我習慣這樣寫 XD)
印出來的結果如下:
Start searching DNS.
Resolver's default: 8.8.8.8
Records: yahoo.com.  1677 IN MX 1 mta6.am0.yahoodns.net.
Records: yahoo.com.  1677 IN MX 1 mta7.am0.yahoodns.net.
Records: yahoo.com.  1677 IN MX 1 mta5.am0.yahoodns.net.
Records: yahoo.com.  506 IN A 209.191.122.70
Records: yahoo.com.  506 IN A 72.30.38.140
Records: yahoo.com.  506 IN A 98.139.183.24
Records: yahoo.com.  172495 IN NS ns6.yahoo.com.
Records: yahoo.com.  172495 IN NS ns1.yahoo.com.
Records: yahoo.com.  172495 IN NS ns8.yahoo.com.
Records: yahoo.com.  172495 IN NS ns5.yahoo.com.
Records: yahoo.com.  172495 IN NS ns3.yahoo.com.
Records: yahoo.com.  172495 IN NS ns4.yahoo.com.
Records: yahoo.com.  172495 IN NS ns2.yahoo.com.
Searching complete.

另外如果 DNS Server 不想用系統上預設的 DNS Server
可以透過指定 Resolver 的方式來強制指定 Lookup 要發送的對象
例如:
Lookup lookUpAgent = new Lookup("cosa.iii.org.tw", Type.ANY);
// Initial a DNS resolver
Resolver resolv = new SimpleResolver("8.8.8.8");
lookUpAgent.setResolver(resolv);
如此在 Lookup.run() 執行時,dnsjava 就會去指定的 DNS server 問資料了。

沒有留言: