Как я могу перечислить ВСЕ записи DNS?

Можно ли указать список всех записей DNS для домена?

Я знаю о таких вещах, как dig и nslookup, но они только заходят так далеко. Например, если у меня есть запись поддомена A как

test A somedomain.co.uk

если я специально не попрошу об этом, например.

dig any test.somedomain.co.uk

Я не вижу этого.

Есть ли какой-либо способ (кроме просмотра записей, перейдя в диспетчер DNS), чтобы точно узнать, что все записи DNS?

Ответ 1

Когда вы запрашиваете ANY, вы получите список всех записей на уровне, но не ниже.

# try this
dig google.com any

Это приведет к возврату записей A, TXT, NS-записей, записей MX и т.д., если доменное имя точно "google.com". Но он не будет возвращать дочерние записи (например, www.google.com). Точнее, вы МОЖЕТЕ получить эти записи, если они существуют. Серверу имен не нужно возвращать эти записи, если он не хочет этого делать (например, чтобы уменьшить размер ответа).

AXFR - это передача зоны и, скорее всего, то, что вы хотите. Однако они обычно ограничены и недоступны, если вы не контролируете зону. Обычно вы осуществляете передачу зоны непосредственно с авторитетного сервера (@ns1.google.com ниже) и часто с сервера имен, который не может быть опубликован (сервер имени скрытности).

# This will return "Transfer failed"
dig @ns1.google.com google.com axfr

Если у вас есть контроль над зоной, вы можете настроить ее для получения передач, которые защищены ключом TSIG. Это общий секрет, который клиент может отправить на сервер для авторизации передачи.

Ответ 2

В отсутствие возможности делать переносы зоны я написал этот небольшой bash script, dg:

#!/bin/bash
COMMON_SUBDOMAINS=(www mail smtp pop imap blog en ftp ssh login)
if [[ "$2" == "x" ]]; then
    dig +nocmd "$1" +noall +answer "${3:-any}"
    wild_ips="$(dig +short "*.$1" "${3:-any}" | tr '\n' '|')"
    wild_ips="${wild_ips%|}"
    for sub in "${COMMON_SUBDOMAINS[@]}"; do
        dig +nocmd "$sub.$1" +noall +answer "${3:-any}"
    done | grep -vE "${wild_ips}"
    dig +nocmd "*.$1" +noall +answer "${3:-any}"
else
    dig +nocmd "$1" +noall +answer "${2:-any}"
fi

Теперь я использую dg example.com, чтобы получить чистый, чистый список записей DNS или dg example.com x, чтобы включить кучу других популярных поддоменов.

grep -vE "${wild_ips}" отфильтровывает записи, которые могут быть результатом подстановочной DNS-записи, такой как * 10800 IN A 1.38.216.82. В противном случае подстановочная запись будет выглядеть так, как если бы были записи для каждого $COMMON_SUBDOMAN.

Примечание. Это зависит от запросов ANY, которые заблокированы некоторыми поставщиками DNS, такими как CloudFlare.

Ответ 3

То, что вы хотите, называется передачей зоны . Вы можете запросить передачу зоны с помощью dig -t axfr.

A зона - это домен и все нижележащие домены, которые не делегированы другому серверу.

Обратите внимание, что передача зон не всегда поддерживается. Они не используются при обычном поиске, только при репликации данных DNS между серверами; но есть и другие протоколы, которые могут быть использованы для этого (например, rsync over ssh), может возникнуть угроза безопасности при экспонировании имен, а ответы о передаче зоны стоят больше, чтобы генерировать и отправлять, чем обычные поисковые запросы DNS.

Ответ 4

Я улучшил Josh ответ. Я заметил, что dig отображает только те записи, которые уже присутствуют в кэше кеша запросов, поэтому лучше вывести авторитетный сервер имен из SOA (а не полагаться на сервер имен по умолчанию). Я также отключил фильтрацию подстановочных IP-адресов, потому что обычно меня больше интересует правильность настройки.

Новый script принимает аргумент -x для расширенного вывода и аргумент -s NS для выбора конкретного сервера имен: dig -x example.com

#!/bin/bash
set -e; set -u
COMMON_SUBDOMAINS="www mail mx a.mx smtp pop imap blog en ftp ssh login"
EXTENDED=""

while :; do case "$1" in
  --) shift; break ;;
  -x) EXTENDED=y; shift ;;
  -s) NS="$2"; shift 2 ;;
  *) break ;;
esac; done
DOM="$1"; shift
TYPE="${1:-any}"

test "${NS:-}" || NS=$(dig +short  SOA "$DOM" | awk '{print $1}')
test "$NS" && NS="@$NS"

if test "$EXTENDED"; then
  dig +nocmd $NS "$DOM" +noall +answer "$TYPE"
  wild_ips=$(dig +short "$NS" "*.$DOM" "$TYPE" | tr '\n' '|')
  wild_ips="${wild_ips%|}"
  for sub in $COMMON_SUBDOMAINS; do
    dig +nocmd $NS "$sub.$DOM" +noall +answer "$TYPE"
  done | cat  #grep -vE "${wild_ips}"
  dig +nocmd $NS "*.$DOM" +noall +answer "$TYPE"
else
  dig +nocmd $NS "$DOM" +noall +answer "$TYPE"
fi

Ответ 5

  • Передача зоны - единственный способ убедиться, что у вас есть все записи поддоменов. Если DNS правильно настроен, вы обычно не можете выполнять внешнюю передачу зоны.

  • Проект scans.io имеет базу данных записей DNS, которые можно загрузить и найти для поддоменов. Это требует загрузки 87 ГБ данных DNS, в качестве альтернативы вы можете попробовать онлайн-поиск данных в https://hackertarget.com/find-dns-host-records/

Ответ 6

host -a работает хорошо, подобно dig any.

EG:

$ host -a google.com
Trying "google.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10403
;; flags: qr rd ra; QUERY: 1, ANSWER: 18, AUTHORITY: 0, ADDITIONAL: 0


;; QUESTION SECTION:
;google.com.            IN  ANY

;; ANSWER SECTION:
google.com.     1165    IN  TXT "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all"
google.com.     53965   IN  SOA ns1.google.com. dns-admin.google.com. 2014112500 7200 1800 1209600 300
google.com.     231 IN  A   173.194.115.73
google.com.     231 IN  A   173.194.115.78
google.com.     231 IN  A   173.194.115.64
google.com.     231 IN  A   173.194.115.65
google.com.     231 IN  A   173.194.115.66
google.com.     231 IN  A   173.194.115.67
google.com.     231 IN  A   173.194.115.68
google.com.     231 IN  A   173.194.115.69
google.com.     231 IN  A   173.194.115.70
google.com.     231 IN  A   173.194.115.71
google.com.     231 IN  A   173.194.115.72
google.com.     128 IN  AAAA    2607:f8b0:4000:809::1001
google.com.     40766   IN  NS  ns3.google.com.
google.com.     40766   IN  NS  ns4.google.com.
google.com.     40766   IN  NS  ns1.google.com.
google.com.     40766   IN  NS  ns2.google.com.

Ответ 7

Нет простого способа получить все записи DNS для домена в одном экземпляре. Вы можете просматривать только определенные записи, например, если вы хотите увидеть запись A для определенного домена, вы можете использовать команду: dig a (тип записи) domain.com. Это то же самое для всех других типов записей, которые вы хотите увидеть для этого домена.

Если вы не знакомы с интерфейсом командной строки, вы также можете использовать такой сайт, как mxtoolbox.com. Это очень удобный инструмент для получения записей о домене.

Надеюсь, это ответит на ваш вопрос.