Σε αυτό το κείμενο περιγράφονται οι βασικές αρχές λειτουργίας του DNS (Domain Name System), καθώς και η βασική παραμετροποίηση του δημοφιλέστερου DNS server, του BIND.
Εισαγωγή Το Internet είναι βασισμένο στο IP πρωτόκολλο, το οποίο διασφαλίζει την επικοινωνία μέσω της μοναδικότητας των μονάδων του (hosts). Κάθε host χαρακτηρίζεται από μία διεύθυνση αποτελούμενη από τέσσερις ομάδες ψηφίων (octets), κάθε μία από τις οποίες φέρει μέγιστη τιμή 2^8 (255). Κάθε μονάδα για να προσπελάσει και να προσπελαστεί από μία άλλη και να διατελέσει τις δραστηριότητες που καθορίζονται από τα υψηλότερου επιπέδου πρωτόκολλα, χρησιμοποιεί ως αναγνωριστικό την IP address. Πρακτικά, αυτό σημαίνει για παράδειγμα ότι όταν εμείς θέλουμε να αντλήσουμε δεδομένα από το αγαπημένο μας website, ο υπολογιστής (ή ο router) μας, όντας μία μονάδα του internet, επικοινωνεί με τον server εντοπίζοντας τον από την IP address του και στέλνοντας ως αναγνωριστικό τη δική του.
Ωστόσο εάν οι αριθμητικές διευθύνσεις είναι ό,τι καλύτερο χρειάζεται ο υπολογιστής, δεν είναι ότι καλύτερο και για τους ανθρώπους. Για λόγους απομνημόνευσης, κομψότητας και ευκαμψίας (στη διαχείριση) χρειαζόταν ένα naming address scheme που θα περιελάμβανε αλφαβητικούς χαρακτήρες και θα επέτρεπε την αποκεντρωτική διαχείριση. Αυτό μπορούσε να γίνει ευκολότερα, ευφυέστερα και χωρίς αλλαγή στο IP, λειτουργώντας ως μία υπηρεσία υψηλότερου επιπέδου, πάνω από το IP, και έτσι έγινε. Έτσι το 1983 δημιουργήθηκε το DNS από τον Paul Mockapetris, καθώς και η πρώτη υλοποίηση server με το όνομα "Jeeves", που έτρεχε σε TOPS-20 λειτουργικό. Το DNS λοιπόν είναι ένα σύστημα που αναλαμβάνει την αντιστοίχηση IP διεύθυνσης και hostname (η hostname με hostname), προβλέποντας και τις απαιτήσεις για κάτι τέτοιο σε δίκτυα μεγάλου βεληνεκούς στα οποία τα domains και οι διευθύνσεις είναι πολυπληθή και μεταβάλλονται συχνά και οι πόροι μπορούν να φανούν ανεπαρκείς.
Τεχνικά Το DNS είναι στην ουσία μία διανεμόμενη και αρθρωτή βάση δεδομένων. Αρθρωτή γιατί φιλοξενείται σε πολλούς και διασπαρμένους nodes (ή μονάδες αναφοράς), κανένας από τους οποίους δεν περιέχει ολόκληρη τη βάση, και διανεμόμενη γιατί οι πληροφορίες της μοιράζονται και αντιγράφονται αυτοματοποιημένα από τον ένα node στον άλλον. Η δομή του DNS είναι ιεραρχική και δενδρική, που σημαίνει ότι τα πάντα ξεκινάνε από ένα σημείο, τη ρίζα (το οποίο εκφράζουμε με μία τελεία ".") και κάτω από αυτό εκτείνεται ένα "δένδρο" από καταχωρήσεις κάθε μία από τις οποίες υπάγεται σε κάποια άλλη. Κάθε καταχώρηση ονομάζεται περιλαμβάνοντας όλες τις μητρικές καταχωρήσεις (καταχωρήσεις υψηλότερου επιπέδου) στα δεξιά του ονόματός της (γνωστού και ως hostname), χωρισμένες μεταξύ τους από μία τελεία, που είναι στην ουσία σημείο διακλάδωσης (branching point). Δηλαδή το domain www.microsoftsucks.com, παραπέμπει στην καταχώρηση "www" της καταχώρησης "microsoftsucks", που με τη σειρά του είναι καταχώρηση της "com", που τέλος με τη σειρά της είναι καταχώρηση του ".", της ρίζας. Όπως είναι προφανές, η ρίζα είναι το μοναδικό σημείο το οποίο αν κατέρρεε θα προκαλούσε και την ολική κατάρρευση όλων των διακλαδώσεων. Τη ρίζα του Internet DNS τη διαχειρίζεται η Internic. Η ρίζα, ως σημείο αρχής των πάντων πρέπει να ορίζεται πάντα, όποτε θέλουμε να εκφράσουμε τη πλήρη διαδρομή μίας καταχώρησης, απλά για λόγους ευχρηστίας και επειδή για την περίπτωση των clients πάντα θέλουμε, έχει επικρατήσει οι *resolvers μας να δέχονται από τους clients domains για αντιστοίχηση χωρίς την ρίζα στο τέλος, και να τα ερμηνεύουν ως πλήρους διαδρομής καταχωρήσεις με αρχή τη ρίζα. Εμείς επειδή θα ασχοληθούμε με τον server, θα την ορίζουμε πάντα.
*
resolver είναι η εφαρμογή που αναλαμβάνει να επικοινωνήσει με έναν DNS server (να στείλει ένα query), συνήθως για λογαριασμό κάποιας άλλης εφαρμογής και να της παραδώσει την απάντηση. Κάθε λειτουργικό σύστημα με TCP/IP υποστήριξη τυπικά ενσωματώνει ένα resolver στο API του.
Συνεχίζοντας, ξαναγυρίζουμε στο παράδειγμα του δένδρου. Όπως κάθε κλαρί ενός δένδρου περιλαμβάνει φύλα αλλά και άλλα κλαριά, έτσι ένα domain μπορεί να υπάρχει απλά ως καταχώρηση σε κάποιο άλλο domain, ή μπορεί να αποτελεί παράλληλα γονέα και για άλλα domains. Στο DNS, στην πρώτη περίπτωση το ονομάζουμε RR (Resource Record) και στη δεύτερη Zone. Θα εξετάσουμε παρακάτω πως ορίζουμε κάθε ένα στο configuration του BIND, καθώς και ορισμένες επιμέρους κατηγοριοποιήσεις. Για την ώρα προχωράμε με κάποιες ακόμα ιδιότητες της λειτουργίας του DNS.
Για τη λειτουργία του DNS σε εκτενή δίκτυα όπως το Internet, χρειάζεται το σύστημα να δουλεύει αποκεντρωτικά (διαμοιρασμένος φόρτος εργασίας, μεγαλύτερη αξιοπιστία), αλλά να παραμείνει και έγκυρο. Αυτό κατορθώνεται με τον ορισμό των DNS Servers ως "Slave" (ή Secondary) και "Master" (ή Primary).
Master/Primary Servers Ένας Master DNS server είναι αρμόδιος (authorative) τουλάχιστον μίας ζώνης, δηλαδή περιλαμβάνει τις ακριβείς πληροφορίες (όλα τα resource records) αυτής της ζώνης. Είναι ακόμα ο server που θα αναλαμβάνει την ανάθεση αρμοδιότητας (delegation of authority) για τα domains ενός βαθμού υψηλότερα από την ζώνη που ελέγχει, σε άλλους Master DNS servers. Πρακτικό παράδειγμα, έστω ότι έχουμε το domain "rootforge.com". Είναι ένα domain δευτέρου επιπέδου, για το οποίο έχει ανατεθεί αρμοδιότητα στο DNS της επιλογής μας, από έναν rootserver (κεντρικό server) που έχει την αρμοδιότητα για το TLD (Top Level Domain) "com". Ο server της επιλογής μας θα πρέπει να έχει μία ζώνη η οποία να περιέχει ακριβώς τις αντιστοιχίσεις (mappings) του "rootforge.com" και των subdomains αμέσως υψηλότερου βαθμού ("κάτι.rootforge.com) με τις IP διευθύνσεις ή με τα domains (ανάλογα το είδος του Resource Record). Για την περίπτωση που θέλαμε να έχουμε domains ακόμα υψηλότερου βαθμού (π.χ. "κάτι.nske.rootforge.com"), θα έπρεπε να κάνουμε 2 πράγματα:
Να περιλάβουμε στη ζώνη του rootforge.com ένα "NS" Resource Record για το nske.rootforge.com subdomain που να έχει τιμή το domain του DNS server ο οποίος θα είναι authorative (αρμόδιος) για το domain "nske.rootforge.com", κάνοντας έτσι ανάθεση αρμοδιότητας (authority delegation) σε αυτόν τον dns server.
Να φτιάξουμε μία ζώνη στον server που δηλώσαμε ως authorative για το nske.rootforge.com η οποία θα περιέχει όλα τα Resource Records για αυτό το domain.
Slave/Secondary Servers Ένας Slave DNS server, είναι ένας server ο οποίος έχει ρυθμιστεί να συνδέεται σε τακτά διαστήματα σε έναν ή περισσότερους master servers και να μεταφέρει τοπικά τις πληροφορίες για τις ζώνες τους. Έτσι είναι και αυτός ένας authorative server, όμως η εγκυρότητα των πληροφοριών του εξαρτάται από το πόσο πρόσφατα τις έχει αντλήσει από τον authorative Master server. Οι Slave DNS servers υπάρχουν κατά κύριο λόγο για λόγους αξιοπιστίας, εάν δηλαδή καταρρεύσει ο Master να συνεχίσουν να εξυπηρετούνται οι αιτήσεις, αλλά και για να μοιράζεται το traffic. Για να λειτουργήσει έτσι, χρειάζεται στη ζώνη που πρόκειται να εξυπηρετηθεί, να περιλαμβάνεται και ο Slave, σε ένα NS RR. Η διαδικασία ενημέρωσης των ζωνών λέγεται Zone Transfer (μεταφορά ζώνης) και η συχνότητά της εξαρτάται από το configuration του Master Server.
Caching-Only Servers, recursive & iterative queries Ένας server που λειτουργεί ως caching-only, είναι ένας server ο οποίος δεν έχει αρμοδιότητα για καμία ζώνη, αλλά αναλαμβάνει να επικοινωνήσει με τους authorative servers μίας ζώνης για την οποία ρωτήθηκε και να επιστρέψει την απάντηση. Παράλληλα την αποθηκεύει σε μία cache, στη μνήμη συνήθως (temporary cache), ώστε να την έχει έτοιμη τοπικά σε περίπτωση που του ξαναζητηθεί. Caching-only DNS servers είναι κατά κανόνα οι servers των ISPs που χρησιμοποιούνται από τους χρήστες τους για σερφάρισμα. Υπάρχουν 2 επίπεδα λειτουργίας: Εξυπηρέτηση Recursive και Iterative queries. Συνήθως, αν ένας DNS server δέχεται Recursive queries, τότε θα ακολουθήσει τα εξής τρία βήματα για να εξυπηρετήσει το query:
Θα ελέγξει την Cache του μήπως υπάρχει εκεί η απάντηση, αν όχι: Θα στείλει ένα iterative query στον τοπικό resolver (ο οποίος χρησιμοποιεί τους DNS servers που αναφέρονται στο configuration του, πχ για τα περισσότερα Unices /etc/resolv.conf) και αν δεν πάρει απάντηση για την διεύθυνση του authorative server της ζητούμενης ζώνης ή κάποιου μητρικού του:
Θα καταφύγει στη λιγότερο επιθυμητή λύση (λιγότερο επιθυμητή γιατί συνεπάγεται τα περισσότερα queries, δηλαδή σε όλους τους parent authorative servers μέχρι και τον ζητούμενο), να ρωτήσει τους ίδιους τους rootservers, οι οποίοι θα τον παραπέμψουν στον authorative του μητρικού domain κ.ο.κ μέχρι να φτάσει σε κάποιο authorative του ζητούμενου domain. Αν αποτύχει να φτάσει εκεί, τότε θα επιστρέψει error.
Η τυπική διαδικασία για το dns resolution του rootforge.org. Η διαδοχή των σχημάτων αντιπροσωπεύει την σειρά των ενεργειών με τη φορά του ρολογιού, μέχρι να υπάρξει positive answer. Οι κόκκινες γραμμές αντιπροσωπεύουν το ερώτημα (query), οι μπλε προσδιοριστικές απαντήσεις που προσδιορίζουν τους authorative servers ή μητρικούς τους (οι οποίοι θα ερωτηθούν στη συνέχεια, σύμφωνα με τη διαδικασία του recursion) και οι πράσινες την ίδια την απάντηση στο ερώτημα. Ο ORG. TLD server σε ότι αφορά την κατανόηση του σχήματος, είναι απλά ένας μητρικός του domain μας server και μπορούμε να εννοήσουμε όσους τέτοιους θέλουμε (ανάλογα το επίπεδο του domain).
Ένας server που εξυπηρετεί μόνο non-recursive queries, τότε αν αποτύχει το πρώτο βήμα, θα στείλει με τη σειρά του ένα non-recursive query στον τοπικό resolver, ή στους rootservers και θα δώσει αυτή την προσεγγιστική απάντηση στον client (hint) ο οποίος θα αναλάβει ο ίδιος το recursion, δηλαδή να κάνει query έναν-έναν τους servers μέχρι να φτάσει στο επιθυμητό αποτέλεσμα. Αυτή η διαδικασία ονομάζεται και "walking the tree". Σε κάθε περίπτωση, το query και η απάντηση αποθηκεύονται στην cache για το χρονικό διάστημα που έχει ορίσει ο εκάστοτε Master server (TTL). Αυτό συμβαίνει ακόμα και αν η απάντηση είναι ένα error που δηλώνει την αποτυχία του server, οπότε ονομάζεται negative caching, μόνο που τότε το χρονικό διάστημα αποθήκευσης τις περισσότερες φορές καθορίζεται από τον ίδιο τον caching server.
Forwarding Servers Ένας DNS server μπορεί να ρυθμιστεί να λειτουργεί προωθώντας τα queries σε άλλους servers, ως recursive queries, και απλά να παραλάβει την απάντηση και να την παραδώσει στον client. Και σε αυτή την περίπτωση βέβαια, ελέγχει συνήθως πρώτα την cache του αν υπάρχει ακριβής απάντηση και αντίστοιχα καταγράφει την απάντηση όταν του παραδοθεί. Ουσιαστικά ένας forwarding dns είναι ρυθμισμένος αν δεν έχει στην cache του την απάντηση να "αγγαρέψει" τους servers που του έχουμε ορίσει για απάντηση με τον ίδιο τρόπο που ο client "αγγάρεψε" αυτόν . Φυσικά ο server που θα αγγαρευτεί θα πρέπει είτε να είναι ρυθμισμένος να εξυπηρετεί recursive queries, είτε να είναι και ο ίδιος forwarding server. Οι DNS forwarding servers χρησιμοποιούνται σε αρκετά εξειδικευμένες περιπτώσεις, όπου λειτουργούν πίσω από περιοριστικά firewalls ή τίθεται θέμα ανεπάρκειας των διαθέσιμων πόρων.
*Μερικές σημειώσεις: Όταν αναφερόμαστε σε "dns server" δεν εννοούμε αναγκαστικά ένα και μόνο μηχάνημα με ένα DNS service σηκωμένο, αλλά οποιοδήποτε αριθμό DNS servers το οποίο σε ότι μας ενδιαφέρει λειτουργεί ως μία DNS μονάδα. Θα μπορούσε (και έτσι είναι συνήθως σε μεγάλα κέντρα του δικτύου) να είναι ένας αριθμός μηχανημάτων σε ένα εσωτερικό δίκτυο πίσω από έναν router, τα οποία να μοιράζονται το traffic μεταξύ τους, πχ με "round robin" τεχνική (*Round Robin: οι servers σα να περιστρέφονται, αν υποθέσουμε ότι το μηχάνημα που αντιστοιχεί στον αριθμό "1" αναλαμβάνει πάντα να εξυπηρετήσει την τρέχουσα αίτηση, με την λήψη της αίτησης το κάθε μηχάνημα παίρνει x+1 δείκτη, όπου x ο τρέχον δείκτης, εκτός από το τελευταίο το οποίο παίρνει 1. Έτσι κατανέμονται όσο το δυνατόν περισσότερο ισοδύναμα οι πόροι.
Ένας DNS server δεν λειτουργεί κατ' ανάγκη ως ένα είδος DNS server (Primary, Slave, Recursive Caching, Iterative Caching, Forwarding, Stealth) αλλά μπορεί να λειτουργεί με οποιοδήποτε συνδυασμό των παραπάνω, ανάλογα την περίπτωση και το configuration του.
Reverse Mapping Μία σημαντική DNS λειτουργία του Internet είναι το Reverse Mapping. Το reverse mapping έχει οριστεί να αναλαμβάνει την αντιστοίχηση IP διευθύνσεων σε canonical names (hostnames). Για να γίνει αυτό, χρειάστηκε να φτιαχτεί ένα TLD το οποίο ονομάστηκε "arpa." (το οποίο δε διαφέρει σε τίποτα από ένα TLD όπως το com. ή το org.). Μέσα του υπάρχουν άλλα υπο-domains, εμάς μας ενδιαφέρει το "IN-ADDR" γιατί αυτό αφορά στην κλάση του Internet. Στη συνέχεια, μέσα στο domain "in-addr.arpa.", υπάρχουν άλλα 255 domains, ένα για κάθε αρχικό IP address octet, με το όνομα του (π.χ. 69.in-addr.net). Εκεί μέσα υπάρχουν άλλα 255 domains κ.ο.κ, μέχρι να συμπληρωθούν και τα τέσσερα IP address octets. Το ότι παραθέτονται αντεστραμένα οφείλεται στο ότι ενώ στο format των IP διευθύνσεων το γενικό μέρος (δίκτυο) δηλώνεται στα αριστερά και στο τέλος μένει ο host, στo format του DNS το γενικό (domain) μπαίνει στα δεξιά και αριστερά του το ειδικό (host).
Έχουμε λοιπόν ένα standard name space "IN-ADDR.ARPA.", το οποίο περιλαμβάνει καταχωρήσεις για όλες τις IP διευθύνσεις. Το dns έχει προβλέψει την ύπαρξη ενός τύπου query ειδικά για reverse mapping resolution, ώστε το "IN-ADDR.ARPA." namespace να υπάρχει μόνο λειτουργικά και η διαδικασία να γίνεται απλά και διάφανα από τις εφαρμογές και τον χρήστη.
Τις IN-ADDR.ARPA καταχωρήσεις μπορούμε να τις κάνουμε map όπου θέλουμε, κανονικά όπως προβλέπεται από το RFC, θα πρέπει να αντιστοιχήσουμε την κάθε IP για την οποία ήμαστε υπεύθυνοι (μέσω PTR records) σε ένα πραγματικό hostname (που να είναι και το ίδιο mapped μέσω Address record με την IP του host). Αυτό κατά κανόνα είναι που κάνουν οι υπεύθυνοι ISPs οι οποίοι διαθέτουν ολόκληρα IP ranges (ούτως ή άλλως συμβατικά μπορεί να οριστεί αρμόδιος server για ένα IN-ADDR.ARPA. domain μόνο με ακρίβεια octet, δηλαδή στην καλύτερη μίας κλάσης C IP διευθύνσεων). Ωστόσο υπάρχει ένα κάπως πολύπλοκο hack ως λύση, το οποίο επιτρέπει το αποτελεσματικό authority delegation σε άλλον server οποιουδήποτε range. Το hack αυτό περιγράφεται στο RFC2317 και χρησιμοποιείται από τους περισσότερους ISPs πλέον. Ο καθένας που διαθέτει στατική IP μπορεί να ζητήσει από τον ISP του το authority delegation για το reverse mapping της IP του σε δικό του server, ώστε να την αντιστοιχήσει σε ό,τι θέλει, ή την αλλαγή του record στον server του ISP. Σε ελάχιστες περιπτώσεις μόνο θα υπάρξει άρνηση, κυρίως σε περιπτώσεις που χρησιμοποιούν το reverse DNS mapping ως αναγνωριστικό για δικές τους υπηρεσίες όπως στατιστικά traffic, access control κλπ. όπου θα ήταν μπελάς.
Στο internet μπορείτε να συναντήσετε πολλούς hosts οι οποίοι δε διαθέτουν reverse DNS record, και άλλους που δε διαθέτουν πραγματικό, αλλά ένα ανύπαρκτο domain. Στην πρώτη περίπτωση, ο host θα αντιμετωπίζει προβλήματα και καθυστερήσεις όταν λειτουργεί ως server για κάποια services (κυρίως mailservers) και τα emails που αποστέλλονται από αυτόν μπλοκάρονται από πολλούς ISPs με αυστηρό antispam policy.
BIND DNS Implementation Ο BIND (Berkeley Internet Name Domain) είναι ιστορικά η δεύτερη υλοποίηση DNS server και η ευρύτερα διαδεδομένη μέχρι σήμερα. Γράφτηκε το 1985 από τον Kevin Dunlap για το BSD Unix και αποτελεί την πιο σωστή προσέγγιση στα DNS specifications. Πλέον συντηρείται από το Internet Systems Consortium με ελεύθερη άδεια χρήσης και η ανάπτυξή του προχωράει σύμφωνα με την αιχμή της τεχνογνωσίας σχετικά με το DNS.
Αυτοί είναι οι βασικότεροι τύποι Resource Records, υπάρχουν και άλλοι αλλά η χρήση τους είναι πιο περιορισμένη και εξειδικευμένη. Τα σημαντικότερα από αυτά είναι :
ΑAA – Address RR, παρόμοια με τα A Records μόνο που χρησιμοποιούνται για IPv6 διευθύνσεις.
CNAME – Canonical Names, δημιουργεί συντόμευση για ένα domain name σε ένα άλλο.
DNAME – Domain Name Aliases, δημιουργεί συντόμευση για ένα ολόκληρο domain σε ένα άλλο.
PTR – Domain Name Pointers, παρέχει τη δυνατότητα αντιστοίχησης domain names με άλλα domain names. Κατά κύριο λόγο χρησιμοποιείται για το Reverse DNS mapping των IP addresses σε canonical names, μέσω της in-addr.arpa διαμόρφωσης.
Πηγή : http://www.freestuff.gr/forums/viewtopic.php?t=30224