Warum das Stammverzeichnis einer Domain kein CNAME sein kann - und andere Details zum DNS

Dieser Beitrag wird die obige Frage verwenden , um zu erkunden DNS, dig, AAufzeichnungen, CNAMEAufzeichnungen und ALIAS/ANAMEAufzeichnungen aus einem Anfänger Perspektive. Also lasst uns anfangen.

Zunächst einige Definitionen

  • Domain Name System (DNS): Das Gesamtsystem zum Konvertieren eines denkwürdigen menschlichen Domainnamens (example.com) in eine IP-Adresse (93.184.216.34). Die IP-Adresse stammt von einem Server, üblicherweise einem Webserver, auf dem die zum Anzeigen einer Webseite erforderlichen Dateien gespeichert sind.
  • DNS-Server (auch als Nameserver oder Nameserver bezeichnet): Verwendet DNS-Software zum Speichern von Informationen zu Domänenadressen. Es gibt mehrere Ebenen - die zu jedem ISP, Root (insgesamt 13 weltweit), Top Level Domain (TLD, z. B. '.com') und Domain Level DNS-Servern gehören.
  • Domain - Name : die Domäne (Beispiel) in Kombination mit der TLD (.com). Der Begriff "Domain" wird häufig synonym mit dem Domainnamen verwendet, obwohl sie unterschiedlich sind. Wenn Sie eine 'Domain' von einem Registrar oder Reseller kaufen, erwerben Sie die Rechte an einem bestimmten Domainnamen (example.com) und allen Subdomains, die Sie erstellen möchten (my-site.example.com, mail.example.com, etc).

Abfragefluss auf hoher Ebene

Der allgemeine Ablauf dessen, was passiert, wenn Sie "example.com" in Ihren Browser eingeben, kann vereinfacht werden, um die Sprünge zu den ISP-, Root- und TLD-DNS-Servern wie folgt zu entfernen:

Eine Domain verfügt normalerweise über zwei oder mehr Nameserver, die Datensätze zum Domainnamen enthalten (example.com).

Es können viele Arten von Datensätzen gespeichert werden, von denen die meisten mehrere Einträge pro Typ haben können:

  • A: Adressdatensätze, die den Domänennamen einer IP-Adresse zuordnen
  • CNAME: Kanonischer Namensdatensatz. Wird verwendet, um einen Domainnamen (oder Subdomainnamen) mit einem anderen zu aliasen. Wir werden uns das später genauer ansehen.
  • MX: Mail eXchange-Datensätze, die E-Mail-Zustellern mitteilen, wo sie Ihre E-Mail zustellen sollen
  • TXT: Flexible Textdatensätze zum Speichern von Zeichenfolgen für eine Vielzahl von Verwendungszwecken
  • SOA: Singular Start of Authority-Datensatz auf der obersten Ebene der Domain. Enthält bestimmte erforderliche Informationen zur Domäne, z. B. den primären Nameserver
  • NS: Die der Domäne zugeordneten Nameserver

Wenn Ihr Gerät eine Abfrage sendet, die einen Nameserver erreicht, sucht der Server im Datensatzknoten der Domäne nach einem ADatensatz und der zugehörigen gespeicherten IP-Adresse (example.com: 93.184.216.34). Diese wird dann an das Gerät zurückgegeben, um eine Anforderung an den richtigen Webserver zu senden, um die angeforderte Webseite oder Ressource abzurufen.

Mit 'dig'

dig( Domain Information Groper ) ist ein Befehlszeilentool zum Abfragen von DNS-Servern. Dieser Befehl wird im Allgemeinen zur Fehlerbehebung oder wie bisher verwendet, um mehr über die Einrichtung eines Systems zu erfahren.

$ dig example.comDies führt zu einer langen Antwort, die an das Terminal gedruckt wird. Die hier beschriebene Standardausgabe interessiert uns für die ANSWER SECTION.

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

Und los geht's, wir können sehen, dass example.comeine AAufzeichnung von zurückgibt 93.184.216.34. Manchmal haben Domänen mehr als einen ADatensatz, wenn mehr als ein Webserver die erforderlichen Informationen bereitstellen kann.

Es gibt mehr! Wenn wir einige andere Beispiele ausprobieren, können wir bald sehen, dass ein weiterer gemeinsamer Datensatz erscheint : 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

Durch die Verwendung der +shortFlagge können wir den gebildeten Pfad klar erkennen:

$ dig www.skyscanner.net +short

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

CNAME

Mit einem CNAMEDatensatz kann ein Domänenname als Alias ​​für eine andere kanonische (wahre) Domäne verwendet werden.

Wenn der DNS-Server einen Eintrag zurückgibt CNAME, gibt er diesen nicht an den Client zurück. Vielmehr wird der zurückgegebene Domainname erneut nachgeschlagen und Adie IP-Adresse des Datensatzes zurückgegeben. Diese Kette kann viele CNAMEEbenen tief fortgesetzt werden, erleidet dann jedoch geringfügige Leistungseinbußen durch mehrere Suchvorgänge, bevor das Caching stattfindet.

Ein einfaches Beispiel hierfür könnte sein, wenn Sie einen Server haben, auf dem Sie alle Ihre Fotos aufbewahren. Sie können normalerweise über darauf zugreifen photos.example.com. Möglicherweise möchten Sie jedoch auch, dass der Zugriff über möglich ist photographs.example.com. Eine Möglichkeit , dies möglich zu machen , ist eine hinzuzufügen CNAMEAufzeichnung , dass Punkte photographsauf photos. Dies bedeutet, dass jemand, der ihn besucht photographs.example.com, denselben Inhalt erhält wie photos.example.com.

Mit der Abfrage $ dig photographs.example.comwürden wir sehen:

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

Es ist wichtig zu beachten, dass dies das CNAMEStück auf der rechten Seite ist. Die linke Seite ist der Aliasname oder die Bezeichnung.

Eine weitere häufige Verwendung ist die wwwSubdomain. Nach dem Kauf example.commöchten Sie wahrscheinlich auch, dass Benutzer, die eingeben www.example.com, denselben Inhalt sehen.

Es ist erwähnenswert, dass example.comdies als Apex-, Root- oder nackter Domainname bezeichnet werden kann.

Eine Möglichkeit wäre, einen anderen ADatensatz einzurichten , der auf dieselbe IP-Adresse wie für verweist example.com. Dies ist völlig gültig und das, was der Real example.comtut, aber es skaliert nicht gut. Was passiert, wenn Sie die IP-Adresse aktualisieren müssen, auf die example.comverweist? Sie müssten es auch für die wwwSubdomain und alle anderen, die Sie möglicherweise verwenden , aktualisieren .

Wenn ein CNAMEDatensatz als Alias www.example.comfür example.comden Verweis verwendet würde, müsste nur die Stammdomäne aktualisiert werden, da alle anderen Knoten darauf verweisen.

CNAME-Einschränkungen

Zu der Zeit, als die DNS-Standards geschrieben wurden, wurden einige Regeln festgelegt, um ihre Verwendung zu regeln. RFC 1912 und RFC 2181 legen Folgendes fest:

  • SOAund NSDatensätze müssen in der Stammdomäne vorhanden sein
  • CNAMEDatensätze können nur als einzelne Datensätze vorhanden sind und nicht mit anderen Ressourceneintrag (DNSSEC kombiniert werden können SIG, NXTund KEY RRAufzeichnungen ausgenommen)

Dies schließt eine CNAMEVerwendung in der Stammdomäne aus, da sich die beiden Regeln widersprechen würden.

Wichtig ist hierbei, dass dies eine vertragliche Beschränkung ist, keine technische. Es ist möglich, a CNAMEan der Wurzel zu verwenden, dies kann jedoch zu unerwarteten Fehlern führen, da der erwartete Verhaltensvertrag verletzt wird.

Ein Beispiel hierfür ist Cloudflare, in dem Probleme beschrieben werden, die bei Microsoft Exchange-Mailservern aufgetreten sind, nachdem sie a CNAMEin ihrer Stammdomäne verwendet haben:

Domänen bezeichnen im Allgemeinen die Server, die ihre E-Mails über einen sogenannten MX-Datensatz verarbeiten. Das Problem war, dass Exchange-Server… den CNAME im Stammdatensatz abrufen und dann den im MX-Datensatz festgelegten CNAME nicht ordnungsgemäß berücksichtigen konnten. Sie können Exchange nicht wirklich beschuldigen. Sie arbeiteten unter den in der DNS-Spezifikation festgelegten Annahmen.

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.

These virtual records can sit alongside other records at the root without any fear of unintended behaviours. Depending on the provider’s method of DNS resolution when following the CNAME chain, they may also have performance benefits from caching previous lookups.

For a DNSimple setup, we would then configure as below. This solution has all the advantages of domain name aliasing, and none of the risks of using it at root level.

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

Thanks for reading! ?

As always, open to any corrections or additional points.

Resources

  • What is a DNS Server
  • Set Up a DNS Name Server
  • DNSimple support pages and ALIAS blog
  • Cloudflare support and CNAME blog
  • dig HowTo
  • Several great Stack Overflow or StackExchange posts
  • Well written Wikipedia entries
  • Netlify blog ‘To www or not www’