This is a Canonical Question about CNAMEs at the apices (or roots) of zones
It's relatively common knowledge that CNAME
records at the apex of a domain are a taboo practice.
Example:
example.com. IN CNAME ithurts.example.net.
In a best case scenario nameserver software might refuse to load the configuration, and in the worst case it might accept this configuration and invalidate the configuration for example.com.
Recently I had a webhosting company pass instructions to a business unit that we needed to CNAME the apex of our domain to a new record. Knowing that this would be a suicide config when fed to BIND, I advised them that we would not be able to comply and that this was bunk advice in general. The webhosting company took the stance that it is not outright forbidden by standard defining RFCs and that their software supports it. If we could not CNAME the apex, their advice was to have no apex record at all and they would not provide a redirecting webserver. ...What?
Most of us know that RFC1912 insists that A CNAME record is not allowed to coexist with any other data.
, but let's be honest with ourselves here, that RFC is only Informational. The closest I know to verbiage that forbids the practice is from RFC1034:
If a CNAME RR is present at a node, no other data should be present; this ensures that the data for a canonical name and its aliases cannot be different.
Unfortunately I've been in the industry long enough to know that "should not" is not the same as "must not", and that's enough rope for most software designers to hang themselves with. Knowing that anything short of a concise link to a slam dunk would be a waste of my time, I ended up letting the company get away with a scolding for recommending configurations that could break commonly used software without proper disclosure.
This brings us to the Q&A. For once I'd like us to get really technical about the insanity of apex CNAMEs, and not skirt around the issue like we usually do when someone posts on the subject. RFC1912 is off limits, as are any other Informational RFC applicable here that I didn't think of. Let's shut this baby down.
CNAME
records were originally created to allow multiple names that provide the same resource to be aliased to a single "canonical name" for the resource. With the advent of name based virtual hosting, it has instead become commonplace to use them as a generic form of IP address aliasing. Unfortunately, most people who come from a web hosting background expectCNAME
records to indicate equivalence in the DNS, which has never been the intent. The apex contains record types which are clearly not used in the identification of a canonical host resource (NS
,SOA
), which cannot be aliased without breaking the standard at a fundamental level. (particularly in regards to zone cuts)Unfortunately, the original DNS standard was written before the standards governing bodies realized that explicit verbiage was necessary to define consistent behavior (RFC 2119). It was necessary to create RFC 2181 to clarify several corner cases due to vague wording, and the updated verbiage makes it clearer that a
CNAME
cannot be used to achieve apex aliasing without breaking the standard.This establishes that
SOA
andNS
records are mandatory, but it says nothing aboutA
or other types appearing here. It may seem superfluous that I quote this then, but it will become more relevant in a moment.RFC 1034 was somewhat vague about the problems that can arise when a
CNAME
exists alongside other record types. RFC 2181 removes the ambiguity and explicitly states the record types that are allowed to exist alongside them:"alias name" in this context is referring to the left hand side of the
CNAME
record. The bulleted list makes it explicitly clear that aSOA
,NS
, andA
records cannot be seen at a node where aCNAME
also appears. When we combine this with section 6.1, it is impossible for aCNAME
to exist at the apex as it would have to live alongside mandatorySOA
andNS
records.(This seems to do the job, but if someone has a shorter path to proof please give a crack at it.)
Update:
It seems that the more recent confusion is coming from Cloudflare's recent decision to allow an illegal CNAME record to be defined at the apex of domains, for which they will synthesize A records. "RFC compliant" as described by the linked article refers to the fact that the records synthesized by Cloudflare will play nicely with DNS. This does not change the fact that it is a completely custom behavior.
In my opinion this is a disservice to the larger DNS community: it is not in fact a CNAME record, and it misleads people into believing that other software is deficient for not allowing it. (as my question demonstrates)
June 2022 Update
New
SVCB
andHTTPS
resource records enable aliasing of apex domains and facilitate lookups for connecting to services like HTTP origins. Many DNS providers and browsers already support them, so it seems this will be the de facto standard one the spec is finalized.Resources
The Internet Systems Consortium recently posted a write-up on CNAME at the apex of a zone, why this restriction exists, and a number of alternatives. This is not likely to change anytime soon, sadly:
But there's hope:
If you are redirecting an entire zone, you should use DNAME. According to RFC 6672,