【问题标题】:How to disable recursive query of DNS java?如何禁用DNS java的递归查询?
【发布时间】:2018-11-20 14:33:36
【问题描述】:

我正在使用 dnsjava 进行查询,程序确实查询了 2 次,第一次查询是必要的并返回所需的结果(此结果仅查看我是否捕获 UDP 包,而不是我的程序的结果),然后,它会自动执行第二次查询并为我的程序返回错误 Host Not Found tcpdump_picture

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        final Cache cache = new Cache(DClass.IN);           
        SimpleResolver resolver = new SimpleResolver("10.212.9.108");           
        Name name = new Name("8491698766.6.msisdn.sub.cs");
        Lookup.setDefaultResolver(resolver);
        Lookup.setDefaultCache(new Cache(), DClass.IN);

        Lookup l = new Lookup(name);
        l.setResolver(resolver);

        l.run();
        Record[] records = l.getAnswers();
        System.out.println("Error str: " + l.getErrorString());
    //  System.out.println("Record length: " + records.length);
    //  InetAddress[] array = new InetAddress[records.length];
        if(records != null) {
            for(int i=0; i<records.length; i++) {
                Record record = records[i];
                if(record instanceof ARecord) {
                    ARecord a = (ARecord)record;
                    System.out.println("ARecord: " + a.getAddress().getHostName() + ";" + a.getAddress().getHostAddress());
                }else {
                    CNAMERecord cname = (CNAMERecord)record;
                    System.out.println("CnameRecord: " + cname.toString());
                }
            }
        }else {
            System.out.println("Record null");
        }
    }catch(Exception e) {
        e.printStackTrace();
    }
}

}

【问题讨论】:

  • 我刚刚通过更改 dnsjava 中 Cache 类的源代码解决了这个问题。在 Cache 类中,只需编辑此函数: public SetResponse addMessage(Message in) ,对此进行注释: if ((type == qtype || qtype == Type.ANY)) //&& // name.equals(curname))

标签: dnsjava


【解决方案1】:

您只需要取消设置查询标头中的Recursion desired 标志。

假设您有一个带有bob. 区域和以下条目的 DNS 服务器:

peter.bob.              38400   IN      NS      ns2.bobsen-technology.org.
peter.bob.              38400   IN      NS      ns.klaus.de.

代码

Resolver resolver = new SimpleResolver("localhost");

Record question = Record.newRecord(new Name("peter.bob."), Type.NS, DClass.IN);

Message query = Message.newQuery(question);

query.getHeader().unsetFlag(Flags.RD);

Message response = resolver.send(query);

for (RRset rRset : response.getSectionRRsets(Section.AUTHORITY)) {
    System.out.println(rRset);
}

产生:

{ peter.bob. 38400 IN NS [ns2.bobsen-technology.org.] [ns.klaus.de.] }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多