В настоящее время я пытаюсь написать сценарий, который проверяет, доступна ли данная запись, прикрепленная к имени, через все серверы имен, которые отвечают за это имя.
Например. Я хочу проверить, есть ли A
запись для foo.example.com
доступен на всех NS
записи для example.com
домен (a.iana-servers.net
и b.iana-servers.net
)
Скрипт работает, сначала запрашивая NS
записи для данного имени (или его родителей, если это не удается; например, поскольку foo.example.com.
не имеет NS
запись, мы пробуем example.com.
далее и наконец .com.
), а затем проверяя A
запись со всеми серверами имен.
name=foo.example.com
# get the nameservers for ${name}
sname=${name}
until [ -z "x${sname}" ]; do
dns=$(dig +short NS "${sname}")
if [ "x${dns}" != "x" ]; then
break
fi
sname=${sname#*.}
done
# now that we have a list of nameservers in $dns, we query them
for ns in $dns; do
dig +short A "${name}" @$"{ns}"
done
Такие работы, если только то название на самом деле CNAME
. В этом случае dig NS
вернет CNAME
запись (а не NS
запись или нет запись)
$ dig +noall +answer NS foo.example.com
foo.example.com. 300 IN CNAME bar.example.com.
$ dig +short NS foo.example.com
bar.example.com.
$ dig A foo.example.com @bar.example.com
;; global options: +cmd
;; connection timed out; no servers could be reached
$
Вместо этого я хотел бы иметь что-то вроде:
$ dig +short NS foo.example.com
$ dig +short NS example.com
a.iana-servers.net.
b.iana-servers.net.
$ dig +short A foo.example.com @a.iana-servers.net.
93.184.216.34
$
Итак, мой вопрос: как я могу заставить dig
к только вернуть NS
записей, а не какой-либо другой записи, указывающей на хост, который не является сервером имен?
Одно очевидное решение - проанализировать вывод dig +noall +answer
чтобы увидеть, действительно ли он содержит NS
запись, но это кажется довольно неуклюжим и подверженным ошибкам ...
Если вы чувствуете себя комфортно с Perl, вы можете сэкономить кучу довольно привередливой работы, написав свой тест как плагин для Zonemaster. В его структуре уже есть (правильный) код, чтобы найти правильный набор серверов имен и отправить запрос всем из них.