Γιατί η ρίζα ενός τομέα δεν μπορεί να είναι CNAME - και άλλες πληροφορίες για το DNS

Αυτή η θέση θα χρησιμοποιήσει το εν λόγω ζήτημα για να εξερευνήσετε DNS, dig, Aτα αρχεία, CNAMEτα αρχεία και ALIAS/ANAMEτα αρχεία από την πλευρά αρχαρίων. Ας ξεκινήσουμε λοιπόν.

Πρώτον, ορισμένοι ορισμοί

  • Σύστημα ονομάτων τομέα (DNS): το συνολικό σύστημα μετατροπής ενός ανθρώπινου αξιομνημόνευτου ονόματος τομέα (example.com) σε μια διεύθυνση IP (93.184.216.34). Η διεύθυνση IP είναι διακομιστή, συνήθως διακομιστής ιστού, όπου αποθηκεύονται τα αρχεία που απαιτούνται για την εμφάνιση μιας ιστοσελίδας.
  • Διακομιστής DNS (επίσης γνωστός ως διακομιστής ονομάτων ή διακομιστής ονομάτων): Χρησιμοποιεί λογισμικό DNS για την αποθήκευση πληροφοριών σχετικά με τις διευθύνσεις τομέα. Υπάρχουν διάφορα επίπεδα - αυτά που ανήκουν σε κάθε ISP, Root (13 συνολικά παγκοσμίως), Τοπ επίπεδο επιπέδου (TLD, π.χ. ".com") και διακομιστές DNS επιπέδου τομέα.
  • Όνομα τομέα : ο τομέας (παράδειγμα) σε συνδυασμό με το TLD (.com). Ο όρος «τομέας» χρησιμοποιείται συχνά συνώνυμα με το όνομα τομέα, αν και είναι διαφορετικοί. Όταν αγοράζετε έναν «τομέα» από έναν καταχωρητή ή έναν μεταπωλητή, αγοράζετε τα δικαιώματα για ένα συγκεκριμένο όνομα τομέα (example.com) και τυχόν υποτομείς που θέλετε να δημιουργήσετε (my-site.example.com, mail.example.com, και τα λοιπά).

Ροή ερωτημάτων υψηλού επιπέδου

Η ροή υψηλού επιπέδου του τι συμβαίνει όταν πληκτρολογείτε "example.com" στο πρόγραμμα περιήγησής σας μπορεί να απλοποιηθεί για την κατάργηση του λυκίσκου στους διακομιστές DNS ISP, Root και TLD όπως παρακάτω:

Ένας τομέας έχει συνήθως δύο ή περισσότερους διακομιστές ονομάτων, οι οποίοι περιέχουν εγγραφές που σχετίζονται με το όνομα τομέα (example.com).

Μπορούν να αποθηκευτούν πολλοί τύποι εγγραφών, οι περισσότεροι από τους οποίους μπορούν να έχουν πολλές καταχωρήσεις ανά τύπο:

  • A: Εγγραφές διευθύνσεων που αντιστοιχίζουν το όνομα τομέα σε μια διεύθυνση IP
  • CNAME: Εγγραφή κανονικού ονόματος. Χρησιμοποιείται για ψευδώνυμο ένα όνομα τομέα (ή όνομα υποτομέα) σε άλλο. Θα το εξετάσουμε με περισσότερες λεπτομέρειες αργότερα.
  • MX: Εγγραφές eXchange αλληλογραφίας που λένε στους πράκτορες παράδοσης email πού πρέπει να παραδώσουν το email σας
  • TXT: ευέλικτες εγγραφές κειμένου, για αποθήκευση συμβολοσειρών για διάφορες χρήσεις
  • SOA: η μοναδική εγγραφή Αρχής Αρχής διατηρείται στο ανώτερο επίπεδο του τομέα Περιέχει συγκεκριμένες απαιτούμενες πληροφορίες σχετικά με τον τομέα, για παράδειγμα τον κύριο διακομιστή ονομάτων του
  • NS: Οι διακομιστές ονομάτων που σχετίζονται με τον τομέα

Όταν η συσκευή σας στέλνει ένα ερώτημα που φτάνει σε έναν διακομιστή ονομάτων, ο διακομιστής αναζητά στον κόμβο εγγραφής του τομέα για μια Aεγγραφή και τη σχετική αποθηκευμένη διεύθυνση IP (example.com: 93.184.216.34). Στη συνέχεια επιστρέφεται στη συσκευή, για να χρησιμοποιηθεί για την αποστολή αιτήματος στον σωστό διακομιστή ιστού για την ανάκτηση της ζητούμενης ιστοσελίδας ή του πόρου.

Χρησιμοποιώντας το "dig"

dig( domain information groper ) είναι ένα εργαλείο γραμμής εντολών για την αναζήτηση διακομιστών DNS. Αυτή η εντολή χρησιμοποιείται γενικά για την αντιμετώπιση προβλημάτων ή ως τώρα για να κατανοήσετε περισσότερα σχετικά με τη ρύθμιση ενός συστήματος.

$ dig example.comοδηγεί σε μια μακρά απόκριση που εκτυπώνεται στο τερματικό, η προεπιλεγμένη έξοδος που περιγράφεται λεπτομερώς εδώ, για την οποία μας ενδιαφέρει ANSWER SECTION.

;; ANSWER SECTION: example.com. 72703 IN A 93.184.216.34

Και εκεί πηγαίνουμε, μπορούμε να δούμε ότι example.comεπιστρέφει ένα Aρεκόρ 93.184.216.34. Μερικές φορές οι τομείς θα έχουν περισσότερες από μία Aεγγραφές, εάν περισσότεροι από ένας διακομιστές ιστού μπορούν να παρέχουν τις απαραίτητες πληροφορίες.

Υπάρχουν περισσότερα! Αν δοκιμάσετε μερικά άλλα παραδείγματα, μπορούμε να δούμε σύντομα ότι εμφανίζεται ένα άλλο κοινό ρεκόρ: CNAME.

$ dig www.skyscanner.net:

;; ANSWER SECTION: www.skyscanner.net. 169 IN CNAME www.skyscanner.net.edgekey.net. www.skyscanner.net.edgekey.net. 5639 IN CNAME e11316.a.akamaiedge.net. e11316.a.akamaiedge.net. 20 IN A 23.217.6.192
www.skyscanner.net.edgekey.net. 5639 IN CNAME e11316.a.akamaiedge.net.
e11316.a.akamaiedge.net. 20 IN A 23.217.6.192

Η χρήση της +shortσημαίας μας επιτρέπει να δούμε ξεκάθαρα τη διαδρομή που σχηματίζεται:

$ dig www.skyscanner.net +short

www.skyscanner.net.edgekey.net. e11316.a.akamaiedge.net. 23.217.6.192

CNAME

Μια CNAMEεγγραφή επιτρέπει σε ένα όνομα τομέα να χρησιμοποιείται ως ψευδώνυμο για έναν άλλο κανονικό (αληθινό) τομέα.

Όταν ο διακομιστής DNS επιστρέφει μια CNAMEεγγραφή, δεν θα την επιστρέψει στον πελάτη. Αντίθετα, θα αναζητήσει ξανά το όνομα τομέα που επέστρεψε και με τη σειρά του θα επιστρέψει τη Aδιεύθυνση IP της εγγραφής. Αυτή η αλυσίδα μπορεί να συνεχίσει CNAMEσε βάθος πολλών επιπέδων, αλλά στη συνέχεια υποφέρει μικρές επιτυχίες απόδοσης από πολλές αναζητήσεις πριν πραγματοποιηθεί η προσωρινή αποθήκευση.

Ένα απλό παράδειγμα αυτού θα μπορούσε να είναι αν έχετε διακομιστή όπου διατηρείτε όλες τις φωτογραφίες σας. Μπορείτε κανονικά να έχετε πρόσβαση σε αυτό photos.example.com. Ωστόσο, μπορεί επίσης να θέλετε να επιτρέπεται η πρόσβαση μέσω photographs.example.com. Ένας τρόπος για να γίνει αυτό δυνατό είναι να προσθέσετε ένα CNAMEαρχείο ότι τα σημεία photographsγια να photos. Αυτό σημαίνει ότι όταν κάποιος επισκέπτεται photographs.example.comθα έχει το ίδιο περιεχόμενο με photos.example.com.

Χρησιμοποιώντας το ερώτημα $ dig photographs.example.comθα δούμε:

photographs.example.com IN CNAME photos.example.com photos.example.com IN A xx.xxx.x.xxx

Είναι σημαντικό να σημειωθεί ότι το CNAMEκομμάτι είναι στη δεξιά πλευρά. Η αριστερή πλευρά είναι το ψευδώνυμο όνομα ή ετικέτα.

Μια άλλη κοινή χρήση είναι για τον wwwυποτομέα. Έχοντας αγοράσει example.comπιθανώς θέλετε και οι χρήστες που πληκτρολογούν www.example.comνα βλέπουν το ίδιο περιεχόμενο.

Αξίζει να σημειωθεί εδώ που example.comμπορεί να ονομαστεί κορυφή, root ή γυμνό όνομα τομέα.

Μια επιλογή θα ήταν να δημιουργήσετε μια άλλη Aεγγραφή, δείχνοντας την ίδια διεύθυνση IP όπως για example.com. Αυτό είναι απολύτως έγκυρο, και αυτό κάνει το πραγματικό example.com, αλλά δεν κλιμακώνεται καλά. Τι συμβαίνει εάν πρέπει να ενημερώσετε τη διεύθυνση IP που example.comδείχνει; Θα χρειαστεί επίσης να το ενημερώσετε για τον wwwυποτομέα και για οποιονδήποτε άλλο χρησιμοποιείτε.

Εάν μια CNAMEεγγραφή χρησιμοποιήθηκε για ψευδώνυμο www.example.comγια να δείξει, example.comτότε μόνο ο ριζικός τομέας θα έπρεπε να ενημερωθεί, όπως δείχνουν όλοι οι άλλοι κόμβοι.

Περιορισμοί CNAME

Τη στιγμή που γράφτηκαν τα πρότυπα DNS, ορισμένοι κανόνες καθορίστηκαν για να διέπουν τη χρήση τους. Τα RFC 1912 και RFC 2181 ορίζουν ότι:

  • SOAκαι οι NSεγγραφές είναι υποχρεωτικές να υπάρχουν στον ριζικό τομέα
  • CNAMEαρχεία μπορεί να υπάρξει μόνο ως ενιαία αρχεία και δεν μπορεί να συνδυαστεί με οποιαδήποτε άλλη εγγραφή πόρου (DNSSEC SIG, NXTκαι KEY RRαρχεία εξαιρούμενα)

Αυτό αποκλείει CNAMEτη χρήση στον ριζικό τομέα, καθώς οι δύο κανόνες θα έρχονται σε αντίθεση μεταξύ τους.

Αυτό που είναι σημαντικό εδώ είναι ότι πρόκειται για συμβατικό περιορισμό και όχι τεχνικό. Είναι δυνατή η χρήση του a CNAMEστο root, αλλά μπορεί να οδηγήσει σε απροσδόκητα σφάλματα, καθώς παραβιάζει το αναμενόμενο συμβόλαιο συμπεριφοράς.

Ένα παράδειγμα αυτού εξηγείται από το Cloudflare, περιγράφοντας τα προβλήματα που αντιμετώπισαν με τους διακομιστές αλληλογραφίας του Microsoft Exchange μετά τη χρήση του CNAMEστον ριζικό τομέα τους:

Οι τομείς γενικά ορίζουν τους διακομιστές που χειρίζονται το email τους μέσω αυτού που είναι γνωστό ως MX Record. Το πρόβλημα ήταν ότι οι διακομιστές Exchange… μπορούσαν να παραλάβουν το CNAME στη ριζική εγγραφή και, στη συνέχεια, να μην τηρούν σωστά το σύνολο CNAME στην εγγραφή MX. Δεν μπορείτε να κατηγορήσετε το Exchange. Λειτουργούσαν σύμφωνα με τις παραδοχές που καθορίζονται από τις προδιαγραφές DNS.

Here you see the downside that can appear in several server softwares or libraries. Because a standard is in place for a CNAME to be the only record at a node, no other records are looked for. All other records will be silently ignored, without warning or error messages. Even if an MX record was set to receive email, the MX will be ignored as if it doesn’t exist because the CNAME is evaluated first. The same is true if there were an A record: the CNAME would take precedence and the A record would not be read.

The modern internet

So why is this a problem? Why would you ever want to use a CNAME for your root domain anyway? Surely that is the end of the path when looking for the IP address of the web server hosting your content?

In the modern internet landscape, that is no longer the case. The world is very different from when the DNS standards were written.

You may choose to use a Platform as a Service (PaaS) provider like Heroku and store content on their web servers. You control the content, but not the infrastructure, and the PaaS provider does the heavy lifting of the network maintenance. They typically provide you with a URL (my-app.herokuapp.com) that is a subdomain of their root domain, and you can view the IP addresses for the web server(s) your content is on. But these are entirely under the PaaS provider’s control, and will change without warning.

The scale and frequency of backend changes made by the PaaS provider can make it hard to maintain your root domain A record pointing at a single IP address. Ideally you would wish to do this:

example.com IN CNAME my-app.herokuapp.com.www.example.com IN CNAME my-app.herokuapp.com.example.com IN CNAME my-app.herokuapp.com. www.example.com IN CNAME my-app.herokuapp.com.

to allow Heroku (or your chosen host provider) to manage updating the A record that the CNAME points to without any changes made on your side. However, as we now know, this breaks the DNS specification, so is a very bad idea.

It is possible to simply implement a 301/302 redirect from example.com to www.example.com. However, that instruction takes place either on the web server (so still having the problem of needing to use a fixed A record in DNS to point to that web server), or a custom DNS provider redirect (that suffers complications with HTTPS).

This also has the side effect of changing the domain that you see in the URL bar, which you may not want. This method is intended for when your website has permanently moved, or when you’re trying to preserve SEO rankings, rather than solving our problem of pointing to a complex changing backend in a scaleable way.

The solution

Several DNS providers have now developed custom solutions to work around this problem, including:

  • ALIAS at DNSimple
  • ANAME at DNS Made Easy
  • ANAME at easyDNS
  • CNAME (virtual) at CloudFlare

These are all virtual record types that provide CNAME like behaviour, with none of the downsides. The exact implementation can differ, but at a high level when the DNS server sees one of these virtual record types, it acts as a DNS resolver. It follows the chain created by the alias until it resolves at an A record (or records) and returns these A records to the DNS server. This ‘flattens’ the CNAME chain into the A record(s) returned, and is indistinguishable to the sent query. The query sees only a pure A record, which doesn’t break the DNS specification, and doesn’t have any of the disadvantages of a CNAME.

Αυτές οι εικονικές εγγραφές μπορούν να παραμείνουν δίπλα σε άλλες εγγραφές στη ρίζα χωρίς φόβο για ακούσιες συμπεριφορές. Ανάλογα με τη μέθοδο ανάλυσης DNS του παρόχου κατά την παρακολούθηση της CNAMEαλυσίδας, μπορεί επίσης να έχουν οφέλη απόδοσης από την προσωρινή αποθήκευση προηγούμενων αναζητήσεων.

Για μια ρύθμιση DNSimple, τότε θα διαμορφώσουμε όπως παρακάτω. Αυτή η λύση έχει όλα τα πλεονεκτήματα του domain name aliasing και κανένας από τους κινδύνους από τη χρήση του σε επίπεδο ρίζας.

example.com IN ALIAS my-app.herokuapp.com.www.example.com IN CNAME my-app.herokuapp.com.

Ευχαριστώ για την ανάγνωση! ;

Όπως πάντα, ανοίξτε τυχόν διορθώσεις ή επιπλέον σημεία.

Πόροι

  • Τι είναι ένας διακομιστής DNS
  • Ρύθμιση διακομιστή ονόματος DNS
  • DNS Απλές σελίδες υποστήριξης και ιστολόγιο ALIAS
  • Υποστήριξη Cloudflare και ιστολόγιο CNAME
  • dig Πως να
  • Αρκετές μεγάλες θέσεις Stack Overflow ή StackExchange
  • Καλά γραμμένες εγγραφές στη Wikipedia
  • Netlify blog «Προς www ή όχι www»