Есть ли существующий инструмент или классный или интересный способ найти все элементы в файле зоны 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)
Это невозможно сделать, если для каждого из них нет обратной записи DNS. Конечно, некоторые люди скажут вам, что это возможно, и даже укажут вам на множество веб-сайтов, которые утверждают, что это делают, но факт в том, что это просто невозможно.