使用部分域名进行JNDI DNS查找

时间:2011-06-29 21:06:38

标签: java dns jndi srv

例如,如果我在DNS配置中定义了以下SRV记录

_dev._tcp          IN      SRV     0       0       8400   dev.server.com.

我可以执行以下命令

host -lt SRV server.com

它为我提供了dns服务器(server.com)中SRV记录的完整列表。如果我想使用JNDI查找做同样的事情

Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
DirContext ctx = new InitialDirContext(env);
Attributes attributes = ctx.getAttributes("server.com", new String [] { "SRV" });
return attributes;

上面的代码没有返回任何属性。如果我将上面代码中的倒数第二行更改为此,

Attributes attributes = ctx.getAttributes("_dev._tcp.server.com", new String [] { "SRV" });

它有效。

但问题是我之前不知道完整的域名,我必须查找SRV记录才能找到完整的域名。

有关如何做到这一点的想法吗?

1 个答案:

答案 0 :(得分:2)

-l /usr/bin/host参数指示DNS区域传输。与传统的DNS查询不同,区域传输通过TCP工作。

以下是host -lt SRV server.com的作用:

  1. 找出server.com
  2. 的名称服务器
  3. 使用TCP连接到第一个列出的名称服务器的端口53。
  4. 启动区域转移。
  5. 根据其-t srv过滤器过滤掉结果。
  6. 您需要通过JNDI启动区域传输,并过滤掉您要查找的结果。在DnsContext中调用DNS区域传输的方法是list()

    NamingEnumeration<NameClassPair> names = ctx.list("server.com");
    
    恕我直言,JNDI有一个糟糕的界面。它被设计成非常通用的所有命名和目录服务,并且接口和DNS之间的机械和技术不匹配简直令人沮丧。

    如果您正在寻找更实用,更易于使用且功能齐全的DNS库,请查看http://www.dnsjava.org上的dnsjava项目

    另请注意,并非每个DNS服务器都允许从不受信任的主机进行区域传输。现在,即使是LAN DNS服务器也不会默认允许区域传输。