DNS 区域文本文件中的“反向查找”

DNS 区域文本文件中的“反向查找”

是否存在现有的工具或有趣的方法来查找 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 条目,否则无法完成此操作。当然,有些人会告诉您这可以做到,甚至会向您指出一些声称可以做到这一点的网站,但事实上这是不可能的。

相关内容