Има ли някакъв начин да изпиша ВСИЧКИ DNS записи за даден домейн?
Знам за такива неща като dig и nslookup, но те стигат само дотам. Например, ако имам A запис на поддомейн като
test A somedomain.co.uk
тогава, ако не го поискам изрично, напр.
dig any test.somedomain.co.uk
не мога да го видя.
Има ли някакъв начин (освен да прегледате записите, като отидете в DNS мениджъра) да видите какви точно са всички DNS записи?
Когато направите заявка за 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. Това е споделена тайна, която клиентът може да изпрати на сървъра, за да оторизира прехвърлянето.
Поради липсата на възможност за прехвърляне на зони написах този малък bash скрипт, 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
. В противен случай записът с wildcard ще изглежда така, сякаш има записи за всеки $COMMON_SUBDOMAN
.
Забележка: Това разчита на заявки ANY
, които са блокирани от някои доставчици на DNS като CloudFlare.
Това, което искате, се нарича прехвърляне на зона. Можете да заявите прехвърляне на зона, като използвате dig -t axfr
.
Една зона е домейн и всички домейни под него, които не са делегирани на друг сървър.
Имайте предвид, че прехвърлянето на зони не се поддържа винаги. Те не се използват при нормално търсене, а само при репликиране на DNS данни между сървъри; но има други протоколи, които могат да се използват за това (например rsync през ssh), може да има риск за сигурността от излагане на имена, а генерирането и изпращането на отговорите за прехвърляне на зони струва повече, отколкото при обичайните DNS търсения.