有没有办法查询我们的内部 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
- 查找您的机器所服务的所有区域。
- 对于每个区域,使用
dnscmd
导出区域数据:dnscmd a.ns.example.com /zoneexport zone.example.com 此区域的某个文件名
- 在导出的文件中搜索
CNAME
指向目标域名的资源记录。