是否存在现有的工具或有趣的方法来查找 DNS 区域文件中所有“解析”到给定 IP 的项目?(根本不使用任何 DNS 服务器)
例如,我们可能有以下组织不太良好的 DNS 配置:
example.org. 60 IN A 10.0.0.1
new.example.org. 60 IN A 10.0.0.10
www.example.org. 60 IN CNAME example.org.
old.example.org. 60 IN CNAME www.example.org.
toaster.example.org. 60 IN CNAME bigbox.example.org.
cutebox.example.org. 60 IN A new.example.org.
bigbox.example.org. 60 IN A 10.0.0.1
该工具对这个问题的回答10.0.0.1
应该是设置example.org, www.example.org, old.example.org, toaster.example.org, bigbox.example.org
更新:明确地说:我们有该域的区域文件
更新:我刚刚编写的以下脚本几乎完全满足了我的要求(期望标准输入上的 DNS 区域文件)(尚不支持 IPv6 :-P):
#! /usr/bin/env python
import re
import sys
cols = (0, 4)
type_col = 3
types = ('A', 'CNAME')
if len(sys.argv) != 2:
sys.exit('query not given (IP or hostname)')
query = sys.argv[1]
rex_not = re.compile(r'^\s*;')
relations = []
found = set([query])
def filter_pairs(l, f):
for itm in l:
if itm[1] in f: yield itm
in_pairs = []
for line in sys.stdin:
if rex_not.match(line): continue
itms = re.split(r'\s+', line.strip())
try:
typ = itms[type_col]
if typ not in types: continue
a, b = (itms[cols[0]], itms[cols[1]])
except IndexError: continue
if a and b: in_pairs.append((a, b))
oldpairs = in_pairs[:]
while True:
pairs = list(filter_pairs(in_pairs, found))
for itm in pairs: found.add(itm[0])
if len(pairs) == len(oldpairs): break
oldpairs = pairs
found = found.difference(set([query]))
for x in found: print(x)
答案1
除非每个条目都有反向 DNS 条目,否则无法完成此操作。当然,有些人会告诉您这可以做到,甚至会向您指出一些声称可以做到这一点的网站,但事实上这是不可能的。