Υπάρχει κάποιος τρόπος να μπορώ να παραθέσω ΟΛΕΣ τις εγγραφές 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
. Διαφορετικά, μια καταχώρηση μπαλαντέρ θα έκανε να φαίνεται ότι υπάρχουν εγγραφές για κάθε $COMMON_SUBDOMAN
.
Σημείωση: Αυτό βασίζεται σε ερωτήματα ANY
, τα οποία μπλοκάρονται από ορισμένους παρόχους DNS, όπως το CloudFlare.
Αυτό που θέλετε ονομάζεται μεταφορά ζώνης. Μπορείτε να ζητήσετε μια μεταφορά ζώνης χρησιμοποιώντας την εντολή dig -t axfr
.
Μια ζώνη είναι ένας τομέας και όλοι οι τομείς κάτω από αυτόν που δεν έχουν ανατεθεί σε άλλο διακομιστή.
Σημειώστε ότι οι μεταφορές ζωνών δεν υποστηρίζονται πάντα. Δεν χρησιμοποιούνται στην κανονική αναζήτηση, μόνο στην αναπαραγωγή δεδομένων DNS μεταξύ διακομιστών, αλλά υπάρχουν άλλα πρωτόκολλα που μπορούν να χρησιμοποιηθούν για αυτό (όπως το rsync μέσω ssh), μπορεί να υπάρχει κίνδυνος ασφάλειας από την έκθεση ονομάτων και οι απαντήσεις μεταφοράς ζώνης κοστίζουν περισσότερο για τη δημιουργία και την αποστολή τους από τις συνηθισμένες αναζητήσεις DNS.