0

方法如下——

public static String getHostByAddr(byte[] addr) throws UnknownHostException {

    Name name = ReverseMap.fromAddress(InetAddress.getByAddress(addr));

    final String[] servers = new String[] {"208.67.220.220", "208.67.222.222"};
    final Resolver res = new ExtendedResolver(servers);
    final Lookup lookUp = new Lookup(name, Type.PTR);
    lookUp.setResolver(res);
    Record[] records = lookUp.run();
    if (records == null) {
        throw new UnknownHostException();
    }
    return ((PTRRecord) records[0]).getTarget().toString();
}

这是对上述方法的调用-

    final InetAddress ip = InetAddress.getByName("198.154.218.168");
    final byte[] bytes = ip.getAddress();
    final String host = getHostByAddr(bytes);
    System.out.println("Host - " + host);

在大多数情况下都可以正常工作,但是当 IP 映射到多个域时会失败 (???)

这是示例-

  1. 这里获取securonix.com的 IP ,它是 198.154.218.168
  2. 如果我将此 IP 传递给上述方法,则会出现错误
  3. 但如果我在这里尝试相同的 IP ,它会列出 4 个域

是否可以使用DNSJava做到这一点?

4

2 回答 2

4

一般来说,你不能。正如域 securonix.com 的所有者在其 DNS 服务器上创建了一个将 securonix.com 转换为 198.154.218.168 的条目一样,IP 地址 198.154.218.168 的所有者维护“反向”DNS 记录(通常在单独的服务器上)将 IP 地址映射到默认 DNS 名称。有关反向 DNS 查找的更多信息,请参阅维基百科上的“反向 DNS 查找”页面,并注意反向 DNS 查找(从 IP 地址到名称)通常由与域名所有者不同的所有者维护,并且它是不仅仅是通过交换名称和 IP 地址“自动”创建的。

此外,您提到的站点似乎没有该 IP 地址的反向 DNS 条目,因此您永远不会从标准 DNS 查询中得到 198.154.218.168 的答案;198.154.218.168 根本没有(反向)DNS 条目,上面的代码失败。

作为正向和反向 DNS 查找之间差异的示例,当我第一次获得静态 IP 地址时,我的提供商 (Comcast) 将 IP 地址映射到某个通用名称,例如 75-148-###-###- Houston.hfc.comcastbusiness.net(随机 IP 地址示例),我曾要求他们修改反向 DNS 条目以映射到我的域名,以便 IP 地址和域名的正向和反向查找匹配。他们在他们的DNS 服务器上维护 IP 地址的查找,而我在的 DNS 服务器上维护域名的查找。

yougetsignal.com 上的页面肯定一直在对名称进行 DNS(前向)查找,并将它们存储在可供购买的巨大数据库中,这使得网页可以找到具有相同 IP 的所有名称。但是,没有简单的方法可以通过查询 DNS 服务器对任意 IP 地址执行此操作,除非您有大量额外信息或已经完成了数百万次类似该站点的查找。

于 2013-04-10T07:51:28.877 回答
0

我发现有两个网站提供此功能。但是我不知道他们如何实现该功能。

更新:domaintools 提供 api 调用。也许您可以调用 domaintools api 来获取单个 IP 的多个域名。

于 2013-12-27T16:28:38.610 回答