0

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

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

4

1 回答 1

2

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

这是做什么的host -lt SRV server.com

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

您需要通过 JNDI 启动区域传输并过滤掉您正在寻找的结果。调用 DNS 区域传输的方法DnsContextlist().

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

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

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

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

于 2011-11-01T06:18:40.333 回答