【问题标题】:JNDI DNS lookup with partial domain name使用部分域名进行 JNDI DNS 查找
【发布时间】:2011-06-29 21:06:37
【问题描述】:

例如,如果我在我的 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 记录才能找到完整的域名。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: java dns jndi srv


    【解决方案1】:

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

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

    1. 找出server.com的名称服务器。
    2. 使用 TCP 连接到第一个列出的名称服务器的端口 53。
    3. 启动区域传输。
    4. 根据其-t srv 过滤器过滤掉结果。

    您需要通过 JNDI 启动区域传输并过滤掉您要查找的结果。在DnsContext 中调用DNS 区域传输的方法是list()

    NamingEnumeration<NameClassPair> names = ctx.list("server.com");
    

    恕我直言,JNDI 的界面很糟糕。它被设计成非常通用的所有命名和目录服务,接口和 DNS 之间的机械和技术不匹配简直令人沮丧。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2011-05-21
      相关资源
      最近更新 更多