查询 DNS 以获取服务器的 CNAME

查询 DNS 以获取服务器的 CNAME

有没有办法查询我们的内部 DNS 条目来发现指向特定服务器的所有 CNAME 条目?

编辑:我们是Windows环境,Server 2003。

答案1

您没有指定您的环境,但如果您使用的是 Unix,我认为 dig 和 grep 的组合应该可以工作。ns.example.com应该是您的名称服务器的主机名,example.com是您的主机所属的域,HOST 是您要查找所有 CNAME 记录的主机。这实际上是 grep 命令中的制表符,而不是字面意思<TAB>(您可能需要调整 grep 字符串)。

此外,您的名称服务器还需要配置为允许区域传输,其细节将取决于实施。

dig @ns.example.com example.com axfr |grep 'CNAME<tab>HOST$'

或者如果你使用 Windows,你可以使用nslookup

C:\> nslookup
> name ns.example.com
> ls -a example.com FILE

example.com这应该会将“知道”的域的所有记录输出ns.example.com到 FILE。然后,您可以使用任何您想要的工具对文本文件进行排序,以查找相应的 CNAME。

或者用这个未经测试(但看上去似乎正确)perl脚本

#!/usr/bin/perl

use Net::DNS;

($target, $zone) = @ARGV;

$res = new Net::DNS::Resolver;
foreach $rr ($res->axfr($zone)) {
     print $rr->name."\n" if (($rr->type eq "CNAME") && ($rr->rdatastr eq $target."."));
}

为了完整性,以下几点:

  • 正如 @womble 所说,CNAME 没有与 PTR 记录等同的记录。您必须使用一些上下文感知,通过对与主机的 A 记录相对应的 CNAME 的所有区域信息进行排序。
  • 这仅适用于您的 DNS 服务器(并且如果您有查看区域信息的权限)。无法“跟踪”属于其他区域的主机的 CNAME。
  • 正如@BillThor 所述,除了 CNAMES 之外,还有其他方法可以为主机名设置别名。同样,您需要具备一定的上下文意识。

答案2

如果您有权访问 DNS 配置,那么发现这些数据就相当简单了。但是,任何人都可以拥有指向您服务器的 CNAME。您将无法跟踪这些。

正如 @wombie 指出的那样,您无法对 CNAMES 进行反向查找。CNAMES 没有 PTR 等效项,即使有,也可能只有一些记录存在。对随机选择的域进行快速检查会发现 PTR 记录通常不会指向 A 记录。同样,对随机地址的 PTR 记录进行反向查找通常找不到相应的 A 记录。

编辑:CNAME 不是为系统设置别名的唯一方法。DNS 允许多个 A 记录指向同一个地址。从功能上讲,这与添加 CNAME 相同,但方法不同。同样的问题也适用于您的域之外。要搜索各种 A 记录,您需要搜索相关系统的 IP 地址。

答案3

DNS 协议不允许您进行这种“反向”查找。您需要使用协议以外的方法,例如使用 kce 提供的 grep 建议。

答案4

  1. 查找您的机器所服务的所有区域。
  2. 对于每个区域,使用dnscmd导出区域数据:
    dnscmd a.ns.example.com /zoneexport zone.example.com 此区域的某个文件名
  3. 在导出的文件中搜索CNAME指向目标域名的资源记录。

相关内容